WPFとWin 32のインタラクション(1)

2749 ワード

1、Win 32のボタンをWPFウィンドウに追加する
1)次のusing命令を追加する
using System.Windows.Interop;using System.Runtime.InteropServices;
2)Win 32 ButtonHostクラスの作成
  public class Win32ButtonHost : HwndHost
    {               
        IntPtr hwndHost = IntPtr.Zero;
        IntPtr hwndButton = IntPtr.Zero;

        public int ButtonWidth = 0;
        public int ButtonHeight = 0;

        private const int WS_CHILD = 0X40000000;
        private const int WS_VISIBLE = 0X10000000;
        private const int WS_BORDER = 0X00800000;

        public Win32ButtonHost(int width, int height)
        {
            ButtonWidth = width;
            ButtonHeight = height;
        }
        //CreateWindowEx 
        [DllImport("user32.dll", EntryPoint = "CreateWindowEx", CharSet = CharSet.Auto)]
        internal static extern IntPtr CreateWindowEx(
            int dwExStyle,
            string lpszClassName,
            string lpszWindowName,
            int style,
            int x, int y,
            int width, int height,
            IntPtr hwndParent,
            IntPtr hMenu,
            IntPtr hInst,
            [MarshalAs(UnmanagedType.AsAny)] object pvParam
            );

        protected override HandleRef BuildWindowCore(HandleRef hwndParent)
        {
            hwndHost = CreateWindowEx(0, "static", "", WS_CHILD | WS_VISIBLE, 0, 0, ButtonWidth, ButtonHeight, hwndParent.Handle, IntPtr.Zero, IntPtr.Zero, 0);
            hwndButton = CreateWindowEx(0, "button", "Win32 Button", WS_CHILD | WS_VISIBLE | WS_BORDER, 0, 0, ButtonWidth, ButtonHeight, hwndHost, IntPtr.Zero, IntPtr.Zero, 0);
            return new HandleRef(this, hwndHost);
        }

        //DestoryWindow 
        [DllImport("user32.dll", EntryPoint = "BuildWindowCore", CharSet = CharSet.Auto)]
        internal static extern bool DestoryWindow(IntPtr hwnd);

    
        protected override void DestroyWindowCore(HandleRef hwnd)
        {
            DestoryWindow(hwnd.Handle);
        }
    }
    
 
3)WPFページでWin 32 ButtonHostクラスを使用
 
 <Grid>
        <Border x:Name="myBorder" Margin="20" BorderBrush="LightBlue"  BorderThickness="2"/>
    </Grid>
  Win32ButtonHost  win32ButtonHost= new Win32ButtonHost(100, 50);
   myBorder.Child = win32ButtonHost;