如何:建立使用者控制項並裝載 MDI 檢視
下列步驟示範如何建立 .NET Framework 使用者控件、在控件類別庫中撰寫使用者控件(特別是 Windows 控件連結庫專案),然後將專案編譯成元件。 然後,您可以從 MFC 應用程式取用控件,該應用程式會使用衍生自 CView 類別 和 CWinFormsView 類別的類別。
如需如何建立 Windows Forms 使用者控件及撰寫控件類別庫的詳細資訊,請參閱 如何:撰寫使用者控件。
注意
在某些情況下,Windows Forms 控制件,例如第三方方方格控件,在 MFC 應用程式中裝載時可能無法可靠地運作。 建議的因應措施是將 Windows Forms 使用者控件放在 MFC 應用程式中,並將第三方方方格控件放在使用者控件內。
此程式假設您已建立名為 WindowsFormsControlLibrary1 的 Windows Forms 控制件連結庫專案,如如何:在對話框中建立使用者控件和主機中的程式。
建立 MFC 主應用程式
建立 MFC 應用程式專案。
在 [ 檔案] 功能表上,選取 [新增],然後按兩下 [ 專案]。 在 [ Visual C++] 資料夾中,選取 [MFC 應用程式]。
在 [名稱] 方塊中,輸入
MFC02
並將 [方案] 設定變更為 [新增至方案]。 按一下 [確定]。在 [MFC 應用程式精靈] 中,接受所有預設值,然後按兩下 [ 完成]。 這會建立具有多個檔介面的 MFC 應用程式。
設定 Common Language Runtime (CLR) 支援的專案。
在 方案總管 中,以滑鼠右鍵按兩下
MFC01
項目節點,然後從操作選單中選取 [屬性]。 [ 屬性頁] 對話框隨即出現。在 [設定屬性] 底下,選取 [一般]。 在 [項目預設值] 區段底下,將 Common Language Runtime 支援設定為 Common Language Runtime 支援 (/clr) 。
在 [組態屬性] 底下,展開 [C/C++],然後按兩下 [一般] 節點。 將 [偵錯資訊格式] 設定為 [程序資料庫] (/Zi) 。
按兩下 [程式 代碼產生] 節點。 將 [啟用最小重建] 設定為 [否] (/Gm-) 。 同時將 [基本運行時間檢查] 設定為 [預設值]。
按兩下 [ 確定 ] 以套用您的變更。
在 pch.h 中 (Visual Studio 2017 和更早版本中的 stdafx.h ),新增下列這一行:
#using <System.Windows.Forms.dll>
新增 .NET 控件的參考。
在 方案總管 中,以滑鼠右鍵按兩下
MFC02
項目節點,然後選取[新增]、[參考]。 在 [屬性頁] 中,按兩下 [新增參考],選取 [WindowsFormsControlLibrary1] (在 [專案] 索引卷標下),然後按兩下 [確定]。 這會以 /FU 編譯程序選項的形式新增參考,讓程式能夠編譯;它也會將WindowsFormsControlLibrary1.dllMFC02
複製到專案目錄中,讓程式執行。在 stdafx.h 中,尋找這一行:
#endif // _AFX_NO_AFXCMN_SUPPORT
在上面新增這幾行:
#include <afxwinforms.h> // MFC Windows Forms support
修改檢視類別,使其繼承自 CWinFormsView。
在 MFC02View.h 中,將 CView 取代為 CWinFormsView,讓程式代碼如下所示:
class CMFC02View : public CWinFormsView { };
如果您想要將其他檢視新增至 MDI 應用程式,您必須針對您所建立的每個檢視呼叫 CWinApp::AddDocTemplate 。
修改MFC02View.cpp檔案,將IMPLEMENT_DYNCREATE巨集和訊息對應中的 CView 變更為 CWinFormsView,並以如下所示的建構函式取代現有的空白建構函式:
IMPLEMENT_DYNCREATE(CMFC02View, CWinFormsView) CMFC02View::CMFC02View(): CWinFormsView(WindowsFormsControlLibrary1::UserControl1::typeid) { } BEGIN_MESSAGE_MAP(CMFC02View, CWinFormsView) //leave existing body as is END_MESSAGE_MAP()
建置並執行專案。
在 方案總管 中,以滑鼠右鍵按兩下 [MFC02],然後選取 [設定為啟始專案]。
在 [建置] 功能表上,按一下 [建置方案]。
在 [偵錯] 功能表上,單擊 [開始但不偵錯]。