zoukankan      html  css  js  c++  java
  • [转]鼠标事件简介

    一、鼠标基础

    1、从系统得到鼠标是否存在及相关信息:

    GetSystemMetrics(SM_MOUSEPRESENT);返回值为整型,非0为true,没有安装为0,在windows98中都返回为true;

    GetSystemMetrics(SM_CMOUSEBUTTONS);返回鼠标用几个按键,windows98默认2。

    2、鼠标样式:

           通过在窗口类中设置鼠标的样式,wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);

    3、鼠标三键:

           LBUTTON,MBUTTON,RBUTTON

    二、显示区域鼠标消息:

    窗口接收鼠标消息:只要鼠标跨越窗口或者在某窗口中按下鼠标按键,那么窗口消息处理程序就会收到鼠标消息,不管该窗口是否活动或是否拥有输入焦点。

    1、鼠标在显示区域的消息:

    键   按下                                       释放                             双击

    左   WM_LBUTTONDOWN         WM_LBUTTONUP          WM_LBUTTONDBCLK

    中   WM_MBUTTONDOWN        WM_MBUTTONUP        WM_MBUTTONDBCLK

    右   WM_RBUTTONDOWN        WM_RBUTTONUP          WM_RBUTTONDBCLK

    在这些消息中lParam值均含有鼠标的位置:低字组为x座标,高字组为y座标这两个座标是相对于窗口显示区域左上角的位置

    X=LOWORD(lParam);

    Y=HIWORD(lParma);

    而wParam的值指示鼠标按键以及shift和ctrl键的状态,在这里要用winuser.h中定义的位运算来测试wParam(MK表示鼠标按键)

    MK_LBUTTON 按下左键

    MK_MBUTTON    按下中键

    MK_RBUTTON     按下右键

    MK_SHIFT           按下shift键

    MK_CONTROL 按下Ctrl键

    例如:如果收到了WM_LBUTTONDOWN消息,而且值wparam & MK_SHIFT是非0.你就知道左键按下时也按下了shift键。

    当你把鼠标移动过窗口的显示区域时,windows并不会把每个可能者产生一个WM_MOUSEMOVE消息这是收硬件决定的。

    2、鼠标键盘混合消息:

    与wParam &MK_LBUTTON一样用wParam & MK_MK_CONTROL 也可以确定是否按下了control键。

    3、双击鼠标按键:

    如果你希望在窗口处理程序能处理双击消息,那么你要在RegisterClass初始化窗口类别结构时,必须在窗口风格中包含CS_DBLCLKS识别字:

    Wndclass.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;

    没有包含CS_DBLCLKS时你双击的结果为:

    WM_LBUTTONDOWN

    WM_LBUTTONUP

    WM_LBUTTONDOWN

    WM_LBUTTONUP

    如果加入CS_DB_LCLKS时你的双击结果为:

    WM_LBUTTONDOWN

    WM_LBUTTONUP

    WM_LBUTTONDBLCLK

    WM_LBUTTONUP

    WM_LBUTTONDBLCLK消息简单地替换了第二个WM_LBUTTONDOWN消息

    如果双击中第一次操作完成单击的功能,那么双击这一消息是很容易处理的,第二次按键WM_LBUTTONDBLCLK消息则完成第一次按键以外的事情,双击则实作两个功能:

    第一次是单击那个选中对象,第二次则运行双击的事件。

    三、非显示区域鼠标消息:

        如果鼠标在窗口的显示区域之外但还在窗体中,那么windows就会给窗体发送一条非显示区域鼠标消息,非显示区域包括标题列、功能表和视察滚动列。

    通常你不需要处理非显示区域鼠标消息,而是将这些消息传给DefWindowProc从而使windows执行系统功能,就这方面来说,非显示区域鼠标消息类似于系统键盘消息WM_SYSKEYDOWN、WM_SYSKEYUP、WM_SYSCHAR。

    消息如下:

           键                  按下                            释放                             双击

           左    WM_NCLBUTTONDOWN       WM_NCLBUTTONUP        WM_NCLBUTTONDBLCLK

           中    WM_NCMBUTTONDOWN      WM_NCMBUTTONUP        WM_NCMBUTTONDBLCLK

           右    WM_NCRBUTTONDOWN      WM_NCRBUTTONUP         WM_NCRBUTTONDBLCLK

           wParam参数指明移动或者按鼠标键的非显示区域(HT)

           lParam参数和显示区一样但是他是相对于萤幕坐标

           可以用以下函数来转换:

           ScreenToClient(hwnd,&pt);

    ClientToScreen(hwnd,&pt);

           命中测试消息:

           WM_NCHITTEST,它代表非显示区域中的测试,此消息优先于所有其他显示区域和非显示区域鼠标的消息,lParam参数含有鼠标位置的x和y屏幕座标wParam参数没有用,Windows应用程序通常把这个消息传送DefWindowProc然后winodws用WM_NCHITTEST消息产生与鼠标位置相关的所有其他鼠标消息在处理WM_NCHITTEST时,从DefWindowProc传回的值将成为鼠标消息中的wParam参数这个值可以是任意非显示区域鼠标消息的wParam值再加上以下内容:

           HTCLIENT    显示区域

           HTNOWHERE 不在窗口中

           HTTRANSPARENT 窗体由另一个窗体覆盖

           HTERROR 使DefWindowProc产生获救用的声音

           可以用他来所有的系统键盘功能:

           Case WM_NCHITTEST:

    四、使用键盘模拟鼠标消息:

    一些基本鼠标函数:

    ShowCursor(TRUE);显示鼠标

    ShowCursor(FALSE);不显示鼠标

    POINT pt;GetCursorPos(&pt);返回鼠标位置到pt结构体中。

    SetCursorPos(x,y);使用鼠标移动到x,y坐标上。在这里xy者是显示器的坐标。

    五、拦截鼠标消息:

    一个窗体消息处理程序通常只在鼠标位于窗体显示区域,或非显示区域上时才接收鼠标消息的,一个程序也可能需要在鼠标位于窗口外时接收鼠标消息,如果是这样,程序就要拦截鼠标消息了!

    拦截的解决方案:

    SetCapture(hwnd);

    在这个函数调用之后,windows将所有的鼠标消息发给窗口代号为hwnd的窗体中处理程序,之后收到鼠标消息都是以显示区域消息的形态出现,即使鼠标正在窗口的非显示区域,lParam参数将指示鼠标在显示区域坐标中的位置。要想释放鼠标拦截可以用:

    ReleaseCapture();

    转自 :<http://www.cnblogs.com/mynama/archive/2009/03/17/1414220.html>

  • 相关阅读:
    ubuntu下cmake自动化编译的一个例子
    KL变换和PCA的数学推导
    tensorflow c++ API加载.pb模型文件并预测图片
    tensorflow c++接口的编译安装与一些问题记录
    深度增强学习--总结下吧
    深度增强学习--DPPO
    深度增强学习--DDPG
    深度增强学习--A3C
    tomcat远程调试
    springboot问题记录
  • 原文地址:https://www.cnblogs.com/dyufei/p/2573930.html
Copyright © 2011-2022 走看看