Windows程序设计 读书笔记 鼠标。

一、检测鼠标:

判断是否有鼠标: GetSystemMetrics(SM_MOUSEPRESENT);//WINDOWS98后有效

判断鼠标几个键:GetSystemMetrics(SM_CMOUSEBUTTONS);//WINDOWS98后有效

二、鼠标消息,总共21个:

客户区消息

#define WM_MOUSEMOVE                    0x0200
#define WM_LBUTTONDOWN                  0x0201
#define WM_LBUTTONUP                    0x0202
#define WM_LBUTTONDBLCLK                0x0203
#define WM_RBUTTONDOWN                  0x0204
#define WM_RBUTTONUP                    0x0205
#define WM_RBUTTONDBLCLK                0x0206
#define WM_MBUTTONDOWN                  0x0207
#define WM_MBUTTONUP                    0x0208
#define WM_MBUTTONDBLCLK                0x0209

非客户去消息
#define WM_NCMOUSEMOVE                  0x00A0
#define WM_NCLBUTTONDOWN                0x00A1
#define WM_NCLBUTTONUP                  0x00A2
#define WM_NCLBUTTONDBLCLK              0x00A3
#define WM_NCRBUTTONDOWN                0x00A4
#define WM_NCRBUTTONUP                  0x00A5
#define WM_NCRBUTTONDBLCLK              0x00A6
#define WM_NCMBUTTONDOWN                0x00A7
#define WM_NCMBUTTONUP                  0x00A8
#define WM_NCMBUTTONDBLCLK              0x00A9

#define WM_NCHITTEST                    0x0084

lParam 表示鼠标位置,高位y,低位x。对客户区消息来讲,是客户区坐标,对非客户区消息来说,是屏幕坐标。

wParam 对客户区消息来说,表示鼠标键及SHIFT和CTRL状态。

  判断如下:

  wParam & MK_LBUTTON

  wParam & MK_RBUTTON

  wParam & MK_MBUTTON

  wParam & MK_SHIFT

  wParam & MK_CONTROL

这些在处理MOUSEMOVE的时候比较有用,比如在移动中判断是否按下按钮,在移动中是否按着SHIFT或CTRL。

对非客户区消息来说,表示移动或者单击的非客户区位置。

三、鼠标消息的处理过程。

  关键:WM_NCHITTEST,命中测试消息。

    此消息优于其他一切客户消息和非客户鼠标消息。 lParam代表x,y屏幕坐标。wParam没用。

    window应用程序把这个消息发送给DefWindowProc,然后产生基于鼠标位置的所有其他鼠标消息。

    对非客户消息,DefWindowProc的返回值作为wParam的参数,这个值可以是任何非客户区消息加上以下内容:

      HTCLIENT      客户区  //如果是这个,会将屏幕坐标转化为客户区左边,然后产生客户区消息。

      HTNOWHERE     不在窗口中

      HTTRANSPARENT    窗口由另一个窗口覆盖

      HRERROR      使DefWindowProc发出轰鸣声。

    举例:禁止窗口鼠标事件:

      case WM_NCHITTEST:

        return (LRESULT)HTNOWHERE;

四、光标函数:

  LoadCursor

  SetCursor

  ShowCursor

  GetCursorPos

五,如果一个自定义窗口在定义的时候,不包含CS_DBLCLKS,那窗口不会接收到双击事件,只能是两个单击。

六、捕获和释放鼠标。

  SetCapture(hwnd);

  ReleaseCapture();

  捕获鼠标后,不管鼠标在什么地方产生消息,消息都会以客户区消息的方式传送给hwnd窗口。

七、滚动轮。

  滚动轮产生消息:WM_MOUSEWHEEL

  wParam 表明鼠标键及SHIFT\CTRL是否被按下

    wParam的高位表示转动的方向,正为前,负为后,等于120或-120。40为一行,所以滚动一下前进或后退3行。

  lParam 获取鼠标的位置,是相对于屏幕左上角的,而不是客户区的。

原文地址:https://www.cnblogs.com/aoyihuashao/p/1713375.html