首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

Windows 程式設計入門:從主控台到視窗程式的最小實作

     編輯:關於VC++

三個層次的 Hello World

層次 1:標準 C 主控台程式

#include 
int main() {
    printf("Hello world\n");
    return 0;
}

最基礎的 C 程式,輸出到主控台視窗。

層次 2:呼叫 Windows API 的主控台程式

#include 
int main() {
    MessageBox(NULL, "Hello World", "window", MB_OK);
    return 0;
}

雖然呼叫了 MessageBox,但仍是主控台子系統,執行時會出現黑底視窗。

層次 3:真正的 Windows GUI 程式 (WinMain 進入點)

#include 
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nShow) {
    MessageBox(NULL, "Hello World", "window", MB_OK);
    return 0;
}

關鍵差異:

  • 進入點改為 WinMain
  • 連結器設定為 /SUBSYSTEM:WINDOWS (VC6: Project → Settings → Link → Subsystem: Windows)
  • 不再出現主控台視窗

完整視窗程式骨架

建立真正的視窗需完成:視窗類別註冊 → 建立視窗 → 訊息迴圈 → 視窗程序。

完整程式碼

#include 

// 視窗程序前向宣告
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nShow) {
    HWND hwnd;
    MSG msg;
    WNDCLASS wc = {0};

    // 1. 設定視窗類別
    wc.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH);  // 深灰背景
    wc.hInstance = hInst;
    wc.lpfnWndProc = WndProc;
    wc.lpszClassName = "test";
    wc.style = CS_VREDRAW | CS_HREDRAW;  // 垂直/水平重繪

    // 2. 註冊視窗類別
    if (!RegisterClass(&wc)) return 0;

    // 3. 建立視窗
    hwnd = CreateWindow("test", "test", WS_OVERLAPPED | WS_SYSMENU,
                        0, 0, 300, 200, NULL, NULL, hInst, NULL);
    if (!hwnd) return 0;

    // 4. 顯示與更新
    ShowWindow(hwnd, nShow);
    UpdateWindow(hwnd);

    // 5. 訊息迴圈
    while (TRUE) {
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
            if (msg.message == WM_QUIT) break;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return 0;
}

// 視窗程序:處理視窗訊息
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    switch (msg) {
        case WM_DESTROY:
            PostQuitMessage(0);  // 發送 WM_QUIT 結束迴圈
            break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);  // 預設處理
    }
    return 0;
}

核心概念對照表

元素說明
WNDCLASS視窗類別結構,定義視窗行為與外觀
RegisterClass向系統註冊視窗類別
CreateWindow依類別建立視窗實體
ShowWindow / UpdateWindow顯示視窗並觸發首次 WM_PAINT
PeekMessage / GetMessage從佇列取得訊息 (PeekMessage 不阻塞)
TranslateMessage將虛擬鍵訊息轉為字元訊息 (WM_CHAR)
DispatchMessage將訊息分派給視窗程序
WndProc視窗程序,處理特定訊息
DefWindowProc預設視窗程序,處理未自行處理的訊息
WM_DESTROY視窗銷毀時發送,應呼叫 PostQuitMessage

編譯設定重點 (VC6)

  • 專案類型:Win32 Application (非 Console)
  • 進入點:自動識別 WinMain
  • 子系統:Linker → System → Subsystem: Windows (/SUBSYSTEM:WINDOWS)
  • 字元集:建議使用 Unicode (Entry point: wWinMain, 字串加 L 前綴)

學習路徑建議

  1. 理解 WinMain 與 main 差異
  2. 掌握視窗類別註冊流程
  3. 熟悉訊息迴圈機制
  4. 學會在 WndProc 處理 WM_PAINT、WM_KEYDOWN、WM_MOUSEMOVE 等常用訊息
  5. 進階至 MFC / WTL / 現代 C++ 框架
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved