本文示範如何在 Win32 SDK 環境下,透過視窗程序處理滑鼠訊息,實現滑鼠座標追蹤、按鍵狀態偵測、自訂游標切換與雙擊繪圖等基本功能。程式碼結構清晰,適合初學者理解 Windows 訊息機制與 GDI 繪圖基礎。
ckzc):設定支援雙擊 (CS_DBLCLKS)、載入圖示與游標、註冊類別 MouseWClass。ckcj):建立標題為「我的滑鼠---cnscom」的重疊視窗並顯示。WinMain):標準 GetMessage/DispatchMessage 迴圈。WndProc):核心邏輯,處理 WM_CREATE、WM_MOUSEMOVE、WM_LBUTTONDOWN、WM_RBUTTONDOWN、WM_LBUTTONDBLCLK、WM_RBUTTONDBLCLK、WM_PAINT、WM_DESTROY 等訊息。POINT ptMouse;
ptMouse.x = LOWORD(lParam); // 水平座標
ptMouse.y = HIWORD(lParam); // 垂直座標
DWORD fwKeys = wParam; // 按鍵與鍵盤修飾鍵組合
預先定義兩個矩形區域 rect1、rect2,當滑標進入區域時切換為自訂游標 (RCCURSOR):
if (PtInRect(&rect1, ptMouse) || PtInRect(&rect2, ptMouse))
SetCursor(hCursorPen);
使用 wsprintf 格式化座標與按鍵狀態 (MK_CONTROL, MK_SHIFT, MK_LBUTTON, MK_RBUTTON),再呼叫 SetWindowText 更新標題列。
左鍵雙擊顯示紅色、右鍵雙擊顯示藍色,使用 GetDC/TextOut/ReleaseDC 即時繪製。
WM_CREATE 載入游標與位圖資源,WM_PAINT 使用 BitBlt 繪製太陽/月亮圖示,WM_DESTROY 釋放 hSun/hMoon 並發送 PostQuitMessage。
LRESULT APIENTRY WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
// ... 變數宣告 ...
switch(message)
{
case WM_CREATE:
// 初始化矩形區域、載入自訂游標
break;
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_MOUSEMOVE:
// 座標擷取、區域判斷、游標切換、標題列更新
break;
case WM_LBUTTONDBLCLK:
case WM_RBUTTONDBLCLK:
// 取得 DC、設定顏色、輸出座標文字
break;
case WM_PAINT:
// 雙緩衝繪製位圖
break;
case WM_DESTROY:
// 釋放資源、結束程式
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
此範例涵蓋了 Win32 滑鼠程式設計的核心要素:訊息處理、座標運算、區域測試、游標管理、GDI 繪圖與資源釋放。初學者可由此延伸實作更複雜的滑鼠互動應用。