如何:创建用户控件并将它承载在对话框中
本文中的步骤假定你正在创建基于对话框(CDialog 类)的 Microsoft 基础类 (MFC) 项目,但你也可以向现有 MFC 对话框添加对 Windows 窗体控件的支持。
创建 .NET 用户控件的步骤
创建一个名为
WindowsFormsControlLibrary1
的 Visual C# Windows 窗体控件库项目。在“文件”菜单上,单击“新建”,然后单击“项目”。 在 Visual C# 文件夹中,选择“Windows 窗体控件库”。
单击“确定
WindowsFormsControlLibrary1
”接受 项目名称。默认情况下,.NET 控件的名称将为
UserControl1
。将子控件添加到
UserControl1
。在“工具箱”中,打开“所有Windows 窗体”列表。 将“按钮”控件拖到
UserControl1
设计图面。另请添加 TextBox 控件。
在“解决方案资源管理器”中,双击“UserControl1.Designer.cs”将其打开以供编辑。 将文本框声明和按钮从
private
更改为public
。生成项目。
在“生成”菜单中,单击“生成解决方案”。
创建 MFC 主机应用程序
创建一个 MFC 应用程序项目。
在“文件”菜单上,单击“新建”,然后单击“项目”。 在“Visual C++”文件夹中,选择 “MFC 应用程序”。
在“名称”框中键入
MFC01
。 将“解决方案”设置更改为“添加到解决方案”。 单击“确定”。在“MFC 应用程序向导”中,选择“基于对话框”作为“应用程序类型”。 接受剩余的默认设置,然后单击“完成”。 这会创建一个具有 MFC 对话框的 MFC 应用程序。
向 MFC 对话框添加占位符控件。
在“视图”菜单上,单击“资源视图”。 在“资源视图”中,展开“Dialog”文件夹并双击“
IDD_MFC01_DIALOG
”。 对话框资源随即显示在“资源编辑器”中。在“工具箱”中,打开“对话框编辑器”列表。 将“静态文本”控件拖到对话框资源。 “静态文本”控件将用作 .NET Windows 窗体控件的占位符。 将其大小重设为大约 Windows 窗体控件的大小。
在“属性”窗口中,将“静态文本”控件的“ID”更改为
IDC_CTRL1
,并将“TabStop”属性更改为“True”。配置公共语言运行时 (CLR) 支持的项目。
在“解决方案资源管理器”中,右键单击 MFC01 项目节点,然后单击“属性”。
在“属性页”对话框中的“配置属性”下,选择“常规”。 在“项目默认值”部分,将“公共语言运行时支持”设置为“公共语言运行时支持(/clr)”。
在“配置属性”下,展开“C/C++”并选择“常规”节点。 将“调试信息格式”设置为“程序数据库 (/Zi)”。
选择“代码生成”节点。 将“启用最小重新生成”设置为“否(/Gm-)”。 还要将“基本运行时检查”设置为“默认”。
单击“确定”应用更改。
添加对 .NET 控件的引用。
在“解决方案资源管理器”中,右键单击 MFC01 项目节点,然后依次单击“添加”和“引用”。 在“属性页”上,单击“添加新引用”,选择“项目”选项卡下的 WindowsFormsControlLibrary1,然后单击“确定”。 这会以 /FU 编译器选项的形式添加引用,以便程序能够进行编译。 它还将 WindowsFormsControlLibrary1.dll 的副本放入 \MFC01\ 项目文件夹中,这样程序就会运行。
在 Stdafx.h 中,找到以下行:
#endif // _AFX_NO_AFXCMN_SUPPORT
在它上面添加以下行:
#include <afxwinforms.h> // MFC Windows Forms support
添加代码以创建托管控件。
首先,声明托管控件。 在 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); }
生成并运行该项目。
在“解决方案资源管理器”中,右键单击“MFC01”,然后单击“设为启动项目”。
在 “生成” 菜单上,单击 “生成解决方案” 。
在“调试”菜单上,单击“开始执行(不调试)”。 此时 MFC 对话框应显示 Windows 窗体控件。