共用方式為


將 Windows Form 使用者控制項裝載成 MFC 對話方塊

MFC 提供範本類別 CWinFormsDialog ,讓您可以在強制回應或無模式 MFC 對話方塊中裝載 Windows Forms 使用者控制項 ( UserControl )。 CWinFormsDialog 衍生自 MFC 類別 CDialog ,因此對話方塊可以啟動為強制回應或無模式。

用來裝載使用者控制項的程式 CWinFormsDialog 類似于在 MFC 對話方塊中 裝載 Windows Form 使用者控制項中所述 的程式。 不過, CWinFormsDialog 管理使用者控制項的初始化和裝載,因此不需要手動進行程式設計。

建立 MFC 主應用程式

  1. 建立 MFC 應用程式專案。

    在 [ 檔案] 功能表上,選取 [新增 ],然後按一下 [ 專案 ]。 在 [ Visual C++] 資料夾中,選取 [MFC 應用程式 ]。

    在 [ 名稱] 方塊中,輸入 MFC03 並將 [方案] 設定變更為 [新增至方案 ]。按一下 [ 確定 ]。

    [MFC 應用程式精靈 ] 中,接受所有預設值,然後按一下 [ 完成 ]。 這會建立具有多個檔介面的 MFC 應用程式。

  2. 設定專案。

    方案總管 中,以滑鼠右鍵按一下 MFC03 專案節點,然後選擇 [ 屬性 ]。 [ 屬性頁] 對話方塊隨即出現。

    在 [ 屬性頁] 對話方塊中,選取 [ 組態屬性 > 一般]。 在 [ 專案預設值] 區 段中,將 Common Language Runtime 支援 設定 Common Language Runtime 支援 (/clr) 。 選擇確定

  3. 新增 .NET 控制項的參考。

    方案總管 中,以滑鼠右鍵按一下 MFC03 專案節點,然後選擇 [ 新增 ]、 [參考 ]。 在 [屬性頁 ] 中,按一下 [ 新增參考 ],選取 [WindowsControlLibrary1] (在 [專案 ] 索引標籤下),然後按一下 [ 確定 ]。 這會以 /FU 編譯器選項的形式 新增參考,讓程式能夠編譯;它也會將 WindowsControlLibrary1.dll MFC03 複製到專案目錄中,讓程式執行。

  4. #include <afxwinforms.h> 現有 #include 語句結尾新增至 pch.h Visual Studio 2017 和更早版本中的 stdafx.h )。

  5. 新增子類別 CDialog 的新類別。

    以滑鼠右鍵按一下專案名稱,並新增子類別 CDialog 的 MFC 類別(稱為 CHostForWinForm)。 由於您不需要對話方塊資源,因此您可以刪除資源識別碼(選取 [資源檢視 ],展開 [對話方塊 ] 資料夾並刪除 IDD_HOSTFORWINFORM 資源。然後,移除程式碼中識別碼的任何參考。

  6. 將 CHostForWinForm.h 和 CHostForWinForm.cpp 檔案中的 取代 CDialogCWinFormsDialog<WindowsControlLibrary1::UserControl1>

  7. 在 CHostForWinForm 類別上呼叫 DoModal。

    在 MFC03.cpp 中,新增 #include "HostForWinForm.h"

    在 CMFC03App::InitInstance 定義中的 return 語句之前,新增:

    CHostForWinForm m_HostForWinForm;
    m_HostForWinForm.DoModal();
    
  8. 建置並執行專案。

    在 [建置] 功能表上,按一下 [建置方案]。

    在 [偵錯] 功能表上,按一下 [ 開始但不偵錯 ]。

    接下來,您將新增程式碼,以從 MFC 應用程式監視 Windows Forms 上的控制項狀態。

  9. 新增 OnInitDialog 的處理常式。

    顯示 [ 屬性] 視窗 (F4)。 在 [類別檢視] 中,選取 [CHostForWinForm]。 在 [ 屬性] 視窗中,選取 [覆寫],然後在 OnInitDialog 的資料列中,按一下左側資料行,然後選取 [ < 新增 > ]。 這會將下列這一行新增至 CHostForWinForm.h:

    virtual BOOL OnInitDialog();
    
  10. 定義 OnInitDialog (在 CHostForWinForm.cpp 中),如下所示:

    BOOL CHostForWinForm::OnInitDialog() {
       CWinFormsDialog<WindowsControlLibrary1::UserControl1>::OnInitDialog();
       GetControl()->button1->Click += MAKE_DELEGATE(System::EventHandler, OnButton1);
       return TRUE;
    }
    
  11. 接下來,新增 OnButton1 處理常式。 將下列幾行新增至 CHostForWinForm 類別的 public 區段:CHostForWinForm.h:

    virtual void OnButton1( System::Object^ sender, System::EventArgs^ e );
    
    BEGIN_DELEGATE_MAP( CHostForWinForm )
       EVENT_DELEGATE_ENTRY( OnButton1, System::Object^, System::EventArgs^ );
    END_DELEGATE_MAP()
    

    在 CHostForWinForm.cpp 中,新增此定義:

    void CHostForWinForm::OnButton1( System::Object^ sender, System::EventArgs^ e )
    {
       System::Windows::Forms::MessageBox::Show("test");
    }
    
  12. 建置並執行專案。 當您按一下位於 Windows Form 上的按鈕時,MFC 應用程式中的程式碼將會執行。

    接下來,您將新增程式碼,以從 MFC 程式碼顯示 Windows Form 文字方塊中的值。

  13. 在 CHostForWinForm.h 中 CHostForWinForm 類別的 public 區段中,新增下列宣告:

    CString m_sEditBoxOnWinForm;
    
  14. 在 CHostForWinForm.cpp 中 DoDataExchange 的定義中,將下列三行新增至函式結尾:

    if (pDX->m_bSaveAndValidate)
       m_sEditBoxOnWinForm = CString( GetControl()->textBox1->Text);
    else
       GetControl()->textBox1->Text = gcnew System::String(m_sEditBoxOnWinForm);
    
  15. 在 CHostForWinForm.cpp 的 OnButton1 定義中,將下列三行新增至函式結尾:

    this->UpdateData(TRUE);
    System::String ^ z = gcnew System::String(m_sEditBoxOnWinForm);
    System::Windows::Forms::MessageBox::Show(z);
    
  16. 建置並執行專案。

另請參閱

System.Windows.Forms.UserControl在 MFC 中使用 Windows Forms 使用者控制項