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 则是没有按下.

MFC控件编程之鼠标跟键盘消息的更多相关文章

  1. MFC控件编程进度条编写

    MFC控件编程进度条编写 一丶进度条编程需要用到的方法 进度条MFC已经帮我们封装好类了. 叫做 CProgressCtrl  进度条编程也很简单. 封装的方法也就那个那几个. GetPos()  获 ...

  2. MFC 控件编程之水平滚动条跟垂直滚动条

    MFC 控件编程之水平滚动条跟垂直滚动条 一点水平滚动条的操作 首先在操作滚动条的时候.我们要知道滚动条的一些属性. 比如我们要设置 最大值 最小值. 以及每次递增的值是多少.都要设置. 所有就有一个 ...

  3. MFC控件编程之组合框跟列表框

    MFC控件编程之组合框跟列表框 一丶简介 如果要使用组合框跟列表框.那么就要知道.组合框列表框是最核心的东西就是索引. 索引是从0开始的. 二丶组合框列表框常用的方法 AddString(字符串) 添 ...

  4. MFC控件编程之复选框单选框分组框

    MFC控件编程之复选框单选框分组框 一丶分组框 分组框 英文叫做 GroubBox 添加了分组框主要就是分组.好看.不重点介绍 二丶单选框 英文: Raido Button 单选框需要注意的事项 1. ...

  5. MFC控件编程之 按钮编辑框.静态文本的使用,以及访问控件的七种方法.

    MFC控件编程之 按钮编辑框.静态文本的使用以及访问控件的七种方法. 一丶按钮.静态文本的通用属性. 他们都有一个属性.就是可以输入标题内容.以及可以自定义控件ID. 创建一个MFC Dlg对话框. ...

  6. MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应

    MFC小程序截图: 一.在MFC中简单使用WebBrowser的ActiveX插件的方法: 见博文:  http://blog.csdn.net/supermanking/article/detail ...

  7. MFC控件GDI编程

    MFC控件GDI编程 一丶学习内容 1.了解常用的GDI函数绘图. 2.使用常用的画笔画刷. 二丶常用的GDI函数绘图 上方则为我们常用的GDI函数了. 画线 矩形. 以及圆 等等. 2.1 画线代码 ...

  8. MFC控件第一讲.DC编程

    MFC控件第一讲.DC编程 一丶简介 什么是DC,DC有什么用. DC成为设备描述符表. DC的作用就是可以进行绘制. 比如我们的窗口都是绘制出来的.  DC可以简单理解为.没一个窗口程序都有一块内存 ...

  9. [MFC] 梳理一个简单的图片处理桌面软件中用到的MFC控件技巧

     前言 前些天应好友之拖,帮忙设计一个简单的图像处理的小软件.朋友把核心算法封装好了,但是是用openCV类似于console的编程环境,要我在此基础上改成MFC桌面程序.下图是做成之后的效果: 我是 ...

随机推荐

  1. P4149 [IOI2011]Race

    对于这道题,明显是点分治,权值等于k,可以用桶统计树上路径(但注意要清空); 对于每颗子树,先与之前的子树拼k,再更新桶,维护t["len"]最小边数; #include < ...

  2. linux的常用指令和配置文件

    一. 常用的指令 mkdir -p 创建文件夹 parents递归创建 ls -alh 查看当前目录内容 cd   切换工作目录 pwd 打印当前工作目录 touch 文件名 创建文件 echo 字符 ...

  3. uni-app 点击切换图标

    前端代码: <template> <view> <image src="../../static/pari/buxihuan.png" v-show= ...

  4. 学习Acegi应用到实际项目中(12)- Run-As认证服务

    有这样一些场合,系统用户必须以其他角色身份去操作某些资源.例如,用户A要访问资源B,而用户A拥有的角色为AUTH_USER,资源B访问的角色必须为AUTH_RUN_AS_DATE,那么此时就必须使用户 ...

  5. 转发对python装饰器的理解

    [Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考   原文  http://blog.csdn.net/sxw3718401/article/details/3951958 ...

  6. REdis zset和double

    平台:x86_64 结论:Zset的最大分数不要超过18014398509481982(17位数字,54位二进制),否则不会得到期望的值. REdis:5.0.4 Zset采用double存储分数值( ...

  7. HTML基本格式和文本元素(标签)介绍

    <!doctype html>//声明文档类型 <html lang="zh-cn">//文档开始,后面是声明是中文页面的意思,en是英语的意思 <h ...

  8. Java 8 特性

    1.简介 毫无疑问,Java 8是自Java  5(2004年)发布以来Java语言最大的一次版本升级,Java 8带来了很多的新特性,比如编译器.类库.开发工具和JVM(Java虚拟机).在这篇教程 ...

  9. 冒泡排序 cpp实现

    #include<bits/stdc++.h> using namespace std; void Bubblesort(int a[],int n){ ;i<n-;i++){ ; ...

  10. Web browse的发展演变

    Web browse 译为中文是网络浏览器或网页浏览器. Web浏览器如今可谓遍地开花,无论你最终选择了什么浏览器,你可能都会举得他们的功能性想当然的,但是你们可能不知道这些Web浏览器是20年发展的 ...