以 MFC 對話方塊的形式承載 Windows 表單使用者控制項

來源:互聯網
上載者:User
Visual C++以 MFC 對話方塊的形式承載 Windows 表單使用者控制項

MFC 提供模板類 CWinFormsDialog,使用該類可以在模式或無模式 MFC 對話方塊中承載 Windows 表單使用者控制項 (UserControl)。CWinFormsDialog 是從 MFC 類 CDialog 派生的,所以該對話方塊可以以模式或無模式方式啟動。

CWinFormsDialog 用以承載使用者控制項的過程與在 MFC 對話方塊中承載 Windows 表單使用者控制項中描述的類似。但是,CWinFormsDialog 系統管理使用者控制項的初始化和承載,因此不必手動編程。

有關顯示與 MFC 一起使用的 Windows 表單的應用程式範例,請參見“MFC and WinForms Integration”(MFC 和 WinForms 整合)。

建立 MFC 宿主應用程式
  1. 建立新 MFC 應用程式項目。

    在[檔案] 功能表上,選擇 New,然後單擊“項目”。在“Visual C++”檔案夾中,選擇“MFC 應用程式”。

    在“名稱”框中,輸入 MFC03,並將“解決方案”設定更改為“添入解決方案”。單擊“確定”。

    在“MFC 應用程式嚮導”中,接受所有預設值,然後單擊“完成”。這就建立了一個具有多重文件介面的 MFC 應用程式。

  2. 設定項目。

    在“方案總管”中,右擊 MFC03 項目節點,然後從操作功能表中選擇“屬性”。將出現“屬性頁面”對話方塊。

    在“屬性頁面”對話方塊中的“配置屬性”樹控制項中,選擇“常規”,然後在“項目預設值”部分中,將“公用語言運行庫支援”設定為“公用語言運行庫支援 (/clr)”。單擊“確定”。

  3. 向 .NET 控制項添加引用。

    在方案總管中,右擊 MFC03 項目節點,然後選擇“引用”。在“屬性頁面”中,單擊“添加新引用”,選擇“WindowsControlLibrary1”(在“項目”選項卡下),然後單擊“確定”。此操作添加一個 /FU 編譯器選項形式的引用,以便程式進行編譯;它還將 WindowsControlLibrary1.dll 複製到 MFC03 項目目錄中,以便程式運行。

  4. 將 #include <afxwinforms.h> 添加到 stdafx.h 中現有 #include 語句的末尾。

  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 表單上控制項的狀態。

  9. 添加 OnInitDialog 的處理常式。

    顯示“屬性”視窗 (F4)。在“類別檢視”中,選擇“CHostForWinForm”。在“屬性”視窗中,選擇 overrides,並在 OnInitDialog 所在的行中,單擊左列並選擇“<添加>”。這將向 CHostForWinForm.h 中添加下行:

    複製代碼
    virtual BOOL OnInitDialog();
  10. 按如下方式(在 CHostForWinForm.cpp 中)定義 OnInitDialog:

    複製代碼
    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 表單上)時,將運行 MFC 應用程式中的代碼。

    接下來,將添加代碼,用來從 MFC 代碼中顯示 Windows 表單上文字框中的值。

  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. 產生並運行此項目。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.