共用方式為


將 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.dllMFC03複製到專案目錄中,讓程式執行。

  4. #include <afxwinforms.h>現有#include語句結尾新增至 pch.hVisual 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 使用者控制項