MFC 提供模板类 CWinFormsDialog
,使你能够在 MFC 对话框中(无论是模式还是无模式)托管 Windows 窗体用户控件(UserControl)。
CWinFormsDialog
派生自 MFC 类 CDialog
,因此对话框可以作为模式或无模式启动。
用于托管用户控件的过程 CWinFormsDialog
类似于 在 MFC 对话框中托管 Windows 窗体用户控件中所述的过程。 但是,CWinFormsDialog
管理用户控件的初始化和承载,以便无需手动对其进行编程。
创建 MFC 主机应用程序
创建一个 MFC 应用程序项目。
在“文件”菜单上,选择“新建”,然后单击“项目”。 在“Visual C++”文件夹中,选择 “MFC 应用程序”。
在 “名称 ”框中,输入
MFC03
并更改解决方案设置以 添加到解决方案。 单击 “确定” 。在“MFC 应用程序向导”中,接受所有默认值,然后单击“完成”。 这会创建具有多个文档接口的 MFC 应用程序。
配置项目。
在解决方案资源管理器中,右键单击“MFC03”项目节点,然后选择“属性”。 此时将出现“属性页”对话框。
在“属性页”对话框中,选择“配置属性”>“常规”。 在“项目默认值”部分,将“公共语言运行时支持”设置为“公共语言运行时支持(/clr)”。 选择确定。
添加对 .NET 控件的引用。
在解决方案资源管理器中,右键单击“MFC03”项目节点,然后选择“添加”、“引用”。 在“属性页”中,单击“添加新引用”,选择“项目”选项卡下的 WindowsControlLibrary1,然后单击“确定”。 这会以
/FU
编译器选项的形式添加一个引用,使程序可以编译;它还会将WindowsControlLibrary1.dll
复制到MFC03
项目目录中,使程序能够运行。在现有
#include <afxwinforms.h>
语句的末尾,将 添加到 pch.h(Visual Studio 2017 及更早版本中的 stdafx.h#include
)。添加创建
CDialog
的子类的新类。右键单击项目名称并添加子类
CDialog
的 MFC 类(称为CHostForWinForm
)。 由于不需要对话框资源,因此可以删除资源 ID(选择“资源视图”,展开“对话框”文件夹并删除IDD_HOSTFORWINFORM
资源。然后,删除对代码中 ID 的任何引用。)。使用
CWinFormsDialog<WindowsControlLibrary1::UserControl1>
替换CHostForWinForm.h
和CHostForWinForm.cpp
文件中的CDialog
。在
CHostForWinForm
类上调用DoModal
。在
MFC03.cpp
,添加#include "HostForWinForm.h"
。在定义
CMFC03App::InitInstance
中的 return 语句之前,添加:CHostForWinForm m_HostForWinForm; m_HostForWinForm.DoModal();
生成并运行该项目。
在 “生成” 菜单上,单击 “生成解决方案” 。
在“调试”菜单上,单击“开始执行(不调试)”。
接下来,将添加代码以监视 MFC 应用程序中 Windows 窗体控件的状态。
为
OnInitDialog
添加处理程序。显示“属性”窗口 (F4)。 在 类视图中,选择
CHostForWinForm
。 在 “属性” 窗口中,选择替代并在行OnInitDialog
中单击左侧列,然后选择“ < 添加 >”。 这会将以下行添加到CHostForWinForm.h
:virtual BOOL OnInitDialog();
定义
OnInitDialog
(inCHostForWinForm.cpp
) 如下所示:BOOL CHostForWinForm::OnInitDialog() { CWinFormsDialog<WindowsControlLibrary1::UserControl1>::OnInitDialog(); GetControl()->button1->Click += MAKE_DELEGATE(System::EventHandler, OnButton1); return TRUE; }
接下来添加
OnButton1
处理程序。 将以下行添加到CHostForWinForm.h
类的CHostForWinForm
公共部分:virtual void OnButton1( System::Object^ sender, System::EventArgs^ e ); BEGIN_DELEGATE_MAP( CHostForWinForm ) EVENT_DELEGATE_ENTRY( OnButton1, System::Object^, System::EventArgs^ ); END_DELEGATE_MAP()
在
CHostForWinForm.cpp
中添加此定义:void CHostForWinForm::OnButton1( System::Object^ sender, System::EventArgs^ e ) { System::Windows::Forms::MessageBox::Show("test"); }
生成并运行该项目。 单击 Windows 窗体上的按钮时,MFC 应用程序中的代码将运行。
接下来,将添加代码,以从 MFC 代码中显示 Windows 窗体上的文本框中的值。
在
CHostForWinForm.h
中类CHostForWinForm
的公共部分,添加以下声明:CString m_sEditBoxOnWinForm;
在
CHostForWinForm.cpp
中的DoDataExchange
定义中,将以下四行添加到函数末尾:if (pDX->m_bSaveAndValidate) m_sEditBoxOnWinForm = CString( GetControl()->textBox1->Text); else GetControl()->textBox1->Text = gcnew System::String(m_sEditBoxOnWinForm);
在
CHostForWinForm.cpp
中定义OnButton1
时,将以下三行添加到函数末尾:this->UpdateData(TRUE); System::String ^ z = gcnew System::String(m_sEditBoxOnWinForm); System::Windows::Forms::MessageBox::Show(z);
生成并运行该项目。