65.9K
CodeProject 正在变化。 阅读更多。
Home

在 MFC 对话框中使用 WinForms 控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (28投票s)

2005年12月20日

CPOL

2分钟阅读

viewsIcon

305467

downloadIcon

4340

本文是一个简单的介绍,说明如何使用 CWinFormsControl MFC 类将 Windows Forms 控件放置在 MFC 对话框中。

引言

几天前,有人在 Code Project VC++ 论坛上询问是否可以在 MFC 对话框中使用 Dundas WinForms 控件。答案是肯定的,使用 VC++ 2005 可以完全做到,而且非常容易。

本文是一个简单的介绍,说明如何使用 CWinFormsControl MFC 类将 Windows Forms 控件放置在 MFC 对话框中。本文使用一个基于小型对话框的应用程序进行演示,该应用程序在其上放置了一个 .NET MaskedTextBox 控件。MaskInputRejected 事件通过在 MFC 对话框类中声明的函数进行处理。

将 .NET 控件放置在 MFC 对话框中的步骤

  1. 使用 VC++ 2005 创建一个新的基于 MFC 对话框的应用程序。并启用 /clr 编译。

  2. 将以下头文件包含添加到你的 stdafx.h

    #include <afxwinforms.h>
  3. 修改你的对话框资源,使其具有截图中显示的控件,并进行一项更改。在截图中看到 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:你需要添加到对话框资源中的控件
  4. CWinFormsControl 变量添加到你的对话框头文件中

    CWinFormsControl<System::Windows::Forms::MaskedTextBox> m_MaskedEdit;

    CWinFormsControl 类提供了在 MFC 应用程序中托管 .NET 控件的功能。

  5. 在你的对话框类的 DoDataExchange 中,添加一个对 DDX_ManagedControl 的调用

    void CDialogFormsDlg::DoDataExchange(CDataExchange* pDX)
    {
        CDialog::DoDataExchange(pDX);
        DDX_ManagedControl(pDX, IDC_MASKED_EDIT1, m_MaskedEdit);
    . . .
    }

    这将创建 .NET 控件并将其与该资源 ID 关联。

  6. 将事件处理程序声明添加到你的头文件中。

    void OnMaskInputRejected(System::Object^, 
        System::Windows::Forms::MaskInputRejectedEventArgs^);
  7. 在你的对话框类声明的公共部分设置委托映射。

    BEGIN_DELEGATE_MAP( CDialogFormsDlg )
        EVENT_DELEGATE_ENTRY( OnMaskInputRejected, System::Object^, 
            System::Windows::Forms::MaskInputRejectedEventArgs^ )
    END_DELEGATE_MAP()

    委托映射允许我们通过调用 MAKE_DELEGATE 在其上使用 MFC 类函数作为委托。

  8. 设置 OnBnSetMask 函数。

    void CDialogFormsDlg::OnBnSetMask()
    {
       CString strMask; 
       m_Mask.GetWindowText(strMask);
       m_MaskedEdit->Clear();
       m_MaskedEdit->Mask = gcnew System::String(strMask);
    }
  9. OnInitDialog 中设置 MaskedTextBox 控件。

    m_MaskedEdit->PromptChar = L' ';
    m_Mask.SetWindowText(L"00/00/0000");
    OnBnSetMask();
    m_MaskedEdit->MaskInputRejected +=
        MAKE_DELEGATE( System::Windows::Forms::MaskInputRejectedEventHandler, 
        OnMaskInputRejected);
  10. 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!");
      }  
    }
  11. 完成了。我们都完成了。构建并运行应用程序。你看到的是一个包含 WinForms 控件的 MFC 对话框。

结论

这应该可以帮助你重用现有的 MFC 应用程序,同时使用市场上发布的新型、美观的 .NET UI 控件。请使用文章论坛提供关于文章的反馈或发布你可能有的任何问题。

历史

  • 2005 年 12 月 20 日 - 首次发布。
© . All rights reserved.