7、鼠标

鼠标消息

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,把屏幕坐标转成客户区坐标,产生一个客户区鼠标消息。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值