我的WPF应用程序(w / MVVM,Prism)如何与单片MFC应用程序交互?

时间:2010-12-21 15:10:06

标签: wpf mfc interop

我正在为现有的MFC应用程序开发WPF前端(使用MVVM和Prism)。这个应用程序不会发生重大变化,因为它是单片的,并且缺少任何类型的文档。是否有任何技术可以将这两个平台带入相同的内存空间(最佳选项)或允许它们同步通信(因为MFC应用程序绝不是线程安全的)?为了保持稳定性,我需要WPF是可执行文件。我已经尝试将它作为dll附加到MFC应用程序,但这会导致极端不稳定。

1 个答案:

答案 0 :(得分:1)

您拥有的一个选项是直接在WPF中托管您的MFC,或者按照WPF and Win32 Interoperation MSDN文章中的说明将WPF嵌入到您的MFC应用程序中。具体来说,请查看该文章顶部提到的两个演练。

我发现在您的MFC代码中嵌入WPF要比在WPF中重新托管MFC应用程序简单得多。

在MFC中托管WPF只是正确使用HwndSource类的问题(如果您不怕使用托管C ++,您可以创建一个漂亮的互操作层并完全避免MFC项目中的/ clr标志。 )

如果您尝试重新托管MDI应用程序,在WPF应用程序中托管MFC应用程序会比较复杂,但它允许您在WPF代码中的任何位置托管各个框架(例如,使用Prism区域)。最后,我最终手动剥离了所有MDI帧管理代码。

为此,我创建了自己的CMultiDocTemplate派生类,并覆盖OpenDocumentFile()虚拟方法以提供我自己的Frame-opening行为。此方法手动创建了一个特殊的CMDIChildWnd派生框架,我创建该框架覆盖了与MDI父框架窗口交互的任何方法,并将它们传递给基础CFrameWnd(绕过CMDIChildWnd )。

首先,创建框架的辅助函数对象(m_pFrameClass是上面描述的特殊CMDIChildWnd派生类)

HWND CreateHostedFrame(HWND父级)

CFrameWnd* pFrame = (CFrameWnd*)m_pFrameClass->CreateObject();

CWnd parentWnd;
parentWnd.Attach(parent);
pFrame->LoadFrame(resourceID, WS_CHILD, &parentWnd, pContext);
parentWnd.Detach();

return pFrame->m_hWnd;

然后重写DocTemplate方法(或创建框架的任何地方)

CHostedMultiDocTemplate :: OpenDocumentFile:

CDocument* pDocument = CreateNewDocument();

// the following is just for demo purposes.  Use your own mechanism
m_MyWpfShellOrSomething->PleaseCreateAHostedWindowUsing(&CreateHostedFrame);

InitialUpdateFrame(pFrame, pDocument, bMakeVisible);

return pDocument;

您的CMDIChildWnd派生类可能希望覆盖引用MDI父框架的任何内容(在CMDIChildWnd或其他内容中搜索MFC MDIParent()来源。)

当然,最后一步是更新CMyApp :: OnInitInstance()方法以使用专门的MultiDoc模板和子框架而不是其他框架。