鼠标消息
1、鼠标客户区消息 |
---|
当鼠标经过客户区或在客户区内点击时,windows就会向窗口过程发送鼠标客户区消息。windows定义了10种客户区鼠标消息:
-
WM_MOUSEMOVE
消息队列中只能存放一条WM_MOUSEMOVE消息。所以,消息队列中有未处理的WM_MOUSEMOVE消息时,windows不会再把WM_MOUSEMOVE加入消息队列,即使鼠标在移动。 -
WM_LBUTTONDBLCLK、WM_MBUTTONDBLCLK、WM_RBUTTONDBLCLK
DBLCLK双击消息是在快速双击鼠标按键时产生的,第二个BUTTONDOWN消息会被DBLCLK消息替代。一次双击事件产生消息顺序如下:WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONDBLCLK WM_LBUTTONUP
需要注意的是,默认情况下windows不会给窗口发送DBLCLK消息,必须在注册窗口类是显式声明窗口接收DBLCLK消息:
wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLK;
-
WM_LBUTTONDOWN、WM_MBUTTONDOWN、WM_RBUTTONDOWN
-
WM_LBUTTONUP、WM_MBUTTONUP、WM_RBUTTONUP
客户区鼠标消息的lParam参数描述了鼠标客户区坐标,LOWORD(lParam)表示x坐标,HIWORD(lParam)表示y坐标。
wParam参数表示鼠标按键、Shift键和Ctrl键的状态。可以使用windows提供的MK_前缀掩码来测试wParam参数:
#define MK_LBUTTON 0x0001
#define MK_RBUTTON 0x0002
#define MK_SHIFT 0x0004
#define MK_CONTROL 0x0008
#define MK_MBUTTON 0x0010
wParam & MK_SHIFT; // 非0,表示按下了Shift键
正在显示一个模态窗口时,任何窗口都接收不到鼠标消息。
2、鼠标非客户区消息 |
---|
除了客户区消息,windows还定义了鼠标的11种非客户区消息:
- WM_NCLBUTTONDOWN、WM_NCMBUTTONWODN、WM_NCRBUTTONDOWN
- WM_NCLBUTTONUP、WM_NCMBUTTONUP、WM_NCRBUTTONUP
- WM_NCLBUTTONDBLCLK、WM_NCMBUTTONDBLCLK、WM_NCRBUTTONDBLCLK
- WM_NCMOUSEMOVE
前10种非客户区消息的wParam参数表示鼠标位置,被设成windows定义的带HT前缀的标识符。lParam包含鼠标位置的屏幕坐标信息,低位字表示x坐标,高位字表示y坐标。#define HTERROR (-2) #define HTTRANSPARENT (-1) #define HTNOWHERE 0 #define HTCLIENT 1 #define HTCAPTION 2 #define HTSYSMENU 3 #define HTGROWBOX 4 #define HTSIZE HTGROWBOX #define HTMENU 5 #define HTHSCROLL 6 #define HTVSCROLL 7 #define HTMINBUTTON 8 #define HTMAXBUTTON 9 #define HTLEFT 10 #define HTRIGHT 11 #define HTTOP 12 #define HTTOPLEFT 13 #define HTTOPRIGHT 14 #define HTBOTTOM 15 #define HTBOTTOMLEFT 16 #define HTBOTTOMRIGHT 17 #define HTBORDER 18 #define HTREDUCE HTMINBUTTON #define HTZOOM HTMAXBUTTON #define HTSIZEFIRST HTLEFT #define HTSIZELAST HTBOTTOMRIGHT #if(WINVER >= 0x0400) #define HTOBJECT 19 #define HTCLOSE 20 #define HTHELP 21 #endif /* WINVER >= 0x0400 */
- WM_NCHITTEST
WM_NCHITTEST表示“非客户区击中消息测试”,lParam参数包含鼠标位置的屏幕坐标信息,wParam未用。该消息比其他鼠标消息优先级高,windows利用WM_NCHITTEST来产生其他鼠标消息,所以一般把WM_NCHITTEST消息交给DefWindowProc处理。如果是鼠标位于非客户区,DefWindowProc返回带HT前缀的标识符,产生一个非客户区鼠标消息;如果位于客户区,DefWindowProc返回HTCLIENT,把屏幕坐标转成客户区坐标,产生一个客户区鼠标消息。