如何:创建用户控件并将它承载在对话框中

本文中的步骤假定你正在创建基于对话框(CDialog 类)的 Microsoft 基础类 (MFC) 项目,但你也可以向现有 MFC 对话框添加对 Windows 窗体控件的支持。

创建 .NET 用户控件的步骤

  1. 创建一个名为 WindowsFormsControlLibrary1 的 Visual C# Windows 窗体控件库项目。

    在“文件”菜单上,单击“新建”,然后单击“项目”。 在 Visual C# 文件夹中,选择“Windows 窗体控件库”

    单击“确定WindowsFormsControlLibrary1”接受 项目名称。

    默认情况下,.NET 控件的名称将为 UserControl1

  2. 将子控件添加到 UserControl1

    在“工具箱”中,打开“所有Windows 窗体”列表。 将“按钮”控件拖到 UserControl1 设计图面。

    另请添加 TextBox 控件。

  3. 在“解决方案资源管理器”中,双击“UserControl1.Designer.cs”将其打开以供编辑。 将文本框声明和按钮从 private 更改为 public

  4. 生成项目。

    在“生成”菜单中,单击“生成解决方案”。

创建 MFC 主机应用程序

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

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

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

    在“MFC 应用程序向导”中,选择“基于对话框”作为“应用程序类型”。 接受剩余的默认设置,然后单击“完成”。 这会创建一个具有 MFC 对话框的 MFC 应用程序。

  2. 向 MFC 对话框添加占位符控件。

    在“视图”菜单上,单击“资源视图”。 在“资源视图”中,展开“Dialog”文件夹并双击“IDD_MFC01_DIALOG”。 对话框资源随即显示在“资源编辑器”中。

    在“工具箱”中,打开“对话框编辑器”列表。 将“静态文本”控件拖到对话框资源。 “静态文本”控件将用作 .NET Windows 窗体控件的占位符。 将其大小重设为大约 Windows 窗体控件的大小。

    在“属性”窗口中,将“静态文本”控件的“ID”更改为 IDC_CTRL1,并将“TabStop”属性更改为“True”。

  3. 配置公共语言运行时 (CLR) 支持的项目。

    在“解决方案资源管理器”中,右键单击 MFC01 项目节点,然后单击“属性”

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

    在“配置属性”下,展开“C/C++”并选择“常规”节点。 将“调试信息格式”设置为“程序数据库 (/Zi)”。

    选择“代码生成”节点。 将“启用最小重新生成”设置为“否(/Gm-)”。 还要将“基本运行时检查”设置为“默认”。

    单击“确定”应用更改。

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

    在“解决方案资源管理器”中,右键单击 MFC01 项目节点,然后依次单击“添加”和“引用”。 在“属性页”上,单击“添加新引用”,选择“项目”选项卡下的 WindowsFormsControlLibrary1,然后单击“确定”。 这会以 /FU 编译器选项的形式添加引用,以便程序能够进行编译。 它还将 WindowsFormsControlLibrary1.dll 的副本放入 \MFC01\ 项目文件夹中,这样程序就会运行。

  5. 在 Stdafx.h 中,找到以下行:

    #endif // _AFX_NO_AFXCMN_SUPPORT
    

    在它上面添加以下行:

    #include <afxwinforms.h>   // MFC Windows Forms support
    
  6. 添加代码以创建托管控件。

    首先,声明托管控件。 在 MFC01Dlg.h 中,转到对话框类的声明,并在受保护的作用域中添加用户控件的数据成员,如下所示。

    class CMFC01Dlg : public CDialog
    {
       // ...
       // Data member for the .NET User Control:
       CWinFormsControl<WindowsFormsControlLibrary1::UserControl1> m_ctrl1;
    

    接下来,提供托管控件的实现。 在 MFC01Dlg.cpp 中,在 MFC 应用程序向导生成的 CMFC01Dlg::DoDataExchange 对话框替代(不是位于同一文件中的 CAboutDlg::DoDataExchange)中添加以下代码,以创建托管控件并将其与静态占位符 IDC_CTRL1 关联。

    void CMFC01Dlg::DoDataExchange(CDataExchange* pDX)
    {
       CDialog::DoDataExchange(pDX);
       DDX_ManagedControl(pDX, IDC_CTRL1, m_ctrl1);
    }
    
  7. 生成并运行该项目。

    在“解决方案资源管理器”中,右键单击“MFC01”,然后单击“设为启动项目”

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

    在“调试”菜单上,单击“开始执行(不调试)”。 此时 MFC 对话框应显示 Windows 窗体控件。

另请参阅

在 MFC 对话框中承载 Windows 窗体用户控件