zoukankan      html  css  js  c++  java
  • MFC控件编程之鼠标跟键盘消息

                MFC控件编程之鼠标跟键盘消息

    在MFC中鼠标消息.键盘消息我们很常用.所以说一下.

    鼠标消息分为客户区消息.跟非客户区消息.

    一丶客户区消息

    我们可以处理消息.来进行我们相应的函数即可.

    MFC添加消息的话.可以自己在消息映射表中添加 .可以自己使用工具直接添加.

    消息映射表添加

    学习过MFC原理的应该知道.这里可以添加消息. 自己可以手动添加.我们也可以使用向导来添加.

    void CCDCDlg::OnLButtonDown(UINT nFlags, CPoint point)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
    
        CString str;
        str.Format(TEXT("x坐标 = %d,y 坐标 = %d"), point.x, point.y);
        ::SetWindowText(m_hWnd, str);
    }

    输出我们的鼠标点击的时候的坐标位置.调用 ::SetWindowText设置窗口标题.

    三丶非客户区消息

    非客户区消息就指的标题栏啊等等.这些位置.

    而他们的消息多了一个NC开头.

    例如我们在消息映射表中添加一个NC开头的消息.

    我们也可以使用向导.看自己喜好了.

    代码:

    void CCDCDlg::OnNcLButtonDown(UINT nFlags, CPoint point)
    {
        CString str;
        str.Format(TEXT("非客户区 x坐标 = %d,y 坐标 = %d"), point.x, point.y);
        ::SetWindowText(m_hWnd, str);
    }

    点击标题栏

    如果按照上面写我们点击关闭按钮会关闭不了.原因就是NcLBUTTONDown里面包括了点击关闭按钮的消息.你没有进行处理.此时我们交给父类处理即可.

    void CCDCDlg::OnNcLButtonDown(UINT nFlags, CPoint point)
    {
        CString str;
        str.Format(TEXT("非客户区 x坐标 = %d,y 坐标 = %d"), point.x, point.y);
        ::SetWindowText(m_hWnd, str);
        CDialogEx::OnNcLButtonDown(nFlags,point);
    }

    其中nflags是一个区域划分吗.我们可以自己判断是否是哪个区域会享用.

    例如:

      if (nflags == HTSYSMENU) 判断是否是菜单.... 进行你的操作

    点击客户区

     在我们的鼠标消息到来之前.它会先判断是客户区域还是非客户区域.然后进行转换.才给我们将消息发送过来.

    也就是说我们可以吧客户区转换为非客户区. 比如鼠标点击客户区.其实是点击的非客户区.

    代码如下.

    LRESULT CCDCDlg::OnNcHitTest(CPoint point)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
    
        UINT hit = CDialogEx::OnNcHitTest(point); //获取父类返回的判断是否是客户区还是非客户区
        if (hit == HTCLIENT) //如果是客户区.那么我们转化为非客户区
        {
            hit = HTCAPTION;
        }
        return hit;
    }

    实现的消息

    API: 坐标转为窗口坐标.

    ::ScreenToClient(m_hWnd, &point);

    四丶捕获鼠标

    捕获鼠标也很常用. 比如我们鼠标按下画线.的时候. 鼠标会移动到窗口外边.那这样的话画线就不会成功了.

     实现思路:

      1.鼠标点击.保存一下坐标

      2.鼠标抬起. 创建CClientDc. 使用MoveTo移动到保存的鼠标位置. 

      3.使用dc画线.画出新的位置.

    例如:

    鼠标按下.

    void CCDCDlg::OnLButtonDown(UINT nFlags, CPoint point)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
    
       //保存当前位置.
        m_Point = point;
    }

    m_point是在类中定义的一个成员.

    鼠标抬起
    void CCDCDlg::OnLButtonUp(UINT nFlags, CPoint point)
    {
       //
        CClientDC dc(this);
        dc.MoveTo(m_Point);
        dc.LineTo(point);
    }

    实现截图

    遇到的问题.当我们鼠标拖动到窗口外面之后.就不会画线了.所以我们要捕获鼠标.

      用到的三个API:

      1.SetCapture(); 捕获鼠标.在鼠标按下的时候.

      2.GetCapture(); 获取捕获的鼠标.

      3.ReleaseCapture(); 释放

    代码如下.

    void CCDCDlg::OnLButtonDown(UINT nFlags, CPoint point)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
    
       //保存当前位置.
        m_Point = point;
        SetCapture(); //捕获鼠标
    }
    
    void CCDCDlg::OnLButtonUp(UINT nFlags, CPoint point)
    {
       //
        CClientDC dc(this);
        dc.MoveTo(m_Point);
        dc.LineTo(point);
        if (GetCapture() == this)
        {
            ReleaseCapture();
        }
    }

    这样我们的鼠标移动到客户区外面也可以画线了.

    五丶了解键盘消息中的各位代表的含义

    虚拟键代码  VK_F1... . VK开头的. 头文件中有定义.有兴趣的可以看一下.

    nflgs中的第 14位 为如果先前按下.则为1.否则则为零. 其余的了解即可.

     WM_KEYDOWN WM_KEYUP 可以判断键盘是否按下抬起. 通过nChar 可以确定是哪一个键. 

    六丶API 判断虚拟键码是否按下.

    Windows 为我们提供了一个API.用来检索按键是否被按下.

    GetKeyState(VK_F2)  

    如果返回值为负数. 那么代表了按下. 如果返回值为0.则代表没有按.

    所以我们判断返回值 < 0  则是按下  >0 则是没有按下.

  • 相关阅读:
    LPTHW 笨办法学python 20章
    LPTHW 笨方法学python 19章
    LPTHW 笨方法学python 18章
    LPTHW 笨方法学习python 16章
    hadoop删除节点。
    url中的百分号转译
    thrift编译安装
    python学习:函数的学习
    jsp静态导入和动态导入 笔记
    简要描述cookie和session的区别:
  • 原文地址:https://www.cnblogs.com/iBinary/p/9651594.html
Copyright © 2011-2022 走看看