当前位置: 首页 > news >正文

Windows图形界面(GUI)-MFC-C/C++ - 键鼠操作

  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> ​​​链接点击跳转博客主页

目录

MFC鼠标

派发流程

鼠标消息(客户区)

鼠标消息(非客户)

坐标处理

客户区

非客户

坐标转换

示例代码

MFC键盘

击键消息

虚拟键代码

键状态


MFC鼠标

派发流程
  • 消息捕获:当鼠标在屏幕上移动或点击时,Windows捕获这些事件,并生成相应的消息。
  • 消息队列:Windows将这些消息放入应用程序的消息队列中。
  • 消息循环:应用程序的消息循环(通常在主窗口的消息泵中)从消息队列中取出消息。
  • 消息派发:消息循环将消息派发给相应的窗口处理。对于客户区消息,这些消息通常由窗口的视图类或主窗口类处理;对于非客户区消息,这些消息由窗口的非客户区处理函数处理。
  • 消息处理:窗口接收到消息后,通过消息映射机制调用相应的消息处理函数进行处理。
鼠标消息(客户区)

  • WM_MOUSEMOVE
  • WM_LBUTTONDOWN
  • WM_LBUTTONUP
  • WM_LBUTTONDBLCLK
  • WM_RBUTTONDOWN
  • WM_RBUTTONUP
  • WM_RBUTTONDBLCLK
鼠标消息(非客户)

  • WM_NCHITTEST
  • WM_NCLBUTTONDOWN
  • WM_NCLBUTTONUP
  • WM_NCLBUTTONDBLCLK
坐标处理

  • 客户区
    • 客户区坐标是指窗口内部可用于绘制内容的区域坐标。这个区域的坐标原点(0,0)通常位于窗口的左上角。在客户区坐标系统中,X轴向右增加,Y轴向下增加。
    • 原点:窗口的左上角。
    • X轴:向右为正。
    • Y轴:向下为正。
  • 非客户
    • 非客户区坐标是指窗口的非客户区域,包括标题栏、边框、滚动条等部分的坐标。非客户区的坐标系统是屏幕坐标系统,其原点(0,0)位于屏幕的左上角。
    • 原点:屏幕的左上角。
    • X轴:向右为正。
    • Y轴:向下为正。
坐标转换

  • 在处理窗口事件时,经常需要在这两种坐标系统之间进行转换。
  • ScreenToClient: 将屏幕坐标转换为客户区坐标。
  • ClientToScreen: 将客户区坐标转换为屏幕坐标。
示例代码
#include "main.h"CMyApp MyApp;BOOL CMyApp::InitInstance()
{m_pMainWnd = new CMainWnd;m_pMainWnd->ShowWindow(m_nCmdShow);m_pMainWnd->UpdateWindow();return TRUE;
}CMainWnd::CMainWnd()
{Create(NULL, NULL);
}BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_NCLBUTTONDOWN()ON_WM_NCLBUTTONUP()
END_MESSAGE_MAP()void CMainWnd::OnLButtonDown(UINT nFlags, CPoint point)
{CString strPoint;strPoint.Format(_T("OnLButtonDown %d - %d\r\n"), point.x, point.y);OutputDebugString(strPoint);
}void CMainWnd::OnLButtonUp(UINT nFlags, CPoint point)
{CString strPoint;strPoint.Format(_T("OnLButtonUp %d - %d\r\n"), point.x, point.y);OutputDebugString(strPoint);
}void CMainWnd::OnNcLButtonDown(UINT nHitTest, CPoint point)
{CString strPoint;strPoint.Format(_T("OnNcLButtonDown %d - %d\r\n"), point.x, point.y);OutputDebugString(strPoint);CFrameWnd::OnNcLButtonDown(nHitTest, point);
}void CMainWnd::OnNcLButtonUp(UINT nHitTest, CPoint point)
{CString strPoint;strPoint.Format(_T("OnNcLButtonUp %d - %d\r\n"), point.x, point.y);OutputDebugString(strPoint);CFrameWnd::OnNcLButtonUp(nHitTest, point);
}void CMainWnd::OnNcLButtonDblClk(UINT nHitTest, CPoint point)
{if (nHitTest != HTCAPTION){CFrameWnd::OnNcLButtonDblClk(nHitTest, point);}
}LRESULT CMainWnd::OnNcHitTest(CPoint point)
{UINT uHit = CFrameWnd::OnNcHitTest(point);if (uHit == HTCLIENT){uHit = HTCAPTION;}return uHit;
}
BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()void CMainWnd::OnLButtonDown(UINT nFlags, CPoint point)
{m_Flg = TRUE;m_str = point;m_End = point;
}void CMainWnd::OnLButtonUp(UINT nFlags, CPoint point)
{if (m_Flg){m_Flg = FALSE;m_End = point;CClientDC dc(this);dc.MoveTo(m_str);dc.LineTo(point);}}void CMainWnd::OnMouseMove(UINT nFlags, CPoint point)
{if (m_Flg){CClientDC dc(this);DrawLine(&dc, m_str, m_End);DrawLine(&dc, m_str, point);m_End = point;}}VOID CMainWnd::DrawLine(CDC* pDC, CPoint str, CPoint end)
{INT nOld = pDC->SetROP2(R2_NOT);pDC->MoveTo(m_str);pDC->LineTo(end);pDC->SetROP2(nOld);
}

MFC键盘

击键消息
  • WM_KEYDOWN:非系统键被按下。
  • WM_KEYUP:非系统键被释放。
  • WM_SYSKEYDOWN:系统键(通常是Alt键)被按下。
  • WM_SYSKEYUP:系统键被释放。
虚拟键代码
  • 虚拟键代码(Virtual-Key Codes)是Windows用来标识键盘上每个键的唯一值。例如,VKA代表字母A,VKSHIFT代表Shift键等。
键状态
  • 在MFC中,可以使用GetKeyState函数来获取特定键的状态,例如Shift、Ctrl或Alt键的状态。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++《类和对象》(中)
  • [极客大挑战 2019]BabySQL1
  • AT_abc001_1
  • 视频编辑软件会声会影Corel VideoStudio2023安装图文激活教程
  • Redis:快速键值存储的入门指南
  • javascript 如何将 json 格式数组转为 excel 表格| sheetJS
  • SQL labs-SQL注入(五,使用sqlmap进行cookie注入)
  • NS4890C 2.4W 单声道AB类音频放大器
  • repo中的default.xml文件project name为什么一样?
  • 初识C++ · map和set的使用
  • Cocos Creator2D游戏开发-(1)初始化设置
  • ElasticSearch(六)— 全文检索
  • MySQL数据库(基础篇)
  • .net core 外观者设计模式 实现,多种支付选择
  • Vue事件总线(EventBus)的概念、使用以及注意事项
  • 【笔记】你不知道的JS读书笔记——Promise
  • 2019年如何成为全栈工程师?
  • CSS魔法堂:Absolute Positioning就这个样
  • css属性的继承、初识值、计算值、当前值、应用值
  • es的写入过程
  • HTTP那些事
  • idea + plantuml 画流程图
  • STAR法则
  • uni-app项目数字滚动
  • vue自定义指令实现v-tap插件
  • 阿里云Kubernetes容器服务上体验Knative
  • 服务器从安装到部署全过程(二)
  • 给第三方使用接口的 URL 签名实现
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 基于webpack 的 vue 多页架构
  • 基于游标的分页接口实现
  • 前端设计模式
  • 前端性能优化——回流与重绘
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 三栏布局总结
  • 深入浅出webpack学习(1)--核心概念
  • 说说动画卡顿的解决方案
  • 消息队列系列二(IOT中消息队列的应用)
  • 在weex里面使用chart图表
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • elasticsearch-head插件安装
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • # C++之functional库用法整理
  • # 安徽锐锋科技IDMS系统简介
  • #include
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • #知识分享#笔记#学习方法
  • $.proxy和$.extend
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (day 12)JavaScript学习笔记(数组3)
  • (poj1.2.1)1970(筛选法模拟)