在 MFC 对话框中使用 WinForms 控件






4.88/5 (28投票s)
本文是一个简单的介绍,说明如何使用 CWinFormsControl MFC 类将 Windows Forms 控件放置在 MFC 对话框中。
引言
几天前,有人在 Code Project VC++ 论坛上询问是否可以在 MFC 对话框中使用 Dundas WinForms 控件。答案是肯定的,使用 VC++ 2005 可以完全做到,而且非常容易。
本文是一个简单的介绍,说明如何使用 CWinFormsControl
MFC 类将 Windows Forms 控件放置在 MFC 对话框中。本文使用一个基于小型对话框的应用程序进行演示,该应用程序在其上放置了一个 .NET MaskedTextBox
控件。MaskInputRejected
事件通过在 MFC 对话框类中声明的函数进行处理。
将 .NET 控件放置在 MFC 对话框中的步骤
-
使用 VC++ 2005 创建一个新的基于 MFC 对话框的应用程序。并启用 /clr 编译。
-
将以下头文件包含添加到你的 stdafx.h
#include <afxwinforms.h>
-
修改你的对话框资源,使其具有截图中显示的控件,并进行一项更改。在截图中看到
MaskedTextBox
控件的位置,放置一个静态控件。你最终应该得到以下控件。IDC_MASKED_EDIT1
我们将把它映射到 MaskedTextBox
控件IDC_EDITMASK
CEdit m_Mask
IDC_BUTTONMASK
ON_BN_CLICKED
->OnBnSetMask
IDC_EDIT_STATUS
CEdit m_StatusEdit (DDX)
IDC_STATIC
"设置掩码" IDC_STATIC
"输入文本" 表 1:你需要添加到对话框资源中的控件
-
将
CWinFormsControl
变量添加到你的对话框头文件中CWinFormsControl<System::Windows::Forms::MaskedTextBox> m_MaskedEdit;
CWinFormsControl
类提供了在 MFC 应用程序中托管 .NET 控件的功能。 -
在你的对话框类的
DoDataExchange
中,添加一个对DDX_ManagedControl
的调用void CDialogFormsDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_ManagedControl(pDX, IDC_MASKED_EDIT1, m_MaskedEdit); . . . }
这将创建 .NET 控件并将其与该资源 ID 关联。
-
将事件处理程序声明添加到你的头文件中。
void OnMaskInputRejected(System::Object^, System::Windows::Forms::MaskInputRejectedEventArgs^);
-
在你的对话框类声明的公共部分设置委托映射。
BEGIN_DELEGATE_MAP( CDialogFormsDlg ) EVENT_DELEGATE_ENTRY( OnMaskInputRejected, System::Object^, System::Windows::Forms::MaskInputRejectedEventArgs^ ) END_DELEGATE_MAP()
委托映射允许我们通过调用
MAKE_DELEGATE
在其上使用 MFC 类函数作为委托。 -
设置
OnBnSetMask
函数。void CDialogFormsDlg::OnBnSetMask() { CString strMask; m_Mask.GetWindowText(strMask); m_MaskedEdit->Clear(); m_MaskedEdit->Mask = gcnew System::String(strMask); }
-
在
OnInitDialog
中设置MaskedTextBox
控件。m_MaskedEdit->PromptChar = L' '; m_Mask.SetWindowText(L"00/00/0000"); OnBnSetMask(); m_MaskedEdit->MaskInputRejected += MAKE_DELEGATE( System::Windows::Forms::MaskInputRejectedEventHandler, OnMaskInputRejected);
-
将
OnMaskInputRejected
函数添加到对话框类。void CDialogFormsDlg::OnMaskInputRejected(System::Object^, System::Windows::Forms::MaskInputRejectedEventArgs^ args) { if(m_MaskedEdit->MaskFull) { m_StatusEdit.SetWindowText(L"You've hit the max length of the mask."); } else if(args->Position == m_MaskedEdit->Mask->Length) { m_StatusEdit.SetWindowText(L"You are at the end of the mask."); } else { m_StatusEdit.SetWindowText(L"Bad entry. Check your input!"); } }
-
完成了。我们都完成了。构建并运行应用程序。你看到的是一个包含 WinForms 控件的 MFC 对话框。
结论
这应该可以帮助你重用现有的 MFC 应用程序,同时使用市场上发布的新型、美观的 .NET UI 控件。请使用文章论坛提供关于文章的反馈或发布你可能有的任何问题。
历史
- 2005 年 12 月 20 日 - 首次发布。