MFC 提供範本類別 CWinFormsDialog,讓您可以在模態或非模態 MFC 對話方塊中承載 Windows Forms 使用者控制項(UserControl)。
CWinFormsDialog 衍生自 MFC 類別 CDialog,因此對話框可以作為模態或無模態啟動。
用來裝載使用者控件的程式 CWinFormsDialog 類似於在 MFC 對話框中裝載 Windows Form 使用者控制件中所述的程式。 不過, CWinFormsDialog 管理使用者控件的初始化和裝載,因此不需要手動進行程序設計。
建立 MFC 主應用程式
建立 MFC 應用程式專案。
在 [ 檔案] 功能表上,選取 [新增],然後按兩下 [ 專案]。 在 [ Visual C++] 資料夾中,選取 [MFC 應用程式]。
在 [ 名稱] 方塊中,輸入
MFC03並將 [方案] 設定變更 為 [新增至方案]。 按一下 [確定]。在 [MFC 應用程式精靈] 中,接受所有預設值,然後按兩下 [ 完成]。 這會建立具有多個檔介面的 MFC 應用程式。
設定專案。
在 方案總管 中,以滑鼠右鍵按下 MFC03 項目節點,然後選擇 [屬性]。 [ 屬性頁] 對話框隨即出現。
在 [屬性頁] 對話框中,選取 [組態屬性>一般]。 在 [項目預設值] 區段中,將 Common Language Runtime 支援設定為 Common Language Runtime 支援 (/clr) 。 選擇確定。
新增 .NET 控件的參考。
在 方案總管 中,以滑鼠右鍵按兩下 MFC03 項目節點,然後選擇 [新增]、[參考]。 在 [屬性頁] 中,按兩下 [新增參考],選取 [WindowsControlLibrary1] (在 [專案] 索引卷標下),然後按兩下 [確定]。 這會以編譯程式選項的形式
/FU新增參考,讓程式能夠編譯;它也會複製到WindowsControlLibrary1.dllMFC03專案目錄,讓程序執行。在
#include <afxwinforms.h>現有語句結尾新增至 pch.h (#include)。新增子類別
CDialog的新類別。以滑鼠右鍵點一下專案名稱,並新增一個 MFC 類別(稱為
CHostForWinForm),使其成為CDialog的子類別。 由於您不需要對話框資源,因此您可以刪除資源識別碼(選取 [資源檢視],展開 [對話框 ] 資料夾並刪除IDD_HOSTFORWINFORM資源。然後,移除程式代碼中標識碼的任何參考。將中的
CDialog與CHostForWinForm.h檔案取代CHostForWinForm.cpp為CWinFormsDialog<WindowsControlLibrary1::UserControl1>。在
DoModal類別上呼叫CHostForWinForm。在
MFC03.cpp中,新增#include "HostForWinForm.h"。在 定義
CMFC03App::InitInstance中的 return 語句之前,新增:CHostForWinForm m_HostForWinForm; m_HostForWinForm.DoModal();建置並執行專案。
在 [建置] 功能表上,按一下 [建置方案]。
在 [偵錯] 功能表上,單擊 [開始但不偵錯]。
接下來,您將新增程序代碼,以從 MFC 應用程式監視 Windows Forms 上的控件狀態。
新增一個
OnInitDialog處理程式。顯示 [ 屬性] 視窗 (F4)。 在 [類別檢視] 中,選取
CHostForWinForm。 在屬性視窗中,選取覆寫,然後在OnInitDialog的行中,點選左側列並選取<新增>。 這會將下列這一行新增至CHostForWinForm.h:virtual BOOL OnInitDialog();定義
OnInitDialog(在CHostForWinForm.cpp中),如下所示:BOOL CHostForWinForm::OnInitDialog() { CWinFormsDialog<WindowsControlLibrary1::UserControl1>::OnInitDialog(); GetControl()->button1->Click += MAKE_DELEGATE(System::EventHandler, OnButton1); return TRUE; }接下來,新增
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"); }建置並執行專案。 當您按下位於 Windows Form 上的按鈕時,MFC 應用程式中的程式碼將會執行。
接下來,您將新增程序代碼,以從 MFC 程式代碼顯示 Windows Form 文字框中的值。
在
CHostForWinForm類別的CHostForWinForm.h公共區段中,新增下列宣告:CString m_sEditBoxOnWinForm;在
DoDataExchange中的CHostForWinForm.cpp定義中,將下列四行新增至函式結尾:if (pDX->m_bSaveAndValidate) m_sEditBoxOnWinForm = CString( GetControl()->textBox1->Text); else GetControl()->textBox1->Text = gcnew System::String(m_sEditBoxOnWinForm);在
OnButton1內定義CHostForWinForm.cpp時,將下列三行新增至函式的結尾:this->UpdateData(TRUE); System::String ^ z = gcnew System::String(m_sEditBoxOnWinForm); System::Windows::Forms::MessageBox::Show(z);建置並執行專案。
另請參閱
System.Windows.Forms.UserControl
在 MFC 中使用 Windows Form 使用者控件