共用方式為


將 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>現有語句結尾新增至 pch.h#include)。

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

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

  6. 將中的 CDialogCHostForWinForm.h 檔案取代CHostForWinForm.cppCWinFormsDialog<WindowsControlLibrary1::UserControl1>

  7. DoModal類別上呼叫CHostForWinForm

    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 中,將下列幾行新增至 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 類別的 CHostForWinForm.h 公共區段中,新增下列宣告:

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

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

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

另請參閱

System.Windows.Forms.UserControl
在 MFC 中使用 Windows Form 使用者控件