步骤如下:
a.新建MFC动态库,编写创建窗口的外部导出函数
extern "C"
{
extern __declspec(dllexport) void CreateMFCDlg(HWND hwnd);
};
extern "C" __declspec(dllexport) void CreateMFCDlg(HWND hwnd)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());//!!!一定要加上
MFCDlg* dlg = new MFCDlg;
dlg->Create(IDD_DIALOG1, CWnd::FromHandle(hwnd));
dlg->ShowWindow(SW_NORMAL);
}
b.WPF项目界面添加WindowsFormsHost,用于调用WinForm控件
(WPF控件没有直接获取到控件的句柄,WinForm控件可获取控件绑定的窗口句柄)
c.初始化时传入窗口句柄,实现窗口的显示
CallExportFun.CreateMFCDlg(windPanel.Handle.ToInt32());
运行结果如下:
a.新建WPF 类库项目,添加实际界面显示功能
b.创建MFC应用程序
在配置属性/高级/公告语音运行时支持 选择 公共语言运行时支持(/clr)
c.MFC应用程序添加WPF的相关dll引用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UWBlTyC9-1660298149222)(:storage\ad21e024-103c-4c19-950c-af85cb5d5a7d\fe24d07d.png)]
d.MFC应用程序添加WPF dll的项目引用
e.创建引入窗口类
using namespace System;
using namespace System::Windows;
using namespace System::Windows::Interop;
using namespace System::Runtime;
using namespace WPFWindow;
public ref class CHostWPFWnd
{
public:
CHostWPFWnd(void) {};
~CHostWPFWnd(void) {};
protected:
!CHostWPFWnd(void) {};
public:
static MainWindow^ hostedWnd;
static HWND hwnd;
};
HWND GetHwnd(HWND hwnd = NULL);
HWND GetHwnd(HWND hwnd)
{
CHostWPFWnd::hostedWnd = gcnew MainWindow();
WindowInteropHelper^ wih = gcnew WindowInteropHelper(CHostWPFWnd::hostedWnd);
wih->Owner = IntPtr(hwnd);
CHostWPFWnd::hwnd = (HWND)wih->Handle.ToPointer();
return CHostWPFWnd::hwnd;
}
在MFC窗口函数InitInstance()中调用
::GetHwnd();
if (CHostWPFWnd::hostedWnd)
{
CHostWPFWnd::hostedWnd->ShowDialog();
}
运行结果如下: