MFC 提供模板類 CWinFormsDialog,使用該類可以在模式或無模式 MFC 對話方塊中承載 Windows 表單使用者控制項 (UserControl)。CWinFormsDialog 是從 MFC 類 CDialog 派生的,所以該對話方塊可以以模式或無模式方式啟動。
有關顯示與 MFC 一起使用的 Windows 表單的應用程式範例,請參見“MFC and WinForms Integration”(MFC 和 WinForms 整合)。
建立新 MFC 應用程式項目。
在[檔案] 功能表上,選擇 New,然後單擊“項目”。在“Visual C++”檔案夾中,選擇“MFC 應用程式”。
在“名稱”框中,輸入 MFC03,並將“解決方案”設定更改為“添入解決方案”。單擊“確定”。
在“MFC 應用程式嚮導”中,接受所有預設值,然後單擊“完成”。這就建立了一個具有多重文件介面的 MFC 應用程式。
設定項目。
在“方案總管”中,右擊 MFC03 項目節點,然後從操作功能表中選擇“屬性”。將出現“屬性頁面”對話方塊。
在“屬性頁面”對話方塊中的“配置屬性”樹控制項中,選擇“常規”,然後在“項目預設值”部分中,將“公用語言運行庫支援”設定為“公用語言運行庫支援 (/clr)”。單擊“確定”。
向 .NET 控制項添加引用。
在方案總管中,右擊 MFC03 項目節點,然後選擇“引用”。在“屬性頁面”中,單擊“添加新引用”,選擇“WindowsControlLibrary1”(在“項目”選項卡下),然後單擊“確定”。此操作添加一個 /FU 編譯器選項形式的引用,以便程式進行編譯;它還將 WindowsControlLibrary1.dll 複製到 MFC03 項目目錄中,以便程式運行。
將 #include <afxwinforms.h> 添加到 stdafx.h 中現有 #include 語句的末尾。
添加一個作為 CDialog 子類的新類。
右擊項目名稱並添加一個作為 CDialog 子類的 MFC 類(名為 CHostForWinForm)。由於您不需要對話方塊資源,則可以刪除其資源 ID(選擇“資源檢視”,展開“對話方塊”檔案夾,刪除 IDD_HOSTFORWINFORM 資源。然後刪除代碼中對該 ID 的所有引用。)
將 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 表單上控制項的狀態。
添加 OnInitDialog 的處理常式。
顯示“屬性”視窗 (F4)。在“類別檢視”中,選擇“CHostForWinForm”。在“屬性”視窗中,選擇 overrides,並在 OnInitDialog 所在的行中,單擊左列並選擇“<添加>”。這將向 CHostForWinForm.h 中添加下行:
複製代碼virtual BOOL OnInitDialog();
按如下方式(在 CHostForWinForm.cpp 中)定義 OnInitDialog:
複製代碼BOOL CHostForWinForm::OnInitDialog() { CWinFormsDialog<WindowsControlLibrary1::UserControl1>::OnInitDialog(); GetControl()->button1->Click += MAKE_DELEGATE(System::EventHandler, OnButton1); return TRUE;}
接下來,添加 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");}
產生並運行此項目。當您單擊該按鈕(位於 Windows 表單上)時,將運行 MFC 應用程式中的代碼。
接下來,將添加代碼,用來從 MFC 代碼中顯示 Windows 表單上文字框中的值。
在 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);
產生並運行此項目。