以 MFC 对话框的形式承载 Windows 窗体用户控件

MFC 提供模板类 CWinFormsDialog,以便可以在模式或无模式 MFC 对话框中承载 Windows 窗体用户控件 (UserControl)。 CWinFormsDialog 派生自 MFC 类 CDialog,因此对话框可以模式或无模式方式启动。

CWinFormsDialog 用来承载用户控件的过程类似于在 MFC 对话框中承载 Windows 窗体用户控件中所述的过程。 但是,CWinFormsDialog 管理用户控件的初始化和承载,以便无需手动对其进行编程。

创建 MFC 主机应用程序

  1. 创建一个 MFC 应用程序项目。

    在“文件”菜单上,选择“新建”,然后单击“项目”。 在“Visual C++”文件夹中,选择 “MFC 应用程序”。

    在“名称”框中,输入 MFC03 并将“解决方案”设置更改为“添加到解决方案”。单击“确定”

    在“MFC 应用程序向导”中,接受所有默认值,然后单击“完成”。 这会创建具有多个文档接口的 MFC 应用程序。

  2. 配置项目。

    在解决方案资源管理器中,右键单击“MFC03”项目节点,然后选择“属性”。 此时将出现“属性页”对话框。

    在“属性页”对话框中,选择“配置属性”>“常规”。 在“项目默认值”部分,将“公共语言运行时支持”设置为“公共语言运行时支持(/clr)”。 选择确定

  3. 添加对 .NET 控件的引用。

    在解决方案资源管理器中,右键单击“MFC03”项目节点,然后选择“添加”、“引用”。 在“属性页”中,单击“添加新引用”,选择“项目”选项卡下的 WindowsControlLibrary1,然后单击“确定”。 这将以 /FU 编译器选项的形式添加引用,以便程序进行编译;它还会将 WindowsControlLibrary1.dll 复制到 MFC03 项目目录中,以便程序运行。

  4. 在现有 #include 语句的末尾,将 #include <afxwinforms.h> 添加到 pch.h(Visual Studio 2017 及更早版本中的 stdafx.h)。

  5. 添加创建 CDialog 的子类的新类。

    右键单击项目名称并添加创建 CDialog 的子类的 MFC 类(名为 CHostForWinForm)。 由于不需要对话框资源,因此可以删除资源 ID(选择“资源视图”,展开“对话框”文件夹并删除 IDD_HOSTFORWINFORM 资源。然后,删除对代码中 ID 的任何引用。)。

  6. 将 CHostForWinForm.h and CHostForWinForm.cpp 文件中的 CDialog 替换为 CWinFormsDialog<WindowsControlLibrary1::UserControl1>

  7. 在 CHostForWinForm 类上调用 DoModal。

    在 MFC03.cpp 中,添加 #include "HostForWinForm.h"

    在 CMFC03App::InitInstance 定义中的 return 语句之前,添加:

    CHostForWinForm m_HostForWinForm;
    m_HostForWinForm.DoModal();
    
  8. 生成并运行该项目。

    “生成” 菜单上,单击 “生成解决方案”

    在“调试”菜单上,单击“开始执行(不调试)”

    接下来,将添加代码以监视 MFC 应用程序中 Windows 窗体控件的状态。

  9. 为 OnInitDialog 添加处理程序。

    显示“属性”窗口 (F4)。 在“类视图”中,选择 CHostForWinForm。 在“属性”窗口中,选择“替代”,然后在 OnInitDialog 的行中单击左侧列并选择“<添加>”。 这会将以下行添加到 CHostForWinForm.h:

    virtual BOOL OnInitDialog();
    
  10. 按如下所示定义 OnInitDialog(在 CHostForWinForm.cpp 中):

    BOOL CHostForWinForm::OnInitDialog() {
       CWinFormsDialog<WindowsControlLibrary1::UserControl1>::OnInitDialog();
       GetControl()->button1->Click += MAKE_DELEGATE(System::EventHandler, OnButton1);
       return TRUE;
    }
    
  11. 接下来,添加 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");
    }
    
  12. 生成并运行该项目。 单击 Windows 窗体上的按钮时,MFC 应用程序中的代码将运行。

    接下来,将添加代码,以从 MFC 代码中显示 Windows 窗体上的文本框中的值。

  13. 在 CHostForWinForm.h 中 CHostForWinForm 类的公共部分中,添加以下声明:

    CString m_sEditBoxOnWinForm;
    
  14. 在 CHostForWinForm.cpp 中的 DoDataExchange 定义中,将以下三行添加到函数末尾:

    if (pDX->m_bSaveAndValidate)
       m_sEditBoxOnWinForm = CString( GetControl()->textBox1->Text);
    else
       GetControl()->textBox1->Text = gcnew System::String(m_sEditBoxOnWinForm);
    
  15. 在 CHostForWinForm.cpp 中的 OnButton1 定义中,将以下三行添加到函数末尾:

    this->UpdateData(TRUE);
    System::String ^ z = gcnew System::String(m_sEditBoxOnWinForm);
    System::Windows::Forms::MessageBox::Show(z);
    
  16. 生成并运行该项目。

另请参阅

System.Windows.Forms.UserControl在 MFC 中使用 Windows 窗体用户控件