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