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

VC 中鼠標檢測與自定義光標實現指南

     編輯:VC 教學

前言

本文展示如何在 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 等),否則系統不會發送雙擊消息。

三、鼠標消息處理核心

1. 坐標提取與按鍵狀態

case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_MOUSEMOVE:
    ptMouse.x = LOWORD(lParam);  // 低位:X 座標
    ptMouse.y = HIWORD(lParam);  // 高位:Y 座標
    fwKeys = wParam;             // 按鍵組合狀態
    break;

2. 區域檢測與光標切換

定義兩個矩形區域(rect1、rect2),當鼠標進入時切換為自定義光標:

if (PtInRect(&rect1, ptMouse) || PtInRect(&rect2, ptMouse))
    SetCursor(hCursorPen);  // hCursorPen 為 LoadCursor 載入的自定義光標
else
    SetCursor(LoadCursor(NULL, IDC_ARROW)); // 恢復默認

3. 標題欄實時顯示狀態

使用 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);

4. 雙擊繪製座標

在 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 圖形界面開發的基石。建議讀者嘗試擴展:添加拖放操作、繪圖板功能或遊戲級輸入處理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved