欢迎来到天天文库
浏览记录
ID:11128801
大小:477.00 KB
页数:11页
时间:2018-07-10
《在winform中嵌入mfc对话框设计实现》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Winform中嵌入MFC对话框设计一.改造MFC应用程序要将MFC的对话框嵌入到Winform中,我们的对话框必须运行在MFC的MDI程序中,因此我们一开始就必须建立一个MFC的应用程序,然后再将其改造成MFC的动态连接库。如果我们一开始就建立MFC的动态连接库的话,还要自己添加MFC的MDI框架类,比较的麻烦。如图:对于MFC的类来说(例如CDocument,CView,CMainFrame)必须依赖于CWinApp才能初始化和运行。因此我们只能将整个应用程序嵌入到winform的应用程序中。如何实现呢?那就需要.net的托管C
2、++的支持了。我们在刚才改造好的MFC_App_View.dll(本例中改造的库)中,混入一些托管的C++类定义一些接口,通过这些接口来和Winform中的类进行通讯。这里我先将要添加的类以及接口列出来(包括一些非托管类):类对应文件CCmdUIHandlerCCmdUIHandler.h,CCmdUIHandler.cppICmdUITargetICmdUiTarget.hCLayoutViewCLayoutView.h//非托管类CDocManagerExDocManagerEx.h,DocManagerEx.cpp//非托管类
3、IFrameworkIFramework.hIWndManagerIwndManager.hIFrameworkImplMfcAppAdapter.hMfcAppAdapterMfcAppAdapter.h,MfcAppAdapter.cppMfcCommandMfcCommand.hCMFCTempCMFCTemp.h,CMFCTemp.cpp//非托管类CNotifyHookCnotifyHook.h,CnotifyHook.cpp//非托管类ViewCtrlViewCtrl.h,ViewCtrl.cpp添加了上述类之后,我们的
4、一个混合的Dll就初步改造完成了。为了使托管代码和非托管代码的混合Dll能够安全的运行,我们必须对Dll的属性进行一些相应的设置(如果不设置,编译时也会通不过),具体设置详情如下图:另外对于托管的C++类我们必须让他受到公共语言运行库的支持,在对应类的.cpp文件的属性中进行如下设置,如下图:由于ViewCtrl类是继承自WinformControl,必须添加命名空间的引用,因此在项目属性的通用属性中必须添加对应命名空间的引用,如下图:注意:在设置此项属性时,有时我们点击添加新引用按钮时,在弹出的对话框中找不到任何公共语言运行库的类
5、,这是因为编译器并不知道我们使用了托管C++类。我们可以先将Dll设为公共语言运行库支持,再来添加引用就可以了,添加完后必须记得将Dll设为不受公共语言运行库的支持,不然编译通不过。二.混合Dll的结构前面完成的只是宏观上的一些类的添加,及库的设置,现在要做的就是将Dll中的一些具体类进行修改,先看Dll的结构图:从上图还不能够很清晰的看到混合Dll是如何与winform进行交互的,但是我们可以知道,在MFC程序嵌入到winform中时MfcAppAdapter起着很中要的作用。在MfcAppAdapter中保存了Iframewor
6、kImpl(winfrom的应用程序框架),IwndManager(用控制MFC程序的激活),同时还有AttachApplication(IWndManager^wndManager)负责将MFC程序附加到Winform程序中,在MfcAppAdapter销毁时,将MFC程序从winform中退出。1.MfcAppAdapter为了辅助MfcAppAdapter的AttachApplication的实现,我们要在MFC_App_View.cpp中定义两个全局函数:BOOLAttachApplication(IFramework*fr
7、amework){AFX_MANAGE_STATE(AfxGetStaticModuleState());//获取当前模块状态CMFC_App_ViewApp*app=(CMFC_App_ViewApp*)AfxGetApp();returnapp->AttachApplication(framework);}BOOLDetachApplication(){AFX_MANAGE_STATE(AfxGetStaticModuleState());CMFC_App_ViewApp*app=(CMFC_App_ViewApp*)AfxGe
8、tApp();returnapp->DetachApplication();}同时要对CMFC_App_ViewApp::InitInstance()函数进行一些修改,如下:BOOLCMFC_App_ViewApp::InitInst
此文档下载收益归作者所有