2010-12-21 68 views
1

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

+1

请注意AirSpace问题。如果你想混合使用WPF和MFC视图,请阅读http://msdn.microsoft.com/en-us/library/aa970688.aspx。我们遇到了WPF和Winforms的问题,因此MFC可能会非常困难。所有最好的工作 – aqwert 2011-03-10 02:37:54

回答

1

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

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

在MFC托管WPF是简单地正确使用HwndSource类的问题(如果你不害怕使用托管C++,你可以创建一个很好的互操作层,避免在您的MFC项目/ CLR标志完全的。)

如果您尝试重置MDI应用程序,但您可以在WPF代码中使用任意位置托管各个帧(例如,使用Prism区域),则将您的MFC应用程序托管在WPF应用程序中会更棘手。 ,我最终手动清除了所有的MDI帧管理代码。

要做到这一点,我创建了我自己的CMultiDocTemplate派生类并重写了OpenDocumentFile()虚拟方法来提供我自己的开启行为。此方法手动创建了一个特殊的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父框架(搜索MFC CMDIChildWndMDIParent()什么的。)

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

+0

我已经摆脱了这个问题,通过使用IPC通道并作为外部进程托管在我的WPF中的MFC应用程序。我正在使用复制数据方法。 (类似于这个:http://www.codeproject.com/KB/threads/InterprocessCommunicator.aspx),但谢谢。 – Jordan 2011-03-10 13:42:32

相关问题