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 则是没有按下.
坚持两字,简单,轻便,但是真正的执行起来确实需要很长很长时间.当你把坚持两字当做你要走的路,那么你总会成功. 想学习,有问题请加群.群号:725864912(收费)群名称: 逆向学习小分队 群里有大量学习资源. 以及定期直播答疑.有一个良好的学习氛围. 涉及到外挂反外挂病毒 司法取证加解密 驱动过保护 VT 等技术,期待你的进入。
详情请点击链接查看置顶博客 https://www.cnblogs.com/iBinary/p/7572603.html
本文来自博客园,作者:iBinary,未经允许禁止转载 转载前可联系本人.对于爬虫人员来说如果发现保留起诉权力.https://www.cnblogs.com/iBinary/p/9651594.html
欢迎大家关注我的微信公众号.不定期的更新文章.更新技术. 关注公众号后请大家养成 不白嫖的习惯.欢迎大家赞赏. 也希望在看完公众号文章之后 不忘 点击 收藏 转发 以及点击在看功能.![微信公众号](https://images.cnblogs.com/cnblogs_com/iBinary/1827080/o_220306121308_qrcode_for_gh_b8b8f84e4988_258.jpg)
![QQ群](https://images.cnblogs.com/cnblogs_com/iBinary/1827080/o_21062107294320210621152919.png)