使用WindowsFormsHost实现WPF窗口中“镶嵌”MFC窗口

这个问题并不复杂,实际上就像把大象放进冰箱里一样简单:
1、创建一个MFC窗口;

创建一个MFC动态链接库MFCdll,添加一个CDialog类MyDlg,在MFCdll.h中声明导出函数(参看WPF导入MFC动态链接库函数)

extern “C” _declspec(dllexport) void WINAPI CreatMyDlgdll(HWND hWnd);

在MFCdll.cpp中创建并显示MyDlg对话框窗口

void WINAPI CreatMyDlgdll(HWND hWnd)
{
MyDlg *pMyDlg = new MyDlg;
pMyDlg->Create(IDD_MYDLG, CWnd::FromHandle(hWnd)); 
pMyDlg->ShowWindow(SW_NORMAL);
}

注意还有一个步骤,把MyDlg的style属性设置为child,如果设置为popup或者overlapped,窗口会弹出而不是“镶嵌”效果了。

2、WPF中放置承载MFC窗口的容器;

这一步是关键,在同一个解决方案中添加一个WPF项目,MainWindow.xmal中放置一个WindowsFormsHost控件,使用 WindowsFormsHost 元素可将 Windows 窗体控件放置到 WPF 元素或页面中。这样就可以在WindowsFormsHost 中放置一个Winform的pannel。

引入pannel程序集

xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"

WindowsFormsHost的Xaml代码

<WindowsFormHost Height="453"……>
<wf:Pannel x:Name="DynamicWinPanel" />
</WindowsFormHost>

3、建立WPF容器和MFC窗口之间的联系。

WPF 导入函数

[DllImport("MFCdll.dll")]
public static extern void CreatMyDlgdll(int hwnd);

在Button中显示MFC窗口

private void button1_Click(object sender, RoutedEventArgs e) 
{ 
int hwnd;
hwnd = DynamicWinPanel.Handle.ToInt32(); 
CreatMyDlgdll(hwnd);
}

实际上就是获取pannel的句柄传递到MFC中创建并显示对话框,运行效果如下:

使用WindowsFormsHost实现WPF窗口中“镶嵌”MFC窗口_第1张图片

你可能感兴趣的:(mfc,WPF)