如何:创建用户控件并将它承载在对话框中
本主题中的步骤假设您正在创建一个基于对话框 (CDialog 类) 的 Microsoft Foundation Classes (MFC) 项目,但您还可以将对 Windows 窗体控件的支持添加到现有 MFC 对话框。
创建 .NET 用户控件
创建名为 WindowsFormsControlLibrary1 的 Visual C# Windows 窗体控件库项目。
在**“文件”菜单上,单击“新建”,然后单击“项目”。在“Visual C#”文件夹中,选择“Windows 窗体控件库”**。
通过单击**“确定”**,接受 WindowsFormsControlLibrary1 项目名称。
默认情况下,.NET 控件的名称将为 UserControl1。
向 UserControl1 添加子控件。
在**“工具箱”中,打开“所有 Windows 窗体”列表。将一个“Button”**控件拖到 UserControl1 设计图面上。
再添加一个**“TextBox”**控件。
在**“解决方案资源管理器”中,双击“UserControl1.Designer.cs”**以打开它进行编辑。将 TextBox 和 Button 的声明从 private 更改为 public。
生成项目。
在**“生成”菜单上,单击“生成解决方案”**。
创建 MFC 宿主应用程序
创建 MFC 应用程序项目。
在**“文件”菜单上,单击“新建”,然后单击“项目”。在“Visual C++”文件夹中,选择“MFC 应用程序”**。
在**“名称”框中键入 MFC01。将解决方案的设置更改为“添入解决方案”。单击“确定”**。
在**“MFC 应用程序向导”中,为应用程序类型选择“基于对话框的”。接受剩余的默认设置并单击“完成”**。这将创建具有 MFC 对话框的 MFC 应用程序。
向 MFC 对话框添加 placeholder 控件。
在**“视图”菜单上,单击“资源视图”。在“资源视图”中,展开“对话框”文件夹,并双击 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 窗体控件。