当前位置: 首页 > 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键的状态。

相关文章:

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

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 MFC鼠标 派发流程 鼠标消息(客户区) 鼠标消息(非客户) 坐标处理 客户区 非客户 坐标转换 示例代码 MFC键盘 击键消息 虚拟键代码 键状态 MFC鼠标 派发流程 消息捕获&#…...

Angular 18.2.0 的新功能增强和创新

一.Angular 增强功能 Angular 是一个以支持开发强大的 Web 应用程序而闻名的平台,最近发布了 18.2.0 版本。此更新带来了许多新功能和改进,进一步增强了其功能和开发人员体验。在本文中,我们将深入探讨 Angular 18.2.0 为开发人员社区提供的…...

matlab 小数取余 rem 和 mod有 bug

目录 前言Matlab取余函数1 mod 函数1.1 命令行输入1.2 命令行输出 2 rem 函数2.1 命令行输入2.2 命令行输出 分析原因注意 前言 在 Matlab 代码中mod(0.11, 0.1) < 0.01 判断为真&#xff0c;mod(1.11, 0.1) < 0.01判断为假&#xff0c;导致出现意料外的结果。 结果发现…...

Avalonia中的数据模板

文章目录 1. 介绍和概述什么是数据模板:数据模板的用途:2. 定义数据模板在XAML中定义数据模板:在代码中定义数据模板:3. 使用数据模板在控件中使用数据模板:数据模板选择器:定义数据模板选择器:在XAML中使用数据模板选择器:4. 复杂数据模板使用嵌套数据模板:使用模板绑…...

Sqlmap中文使用手册 - Techniques模块参数使用

目录 1. Techniques模块的帮助文档2. 各个参数的介绍2.1 --techniqueTECH2.2 --time-secTIMESEC2.3 --union-colsUCOLS2.4 --union-charUCHAR2.5 --union-fromUFROM2.6 --dns-domainDNS2.7 --second-urlSEC2.8 --second-reqSEC 1. Techniques模块的帮助文档 Techniques:These o…...

科普文:kubernets原理

kubernetes 已经成为容器编排领域的王者&#xff0c;它是基于容器的集群编排引擎&#xff0c;具备扩展集群、滚动升级回滚、弹性伸缩、自动治愈、服务发现等多种特性能力。 本文将带着大家快速了解 kubernetes &#xff0c;了解我们谈论 kubernetes 都是在谈论什么。 一、背…...

GO-学习-02-常量

常量是不变的 const package main import "fmt"func main() {//常量定义时必须赋值const pi 3.1415926const e 2.718//一次声明多个常量const(a 1b 2c "ihan")const(n1 100n2n3)//n2,n3也是100 同时声明多个常量时&#xff0c;如果省略了值则表示和…...

Vue系列面试题

大家好&#xff0c;我是有用就扩散&#xff0c;有用就点赞。 1.Vue中组件间有哪些通信方式&#xff1f; 父子组件通信&#xff1a; &#xff08;1&#xff09;props | $emit &#xff08;接收父组件数据 | 传数据给父组件&#xff09; &#xff08;2&#xff09;ref | $refs&a…...

等级保护 总结2

网络安全等级保护解决方案的主打产品&#xff1a; HiSec Insight安全态势感知系统、 FireHunter6000沙箱、 SecoManager安全控制器、 HiSecEngine USG系列防火墙和HiSecEngine AntiDDoS防御系统。 华为HiSec Insight安全态势感知系统是基于商用大数据平台FusionInsight的A…...

关于Redis(热点数据缓存,分布式锁,缓存安全(穿透,击穿,雪崩));

热点数据缓存: 为了把一些经常访问的数据&#xff0c;放入缓存中以减少对数据库的访问频率。从而减少数据库的压力&#xff0c;提高程序的性能。【内存中存储】成为缓存; 缓存适合存放的数据: 查询频率高且修改频率低 数据安全性低 作为缓存的组件: redis组件 memory组件 e…...

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第四十七章 字符设备和杂项设备总结回顾

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…...

C#初级——枚举

枚举 枚举是一组命名整型常量。 enum 枚举名字 { 常量1, 常量2, …… 常量n }; 枚举的常量是由 , 分隔的列表。并且&#xff0c;在这个整型常量列表中&#xff0c;通常默认第一位枚举符号的值为0&#xff0c;此后的枚举符号的值都比前一位大1。 在将枚举赋值给 int 类型的…...

Linux 动静态库

一、动静态库 1、库的理解 库其实是给我们提供方法的实现&#xff0c;如上面的对于printf函数的实现就是在库中实现的&#xff0c;而这个库也就是c标准库&#xff0c;本质也是文件&#xff0c;也有对应的路径 2、区别 静态库是指编译链接时&#xff0c;把库文件的代码全部加入…...

微信小游戏之 三消(一)

首先设定一下 单个 方块 cell 类&#xff1a; 类定义和属性 init 方法 用于初始化方块&#xff0c;接收游戏实例、数据、宽度、道具类型和位置。 onWarning 方法 设置警告精灵的帧&#xff0c;并播放闪烁动作&#xff0c;用于显示方块的警告状态。 grow 方法 根据传入的方向…...

软件测试---Linux

Linux命令使用&#xff1a;为了将来工作中与服务器设备进行交互而准备的技能&#xff08;远程连接/命令的使用&#xff09;数据库的使用&#xff1a;MySQL&#xff0c;除了查询动作需要重点掌握以外&#xff0c;其他操作了解即可什么是虚拟机 通过虚拟化技术&#xff0c;在电脑…...

数据库之数据表基本操作

目录 一、创建数据表 1.创建表的语法形式 2.使用SQL语句设置约束条件 1.设置主键约束 2.设置自增约束 3.设置非空约束 4.设置唯一性约束 5.设置无符号约束 6.设置默认约束 7.设置外键约束 8.设置表的存储引擎 二、查看表结构 1.查看表基本结构 2.查看建表语句 三…...

利用OSMnx求路网最短路径并可视化(二)

书接上回&#xff0c;为了增加多路径的可视化效果和坐标匹配最近点来实现最短路可视化&#xff0c;我们使用图形化工具matplotlib结合OSMnx的绘图功能来展示整个路网图&#xff0c;并特别高亮显示计算出的最短路径。 多起终点最短路路径并计算距离和时间 完整代码#运行环境 P…...

双向门控循环神经网络(BiGRU)及其Python和MATLAB实现

BiGRU是一种常用的深度学习模型&#xff0c;用于处理序列数据的建模和预测。它是基于GRU&#xff08;Gated Recurrent Unit&#xff09;模型的改进版本&#xff0c;通过引入更多的隐藏层和增加网络的宽度&#xff0c;能够更好地捕捉复杂的序列数据中的模式。 背景&#xff1a;…...

【BUG】已解决:ERROR: Failed building wheel for jupyter-nbextensions-configurator

ERROR: Failed building wheel for jupyter-nbextensions-configurator 目录 ERROR: Failed building wheel for jupyter-nbextensions-configurator 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我…...

Unity UGUI 之 自动布局组件

本文仅作学习笔记与交流&#xff0c;不作任何商业用途 本文包括但不限于unity官方手册&#xff0c;唐老狮&#xff0c;麦扣教程知识&#xff0c;引用会标记&#xff0c;如有不足还请斧正 本文在发布时间选用unity 2022.3.8稳定版本&#xff0c;请注意分别 1.什么是自动布局组件…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式

简介 在我的 QT/C 开发工作中&#xff0c;合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式&#xff1a;工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...