四时宝库

程序员的知识宝库

win32编程 -- 鼠标消息(鼠标消息处理)

忙起来的时候感觉什么都不缺,空下来以后才发现什么都没有。。。

---- 网易云热评

一、基本鼠标消息

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、运行结果

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接