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

Windows API 入門指南:從訊息機制到 HelloWin 完整解析

     編輯:關於C++

為何學習 Windows API?

雖然 RAD 工具 (VB, Delphi, C++ Builder, MFC, .NET) 提供豐富控件,但它們皆封裝於 Windows API 之上。當需求超出框架封裝範圍 (如底層系統操作、特殊視窗行為、效能極致優化),唯有直接呼叫 API 才能突破限制。

Windows 核心機制:事件驅動 + 訊息佇列

  • 事件驅動:非流程式循序執行,而是回應外部事件 (滑鼠、鍵盤、計時器、網路...)
  • 訊息佇列:系統為每個 GUI 執行緒建立佇列,事件封裝為 MSG 結構排隊
  • 訊息迴圈:應用程式主動從佇列取出訊息並分派處理

WinMain 進入點


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow)
參數說明
hInstance目前執行個體唯一識別碼,載入資源、建立視窗需用
hPrevInstance16 位元遺留,Win32 永遠為 NULL
lpCmdLine命令列參數字串指標 (不含程式名)
nCmdShow視窗初始顯示方式 (SW_SHOWNORMAL 等),由啟動者決定

視窗類別註冊 (RegisterClassEx)


WNDCLASSEX wcex = {0};
wcex.cbSize        = sizeof(WNDCLASSEX);
wcex.style         = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc   = WndProc;
wcex.hInstance     = hInstance;
wcex.hIcon         = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APP));
wcex.hCursor       = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName  = MAKEINTRESOURCE(IDC_APP);
wcex.lpszClassName = szWindowClass;  // 如 "HelloWinClass"
wcex.hIconSm       = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

RegisterClassEx(&wcex);

建立與顯示視窗


HWND hWnd = CreateWindow(
    szWindowClass, TEXT("Hello Windows API"),
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
    NULL, NULL, hInstance, NULL);

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);  // 觸發首次 WM_PAINT

訊息迴圈核心


MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) {
        TranslateMessage(&msg);   // WM_KEYDOWN -> WM_CHAR
        DispatchMessage(&msg);    // 呼叫視窗程序 WndProc
    }
}
  • GetMessage:阻塞等待訊息,收到 WM_QUIT 返回 0 結束迴圈
  • TranslateMessage:將虛擬鍵訊息轉為字元訊息
  • DispatchMessage:依 hwnd 找到視窗程序並呼叫

視窗程序


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    switch (message) {
        case WM_PAINT: {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            TextOut(hdc, 50, 50, TEXT("Hello, Windows API!"), 21);
            EndPaint(hWnd, &ps);
            break;
        }
        case WM_DESTROY:
            PostQuitMessage(0);  // 發送 WM_QUIT 結束訊息迴圈
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

關鍵訊息處理

訊息觸發時機標準處理
WM_PAINT用戶區無效需重繪 (建立、縮放、遮蔽後顯示...)BeginPaint/EndPaint 繪圖
WM_DESTROY視窗銷毀 (點擊關閉鈕、呼叫 DestroyWindow)PostQuitMessage(0)
WM_CREATECreateWindow 成功後,ShowWindow 前初始化資源、建立子控制項
WM_SIZE視窗大小改變調整版面、子控制項位置

學習建議

  1. 先理解 訊息機制 是核心,一切皆訊息
  2. 熟記常用 API 函數分類 (視窗、GDI、檔案、登錄、網路...)
  3. 善用 MSDN 文件查詢參數與回傳值
  4. 從簡單程式 (HelloWin) 開始,逐步加入功能
  5. API 開發無捷徑,需大量閱讀文件與實作累積經驗
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved