六.鼠标消息
1.鼠标消息分类
- 基本鼠标消息
- WM_LBUTTONDOWN----鼠标左键按下
- WM_RBUTTONDOWN----鼠标右键按下
- WM_LBUTTONUP----鼠标左键抬起
- WM_RBUTTONUP----鼠标右键抬起
- WM_MOUSEMOVE----鼠标移动消息
- 双击消息
- WM_LBUTTONBLOCK----鼠标左键双击
- WM_RBUTTONBLOCK----鼠标右键双击
- 滚轮消息
- WM_MOUSEWHEEL----鼠标滚轮消息
2.鼠标基本消息
- WM_LBUTTONDOWN----鼠标左键按下
- WM_RBUTTONDOWN----鼠标右键按下
- WM_LBUTTONUP----鼠标左键抬起
- WM_RBUTTONUP----鼠标右键抬起
- WM_MOUSEMOVE----鼠标移动消息
- 产生时间:当鼠标有动作时
- 附加信息:
- wParam:其他按键状态,例如Ctrl/Shift按键状态
- lParam:鼠标的位置,窗口客户区坐标系
- LOWORD x
- HIWORD y
- 一般情况下,按下/抬起消息成对出现,在鼠标移动过程中,会根据移动速度,产生一系列WM-MOUSEMOVE消息。
3.鼠标双击消息
- WM_LBUTTONBLCLK----鼠标左键双击
- WM_RBUTTONBLCLK----鼠标右键双击
- 附加信息:
- wParam:其他按键状态(Ctrl,Shift等)
- lParam:鼠标位置,窗口客户区坐标系
- 消息产生顺序:
- 这里我们以双击左键为例:
- 1.WM_LBUTTONDOWN
- 2.WM_LBUTTONUP
- 3.WM_LBUTTONBLCLK
- 4.WM_LBUTTONUP
- 使用时注意要在注册窗口时增加CS_DBLCLKS风格
4.鼠标滚轮消息
WM_MOUSEWHEEL
- 附加信息:
- wParam:
- LOWORD: 其他按键状态
- HIWORD:滚轮的偏移量,通过正负值可以确定滚轮滚动方向(正:向前滚动,负:向后滚动
- lParam:鼠标当前位置(屏幕坐标系)
- LOWORD:x
- HIWORD:y
- 使用:通过偏移量,获取滚动方向和距离
我们来到回调函数中来处理鼠标消息:
LRESULT CALLBACK WindowProc( IN HWND hwnd, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam ) { char output[256] = { 0 }; switch (uMsg) { //常见消息 case WM_QUIT: { MessageBox(hwnd, "确定退出程序吗?", "退出", MB_YESNO); break; } case WM_DESTROY: { sprintf(output, TEXT("窗口即将被销毁,将向消息队列中发送WM_QUIT消息")); WriteConsole(g_hOUTPUT,output,strlen(output), 0, 0); PostMessage(NULL, WM_QUIT, 0, 0); break; } case WM_SYSCOMMAND: { sprintf(output, TEXT("检测到WM_COMMAND消息,将弹出提示窗口\n")); WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0); MessageBox(hwnd, "记住我!!!", "别忘了", MB_YESNO); break; } case WM_CREATE: { sprintf(output, TEXT("检测到WM_CREATE消息,将创建窗口。\n")); WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0); break; } case WM_SIZE: { sprintf(output, "lParam:窗口宽变化为:%d,窗口高变化为:%d \n", HIWORD(lParam), LOWORD(lParam)); WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0); break; } //键盘消息 case WM_KEYDOWN: { sprintf(output, "检测到WM_KEYDOWN消息,键码值:%d.\n", wParam); WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0); break; } case WM_KEYUP: { sprintf(output, "检测到WM_KEYUP消息,键码值:%d.该按键被放开\n", wParam); WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0); break; } //鼠标消息 case WM_LBUTTONDOWN: { sprintf(output, "检测到WM_LBUTTONDOWN消息,鼠标左键被按下。\n"); WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0); break; } case WM_LBUTTONUP: { sprintf(output, "检测到WM_LBUTTONUP消息,鼠标左键被放开。\n"); WriteConsole(g_hOUTPUT, output, strlen(output),0,0); break; } case WM_RBUTTONDOWN: { sprintf(output, "检测到WM_RBUTTON消息,鼠标右键被按下。\n"); WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0); break; } case WM_RBUTTONUP: { sprintf(output, "检测到WM_RBUTTON消息,鼠标右键被放开。\n"); WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0); } case WM_MOUSEMOVE: { sprintf(output, "检测到WM_MOUSEMOVE消息,鼠标移动中,鼠标位置(%d,%d).\n", LOWORD(lParam), HIWORD(lParam)); WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0); break; } case WM_MOUSEWHEEL: { sprintf(output, "鼠标滚轮滚动中,偏移量:%d,鼠标当前位置(%d,%d)\n",HIWORD(wParam), LOWORD(lParam), HIWORD(lParam)); WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0); break; } } return DefWindowProc(hwnd, uMsg, wParam, lParam); }
我看看看处理效果:
七.定时器消息
1.定时器消息介绍
- 产生时间:
在程序中创建定时器,当达到时间间隔时,定时器会向(实际上是GetMessage函数)程序发送一个WM-TIMER消息。定时器的精度是毫秒,但是准确度极低(原因是:我们在上文中深谈GetMessage函数的时候讲过,当没有消息时,GetMessage函数会做很多事情,只有当前面的事都做完了之后才会检查定时器),例如设置间隔为1000ms,但是会在非1000ms时发送消息。 - 附加消息:
- wParam:定时器ID
- lParam:定时器出席函数的指针
2.创建和销毁定时器
- 创建定时器
UINT_PTR SetTimer( HWND hWnd, //定时器窗口句柄 UINT_PTR nIDEvent, //定时器ID UINT uElapse, //时间间隔(ms) TIMEPROC lpTimeFunc //定时器函数处理指针,一般不使用,设置为NULL );创建成功返回非0,失败返回0
- 关闭定时器
BOOL killTimer( HWND hWnd, //定时器窗口聚句柄 UINT UideVENT //定时器ID );
今天的内容就分享到这里,如果文章中出现错误之处或者是我个人理解不到位的地方,还请大家指出来,我会非常虚心地学习,下一篇文章我们来为大家讲解Windows程序资源。