• 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 获取鼠标的位置,是相对于屏幕左上角的,而不是客户区的。

  • 相关阅读:
    点云平台之图像算法篇
    点云平台之CloudCompare开发
    点云平台之创建工程文件
    pcl介绍
    原型讲解二:原型是干什么用的
    原型讲解一
    博主平时主要发布什么?
    蒙特利尔大学工学院流程
    ubuntu 开热点
    argos3-simulator
  • 原文地址:https://www.cnblogs.com/aoyihuashao/p/1713375.html
Copyright © 2020-2023  润新知