Visual C++ .NET (C++/CLI) 通過**托管擴展** 讓 C++ 開發者直接使用 .NET Framework 類庫構建 Windows Forms 應用。本文對比 MFC 與 Windows Forms 架構差異,演示從零手寫啟動邏輯、使用設計器拖放控件、數據綁定、自動布局等核心功能,並探討兩套框架的混合互操作策略。
| 維度 | MFC | Windows Forms |
|---|---|---|
| 定位 | 文檔/視圖架構的**完整應用框架** | **窗口控件工具包** (非框架) |
| 文檔支持 | 向導生成 SDI/MDI、工具欄、菜單、最近文件、打印、幫助 | 無內建文檔架構,需自行實現或用第三方庫 |
| 數據綁定 | 弱 (DDA/DDX 手動) | 強 (BindingSource、CurrencyManager、雙向綁定) |
| 佈局管理 | 手動計算坐標 | FlowLayoutPanel/TableLayoutPanel/Anchor/Dock 自動佈局 |
| 語言互操作 | 純 C++ | 任意 .NET 語言 (C#/VB.NET/F#) 共享組件 |
| 部署 | 原生 EXE/DLL | 需 .NET Runtime (現代可單文件發布/原生 AOT) |
// MyFirstApp.cpp
#using <mscorlib.dll>
#using <System.dll>
#using <System.Windows.Forms.dll>
#using <System.Drawing.dll>
using namespace System;
using namespace System::Windows::Forms;
using namespace System::Drawing;
[STAThread]
int main() {
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
Form^ form = gcnew Form();
form->Text = L"Hello Windows Forms";
form->ClientSize = Drawing::Size(400, 300);
Button^ btn = gcnew Button();
btn->Text = L"Click Me";
btn->Location = Point(150, 130);
btn->Click += gcnew EventHandler([](Object^, EventArgs^) {
MessageBox::Show(L"Hello from C++/CLI!");
});
form->Controls->Add(btn);
Application::Run(form); // 消息循環,窗體關閉時返回
return 0;
}
編譯:cl /clr MyFirstApp.cpp (需鏈接 .NET Framework 組件)。
^ (帽子):**追蹤控制代碼**,指向托管堆對象,由 GC 自動管理生命週期;gcnew:在托管堆分配對象,返回 ^;%:追蹤引用 (類似 C++ &,但用於托管類型);delegate / EventHandler:類型安全的回調/事件機制;[STAThread]:標記主線程為單執行緒單元模式,Windows Forms 必須;Application::Run(form):啟動消息泵,顯示主窗體並進入循環。btn_Click),編寫業務邏輯;F5 運行調試。// 設計器中拖入 TableLayoutPanel,設置 RowCount/ColumnCount、RowStyles/ColumnStyles (Percent/Absolute/AutoSize)
// 控件放入單元格,設置 Dock=Fill,自動隨容器縮放
// 假設有 DataTable^ dt 已填充數據
BindingSource^ bs = gcnew BindingSource();
bs->DataSource = dt;
dataGridView1->DataSource = bs;
// 導航控件:bindingNavigator1->BindingSource = bs;
// 文本框綁定:txtName->DataBindings->Add("Text", bs, "Name");
// MFC 對話框中嵌入 Windows Forms 控件
// 1. 項目屬性 → Common Language Runtime Support → /clr
// 2. #include <WindowsFormsIntegration.h> (需引用 WindowsFormsIntegration.dll)
// 3. 使用 ElementHost (WPF) 或直接在 MFC 窗口創建 Form^ 並 SetParent
// 反向:Windows Forms 中調用 MFC DLL 導出函數 (P/Invoke 或 C++/CLI 包裝層)
.h/.cpp 編譯為 .netmodule 或混合 DLL),供 C# 主程序調用;NativeAOT、單文件發布、剪裁部署,大幅改善啟動速度與體積。C++/CLI 是連接原生 C++ 與 .NET 世界的強力膠水,但**不建議用於編寫大量 UI 邏輯** — 讓專業的語言做專業的事,C++ 專注核心算法與系統編程,C# 專注 UI 與業務流轉。