• C++ MFC窗口与WPF 窗口的相互嵌套


    C++ MFC窗口与WPF 窗口的相互嵌套

    1.WPF中嵌入MFC 窗口

    步骤如下:
    a.新建MFC动态库,编写创建窗口的外部导出函数

    extern "C"
    {
    	extern __declspec(dllexport) void  CreateMFCDlg(HWND hwnd);
    };
    
    • 1
    • 2
    • 3
    • 4
    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    b.WPF项目界面添加WindowsFormsHost,用于调用WinForm控件
    (WPF控件没有直接获取到控件的句柄,WinForm控件可获取控件绑定的窗口句柄)

     
         
    
    
    • 1
    • 2
    • 3

    c.初始化时传入窗口句柄,实现窗口的显示

     CallExportFun.CreateMFCDlg(windPanel.Handle.ToInt32());
    
    • 1

    运行结果如下:
    在这里插入图片描述

    2.MFC中嵌入WPF窗口

    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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在MFC窗口函数InitInstance()中调用

    	::GetHwnd();
    	if (CHostWPFWnd::hostedWnd)
    	{
    		CHostWPFWnd::hostedWnd->ShowDialog();
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5

    运行结果如下:

    在这里插入图片描述

  • 相关阅读:
    新年学新语言Go之四
    字节跳动后端面经
    DevOps推广实践总结
    Vue2进阶篇-组件间通信的6钟方式
    unity 协程
    Vue.js 框架源码与进阶 - Virtual DOM 的实现原理
    分布式搜索引擎elasticsearch(一)
    顶级网络安全预测:近三分之一的国家将在三年内规范勒索软件响应
    2023全球数字贸易创新大赛9-12
    基于LangChain的LLM应用开发3——记忆
  • 原文地址:https://blog.csdn.net/baidu_24565387/article/details/126309049