將 Windows Form 使用者控制項裝載成 MFC 對話方塊
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.dll
MFC03
複製到專案目錄中,讓程式執行。在
#include <afxwinforms.h>
現有#include
語句結尾新增至 pch.h ( Visual Studio 2017 和更早版本中的 stdafx.h )。新增子類別
CDialog
的新類別。以滑鼠右鍵按一下專案名稱,並新增子類別
CDialog
的 MFC 類別(稱為 CHostForWinForm)。 由於您不需要對話方塊資源,因此您可以刪除資源識別碼(選取 [資源檢視 ],展開 [對話方塊 ] 資料夾並刪除IDD_HOSTFORWINFORM
資源。然後,移除程式碼中識別碼的任何參考。將 CHostForWinForm.h 和 CHostForWinForm.cpp 檔案中的 取代
CDialog
為CWinFormsDialog<WindowsControlLibrary1::UserControl1>
。在 CHostForWinForm 類別上呼叫 DoModal。
在 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 類別的 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"); }
建置並執行專案。 當您按一下位於 Windows Form 上的按鈕時,MFC 應用程式中的程式碼將會執行。
接下來,您將新增程式碼,以從 MFC 程式碼顯示 Windows Form 文字方塊中的值。
在 CHostForWinForm.h 中 CHostForWinForm 類別的 public 區段中,新增下列宣告:
CString m_sEditBoxOnWinForm;
在 CHostForWinForm.cpp 中 DoDataExchange 的定義中,將下列三行新增至函式結尾:
if (pDX->m_bSaveAndValidate) m_sEditBoxOnWinForm = CString( GetControl()->textBox1->Text); else GetControl()->textBox1->Text = gcnew System::String(m_sEditBoxOnWinForm);
在 CHostForWinForm.cpp 的 OnButton1 定義中,將下列三行新增至函式結尾:
this->UpdateData(TRUE); System::String ^ z = gcnew System::String(m_sEditBoxOnWinForm); System::Windows::Forms::MessageBox::Show(z);
建置並執行專案。
另請參閱
System.Windows.Forms.UserControl在 MFC 中使用 Windows Forms 使用者控制項