我正在为现有的MFC应用程序开发WPF前端(使用MVVM和Prism)。这个应用程序不会有太大的变化,因为它是单一的,并且没有任何类型的文档。是否有任何技术可以将这两个平台带入同一个内存空间(最佳选择)或允许它们同步通信(因为MFC应用程序绝不是线程安全的)?为了保持稳定性,我需要WPF是一个可执行文件。我试着将它作为一个DLL附加到MFC应用程序,但这会导致极度不稳定。我的WPF应用程序(带有MVVM,Prism)如何与单片MFC应用程序进行交互?
回答
您拥有的一个选项是直接在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 CMDIChildWnd
源MDIParent()
什么的。)
当然最后一步是更新CMyApp :: OnInitInstance()方法来使用专门的MultiDoc模板和子框架,而不是其他的。
我已经摆脱了这个问题,通过使用IPC通道并作为外部进程托管在我的WPF中的MFC应用程序。我正在使用复制数据方法。 (类似于这个:http://www.codeproject.com/KB/threads/InterprocessCommunicator.aspx),但谢谢。 – Jordan 2011-03-10 13:42:32
- 1. 如何使API与我的应用程序进行交互
- 2. 如何与AIR应用程序的Windows应用程序进行交互?
- 3. WPF应用程序 - MFC应用程序互操作
- 4. 如何从android应用程序与web应用程序进行交互?
- 5. 如何以编程方式与应用程序进行交互
- 6. 如何与外部应用程序的terraform进行交互?
- 7. 如何在MFC应用程序中交互式运行Flash?
- 8. 使用Android应用程序与Windows应用程序进行交互
- 9. 我的win表单应用程序如何与signalr交互
- 10. 如何将android应用程序与树莓派进行交互...?
- 11. 如何与其他应用程序进行交互
- 12. 如何使Java应用程序与网站进行交互
- 13. 使用MVVM模式的Wpf Prism应用程序架构
- 14. Joomla应用程序与移动应用程序的交互
- 15. 如何在我的Java应用程序中与C控制台应用程序进行交互
- 16. 如何从我的Java应用程序与控制台应用程序进行交互?
- 17. 使用WPF,MVVM和Prism构建应用程序
- 18. 从Mono应用程序与CLI应用程序交互
- 19. 与从Java应用程序调用的Powershell进程交互
- 20. 如何与我的应用程序中的键盘按钮进行交互?
- 21. 如何阻止WPF应用程序非交互式运行?
- 22. Java应用程序与命令行进行交互
- 23. 如何从我自己的应用程序与kerberos服务器进行交互
- 24. 与excel交互的winform应用程序
- 25. WPF Prism应用程序不关机
- 26. Node.js应用程序与外部程序进行交互的最佳方式
- 27. 是否可以从我的应用程序与iOS 5的Reminders应用程序进行交互?
- 28. UIWebView与SMS应用程序交互
- 29. 与Kivy嵌套/交互应用程序
- 30. 应用程序使用WPF和MFC都
请注意AirSpace问题。如果你想混合使用WPF和MFC视图,请阅读http://msdn.microsoft.com/en-us/library/aa970688.aspx。我们遇到了WPF和Winforms的问题,因此MFC可能会非常困难。所有最好的工作 – aqwert 2011-03-10 02:37:54