本文展示如何在 Win32 應用程序中實現鼠標位置檢測、按鍵狀態監聽以及自定義光標切換。適合 Windows 編程初學者掌握基本消息循環、窗口註冊與鼠標消息處理流程。
標準 Win32 應用程序包含三大核心組件:
ckzc 函數):定義窗口類風格、圖標、光標、背景刷等ckcj 函數):創建主窗口、顯示與更新WinMain):獲取、翻譯、分發消息WNDCLASSEX wcexMouse;
wcexMouse.cbSize = sizeof(WNDCLASSEX);
wcexMouse.style = CS_DBLCLKS; // 支持雙擊
wcexMouse.lpfnWndProc = MainWndProc; // 窗口過程
wcexMouse.hCursor = LoadCursor(NULL, IDC_ARROW); // 默認箭頭光標
wcexMouse.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wcexMouse.lpszClassName = L"MouseWClass";
// 兼容性註冊:先試 RegisterClassEx,失敗則退回 RegisterClass
關鍵點:CS_DBLCLKS 風格啟用雙擊消息(WM_LBUTTONDBLCLK 等),否則系統不會發送雙擊消息。
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_MOUSEMOVE:
ptMouse.x = LOWORD(lParam); // 低位:X 座標
ptMouse.y = HIWORD(lParam); // 高位:Y 座標
fwKeys = wParam; // 按鍵組合狀態
break;
定義兩個矩形區域(rect1、rect2),當鼠標進入時切換為自定義光標:
if (PtInRect(&rect1, ptMouse) || PtInRect(&rect2, ptMouse))
SetCursor(hCursorPen); // hCursorPen 為 LoadCursor 載入的自定義光標
else
SetCursor(LoadCursor(NULL, IDC_ARROW)); // 恢復默認
使用 wsprintf 格式化字符串,lstrcat 拼接按鍵信息,最後 SetWindowText 更新窗口標題:
wsprintf(szTitle, L"鼠標測試程序 ---- 鼠標位置:[%d,%d]", ptMouse.x, ptMouse.y);
if (fwKeys) {
lstrcat(szTitle, L" ---- 您按下了");
if (fwKeys & MK_CONTROL) lstrcat(szTitle, L"Ctrl ");
if (fwKeys & MK_SHIFT) lstrcat(szTitle, L"Shift ");
if (fwKeys & MK_LBUTTON) lstrcat(szTitle, L"鼠標左鍵");
if (fwKeys & MK_RBUTTON) lstrcat(szTitle, L"鼠標右鍵");
lstrcat(szTitle, L"鍵");
}
SetWindowText(hWnd, szTitle);
在 WM_LBUTTONDBLCLK/WM_RBUTTONDBLCLK 中直接於設備上下文繪製:
hDc = GetDC(hWnd);
SetTextColor(hDc, (msg == WM_LBUTTONDBLCLK) ? RGB(255,0,0) : RGB(0,0,255));
wsprintf(szTitle, L"(%d,%d)", LOWORD(lParam), HIWORD(lParam));
TextOut(hDc, LOWORD(lParam), HIWORD(lParam), szTitle, lstrlen(szTitle));
ReleaseDC(hWnd, hDc);
WM_PAINT:使用 BeginPaint/EndPaint,創建兼容 DC,BitBlt 繪製位圖(hSun、hMoon)WM_DESTROY:釋放 GDI 對象(DeleteObject),發送 PostQuitMessage| 技術點 | API/宏 | 說明 |
|---|---|---|
| 坐標提取 | LOWORD/HIWORD | 從 lParam 解析 X/Y |
| 按鍵狀態 | wParam & MK_* | 檢測 Ctrl/Shift/左右鍵 |
| 矩形命中測試 | PtInRect | 判斷點是否在矩形內 |
| 光標切換 | SetCursor | 動態改變鼠標外觀 |
| 自定義光標 | LoadCursor(hInst, MAKEINTRESOURCE(ID)) | 從資源加載 |
| 雙擊支持 | CS_DBLCLKS | 窗口類風格必須設置 |
本例完整演示了從窗口創建到鼠標交互的全流程。掌握消息循環、坐標處理、區域檢測、光標管理等基礎技能,是進階 Windows 圖形界面開發的基石。建議讀者嘗試擴展:添加拖放操作、繪圖板功能或遊戲級輸入處理。