Windows 所有 GUI 程序底層最終都調用 Win32 API (C 語言接口)。VB、C#、MFC、Qt、wxWidgets 只是不同層級的封裝。
| 路線 | 代表技術 | 學習曲線 | 性能/體積 | 適用場景 |
|---|---|---|---|---|
| 原生 Win32 API | CreateWindowEx, GetMessage, WndProc | 極陡峭 | 最高/最小 | 驅動、安全軟件、極致體積要求 |
| MFC (VC++ 專用) | CWnd, CDialog, 文檔/視圖架構 | 陡峭 | 高/中等 | 存量 MFC 項目維護 |
| 跨平台 C++ 框架 | Qt (LGPL/商業), wxWidgets, Dear ImGui | 平緩 | 中/大 | 新項目首選,支持 Windows/Linux/macOS/嵌入式 |
# CMakeLists.txt 最小範例
cmake_minimum_required(VERSION 3.16)
project(MyGui LANGUAGES CXX)
find_package(Qt6 REQUIRED COMPONENTS Widgets)
qt_add_executable(MyGui main.cpp mainwindow.cpp)
target_link_libraries(MyGui PRIVATE Qt6::Widgets)
優勢:信號槽機制解耦、豐富控件、Qt Designer 可視化設計、跨平台零修改編譯、商業友好授權選項。
// 最小窗口程序
#include
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
switch (msg) {
case WM_DESTROY: PostQuitMessage(0); return 0;
case WM_PAINT: {
PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps);
TextOut(hdc, 10, 10, L"Hello Win32 API!", 16);
EndPaint(hwnd, &ps); return 0;
}
}
return DefWindowProc(hwnd, msg, wp, lp);
}
int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE, PWSTR, int nShow) {
WNDCLASS wc = { .lpfnWndProc = WndProc, .hInstance = hInst, .lpszClassName = L"Main" };
RegisterClass(&wc);
HWND hwnd = CreateWindowEx(0, L"Main", L"Demo", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hInst, NULL);
ShowWindow(hwnd, nShow);
MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); }
return 0;
}