一、基本鼠标消息
WM_LBUTTONDOWN - 鼠标左键按下 WM_LBUTTONUP - 鼠标左键抬起 WM_RBUTTONDOWN - 鼠标右键按下 WM_RBUTTONUP - 鼠标右键抬起 WM_MOUSEMOVE - 鼠标移动消息
1、消息参数:
WPARAM,其他按键的状态,例如Ctrl/Shift等
LPARAM, 鼠标的位置,窗口客户区坐标系。
LOWORD,X坐标位置
HIWORD,Y坐标位置,
2、鼠标消息使用:
一般情况鼠标按下/抬起成对出现。在鼠标移动过程中,会根据移动速度产生一系列的WM_MOUSEMOVE消息。
3、相关代码:
case WM_MOUSEMOVE: //鼠标移动(hWnd,lParam); break; case WM_PAINT: 绘图(hWnd); break; case WM_LBUTTONDOWN: 左键按下(hWnd,wParam,lParam); break; case WM_LBUTTONUP: 左键抬起(hWnd, wParam, lParam); break; void 左键按下(HWND hWnd, WPARAM wParam, LPARAM lParam) { wchar_t str[256] = { 0 }; swprintf_s(str, L"左键按下:键盘状态:%08X,鼠标坐标(X:%d,Y:%d)\n",wParam,LOWORD(lParam),HIWORD(lParam) ); WriteConsole(g_DOS窗口句柄, str, wcslen(str), NULL, NULL);//DOS显示 } void 左键抬起(HWND hWnd, WPARAM wParam, LPARAM lParam) { wchar_t str[256] = { 0 }; swprintf_s(str, L"左键抬起:键盘状态:%08X,鼠标坐标(X:%d,Y:%d)\n", wParam, LOWORD(lParam), HIWORD(lParam)); WriteConsole(g_DOS窗口句柄, str, wcslen(str), NULL, NULL);//DOS显示 } void 绘图(HWND hWnd) { PAINTSTRUCT p = { 0 }; HDC hdc = BeginPaint(hWnd, &p); TextOut(hdc, g_x, g_y, L"哎呦", 2); EndPaint(hWnd, &p); } void 鼠标移动(HWND hWnd, LPARAM lParam) { g_x = LOWORD(lParam); g_y = HIWORD(lParam); InvalidateRect(hWnd, NULL, TRUE); }
4、运行结果:
二、双击消息
WM_LBUTTONDBLCLK - 鼠标左键双击 WM_RBUTTONDBLCLK - 鼠标右键双击
1、消息参数:
WPARAM,其他按键的状态,例如Ctrl/Shift等
LPARAM ,鼠标的位置,窗口客户区坐标系。
LOWORD,X坐标位置
HIWORD,Y坐标位置
使用时需要在注册窗口类的时候添加CS_DBLCLKS 风格,否则窗口接收不到双击消息
wc.style = CS_HREDRAW | CS_VREDRAW|CS_DBLCLKS; //窗口变化,会重绘,窗口类的一般风格
2、消息产生顺序:
以WM_LBUTTONDBLCLK为例:WM_LBUTTONDOWN,WM_LBUTTONUP, WM_LBUTTONDBLCLK,WM_LBUTTONUP
3、相关代码
case WM_LBUTTONDBLCLK: 左键双击(hWnd,wParam,lParam); break; void 左键双击(HWND hWnd, WPARAM wParam, LPARAM lParam) { wchar_t str[256] = { 0 }; swprintf_s(str, L"左键双击:键盘状态:%08X,鼠标坐标(X:%d,Y:%d)\n", wParam, LOWORD(lParam), HIWORD(lParam)); WriteConsole(g_DOS窗口句柄, str, wcslen(str), NULL, NULL);//DOS显示 }
4、运行结果
三、滚轮消息
WM_MOUSEWHEEL - 鼠标滚轮消息
1、消息参数:WPARAM
LOWORD,其他按键的状态
HIWORD,滚轮的偏移量,是120的倍数,通过正负值表示表示滚动方向。
正:向前滚动
负:向后滚动
LPARAM:鼠标当前的位置,屏幕坐标系
LOWORD:X坐标
HIWORD:Y坐标
2、使用:通过偏移量,获取滚动的方向和倍数。
3、相关代码
case WM_MOUSEWHEEL: 滚轮滑动(hWnd,wParam,lParam); break; void 滚轮滑动(HWND hWnd,WPARAM wParam,LPARAM lParam) { short 偏移量 = HIWORD(wParam); // 偏移量,将无符号转为有符号 wchar_t str[256] = { 0 }; swprintf_s(str, L"滚轮滑动 -- 按键状态:%08X,偏移量:%d,鼠标坐标(%d,%d)\n", LOWORD(wParam),偏移量,LOWORD(lParam),HIWORD(lParam)); WriteConsole(g_DOS窗口句柄, str, wcslen(str), NULL, NULL); }
4、运行结果