WPFとWin 32のインタラクション(1)
2749 ワード
1、Win 32のボタンをWPFウィンドウに追加する
1)次のusing命令を追加する
using System.Windows.Interop;using System.Runtime.InteropServices;
2)Win 32 ButtonHostクラスの作成
3)WPFページでWin 32 ButtonHostクラスを使用
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;