共用方式為


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

更新:2007 年 11 月

MFC 提供樣板類別 CWinFormsDialog,能夠讓您在強制回應或非強制回應的 MFC 對話方塊中裝載 Windows Form 使用者控制項 (UserControl)。CWinFormsDialog 是衍生自 MFC 類別 CDialog,因此可以將對話方塊啟動為強制回應或非強制回應。

CWinFormsDialog 使用來裝載使用者控制項的過程,與將 Windows Form 使用者控制項裝載至 MFC 對話方塊中中的說明相似。然而,CWinFormsDialog 管理了使用者控制項的初始化和裝載,所以不需要以手動方式進行程式化。

如需說明搭配 MFC 使用之 Windows Form 的範例應用程式,請參閱 MFC 和 Windows Form 整合 (英文)。

若要建立 MFC 主應用程式

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

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

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

    接受 [MFC 應用程式精靈] 中的所有預設值,然後按一下 [完成],如此將會建立 MFC 應用程式,並包含多重文件介面 (MDI)。

  2. 設定專案。

    在 [方案總管] 中,以滑鼠右鍵按一下 [MFC03] 專案節點,然後從內容功能表選取 [屬性]。[屬性頁] 對話方塊隨即出現。

    在 [屬性頁] 對話方塊的 [組態屬性] 樹狀目錄控制項中選取 [一般],然後在 [專案預設值] 區段中將 [Common Language Runtime 支援] 設定為 [Common Language Runtime 支援 (/clr)]。按一下 [確定]。

  3. 將參考加入到 .NET 控制項中。

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

  4. 將 #include <afxwinforms.h> 加入到位於現有 #include 陳述式尾端的 stdafx.h。

  5. 加入一個將 CDialog 子類別化的新類別。

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

  6. 將 CHostForWinForm.h 和 CHostForWinForm.cpp 檔案中的 CDialog 替換為 CWinFormsDialog<WindowsControlLibrary1::UserControl1>。

  7. 呼叫 CHostForWinForm 類別上的 DoModal。

    在 MFC03.cpp 中,加入 #include "HostForWinForm.h"。

    在 CMFC03App::InitInstance 定義中的 return 陳述式之前,加入:

    CHostForWinForm m_HostForWinForm;

    m_HostForWinForm.DoModal();

  8. 建置及執行專案。

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

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

    接下來,您將會加入程式碼,從 MFC 應用程式監視 Windows Form 上的控制項狀態。

  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.h 中 CHostForWinForm 類別的 public 區段:

    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 Form 使用者控制項