窗体对消息的响应

MFC添加窗体菜单栏和消息响应 在OnCommand函数中 阅读详情
对于鼠标的状态,我专门用了一个全局的变量存放,变量结构体如下:

 static struct MOUSE_EVENT_STRUCT
 {
  // 缓冲状态
  BOOL DblClicked;     // 有效双击次数
  BOOL LButtonWasUp;   // 左键曾经松开
  BOOL RButtonWasUp;   // 右键曾经松开
  BOOL LButtonWasDown; // 左键曾经按下
  BOOL RButtonWasDown; // 右键曾经按下
  short nMouseWheel;   // 滚轮偏移量
  // 当前状态
  int x;               // 当前鼠标X坐标
  int y;               // 当前鼠标Y坐标
  BOOL LButton;        // 左键状态
  BOOL RButton;        // 右键状态
  BOOL MButton;        // 中键状态
 };


而按键消息,则直接从消息循环的 WM_CHAR 获取。因为我打算做的RPG网游对键盘的实时状态并不关心,只需要知道曾经按下过什么键即可。WM_CHAR 从 WndProc 过程获取 keyCode, 传递给 CGame,再由 CGame 传递给  CDesktop 当前的焦点控件 。

然后开始窗口对鼠标的相应问题。

窗口自身有属性: IsMove(); 这个属性决定窗口是否可以移动,并响应鼠标的拖拽。当它返回为True 的时候,窗体进行鼠标坐标判断。

if (窗体是标准矩形)
{
    if (鼠标在拖动响应区)
        开始拖拽窗体
}else{
    if (鼠标不处于子控件之上 && 鼠标处于窗体非透明区域之内)
        开始拖拽窗体。
}


关于拖动响应区

    看下图:

相应区说明


可以看到一个窗体,标题栏写着:调试状态。如果我定义鼠标在红色矩形之内响应拖拽动作,则需要判断鼠标坐标是否在这个矩形之内并且鼠标左键是否按下状态。

这个红色矩形是由CSkin读取皮肤的时候定义的。它的 Left, Top, Right 分别是对应于窗体实际 Left、Top、Right的一个偏移量,而Height则是一个固定值,表示矩形的高度。

首先由CDesktop传入一个响应消息结构的变量指针,再由响应到鼠标、键盘信息的窗体返回,CDesktop再根据返回的信息处理掉一些操作(焦点变换,坐标变换等等),再将最终消息结果返回给CGame处理游戏逻辑事件。

CDesktop关心的信息如下:

响应的窗口:(如果不是当前窗口,设置为当前窗口, 如果为NULL, 则忽略.)
响应的控件:(如果不是当前激活控件, 设置为激活控件, 如果为NULL, 则忽略.)
响应的事件ID:(例如 M_CLICK, M_LBTNDOWN, M_RBTNDOWN..等)
响应的处理函数: 一个函数指针

我的想法是用函数指针去处理响应的消息。每个CWin都保存一个自身的消息处理函数指针地址,如果不是空地址,则接收到响应之后调用其自身的响应处理函数去执行游戏的逻辑事件。把游戏的逻辑事件处理函数都放在一个类里面,声明为static,供CGame调用,这样看起来会比较清晰。

我想这种做法应该比较贴近Windows的事件驱动机制,有点回调函数的味道。
【同花顺公式编辑教程】第3章 获取数据 学习同花顺公式编辑器,其提供的数据有量价数据以及财务数据。在本章中,我们讲解了编辑器执行代码的原理,并给出了可调用数据的汇总表。 阅读详情

相关推荐

ANSYS Maxwell:创建即用型 3D 轴向磁通电机模型

Magnet Length” 是磁体的径向长度。“Magnet Thickness” 是磁体的轴向长度。为了对 AFM 进行更详细的分析,用户需要在 ANSYS Maxwell 中运行 3D FEA 分析。对于 2D 模型,它们类似于 MotorCAD 中的模型,后者对等效的直线电机进行建模。单击“确定”后,将创建一个 3D Maxwell 模型。“长度”是转子铁的轴向长度。然后需要定义定子的“磁芯”尺寸和材料。“长度”是定子铁芯的轴向长度。“转子”# 的极数必须与“定子”中定义的磁极相同。

jkh920184196的博客 1156

窗口分割及消息响应

MFC窗体视口分割及消息响应  一、 窗体视口分割方法:                                                 1、 在此处讲述的是对视口进行的静态分割。 2、 分割详解:  在MFC中要分割窗体视口,就需要用到CSplitterWnd类,但是有时候为了能够对 割实现更多的控制,就需要通过继承CSplitterWnd类来实现.这里讲述的控制是固定分割

cddchina的专栏 1485

5.FxBlue跟单常见问题

fxblue喊单ea和fxblue跟单会在mt4/mt5客户端ea栏目里记录fxblue在跟单复制订单过程中的全面记录。在遇到问题时,我们首先要恢复默认参数尝试,然后再到ea栏找报错提示。 ​ 需要注意的是,是EA选项卡,而不是日志选项卡。 此外,您可以在 MT4/5 软件终端面板的"EA"选项卡中查看跟单记录,您可以通过右键单击 Experts 日志并从 MT4/5 的弹出菜单中选择“打开”来打开每日日志文件以及历史文件。 5.1 No “heartbeat” received 没有收到“心跳” 接收方

weixin_44406393的博客 1874

建立窗体时所响应的消息

创建窗体 ...   1. WM_GETMINMAXINFO    2. WM_NCCREATE    3. WM_NCCALCSIZE    4. WM_CREATE    创建完毕.   显示窗体 ...   1. WM_SHOWWINDOW    2. WM

doc110的专栏 548

DIY电磁炉核心驱动方案:IR2153PBF自振荡半桥芯片实战指南(附电路图)

本文详细介绍了IR2153PBF自振荡半桥驱动芯片在DIY电磁炉核心驱动方案中的实战应用。该芯片集成了振荡器与600V高压驱动能力,仅需少量外围元件即可生成互补带死区的PWM信号,极大简化了半桥逆变电路设计。文章深入解析了其工作原理、关键参数,并提供了完整的电路设计、PCB布局指南及调试步骤,帮助电子爱好者构建稳定高效的感应加热驱动核心。

beer8的博客 585

R语言数据可视化:绘制世界地图的两种方案

本文介绍了两种使用R语言绘制世界地图的方案:包含边界边框和不包含边界边框。无论您选择哪种方案,使用ggplot2包和相关的地理数据包,我们可以轻松地绘制出漂亮的世界地图。R语言提供了丰富的包和函数,使我们能够轻松地绘制世界地图,并根据需求添加边界边框。在本文中,我将介绍两种绘制世界地图的方案:一种包含边界边框,一种不包含边界边框。在上述代码中,我们使用了与方案一相同的数据准备和地图绘制步骤,但省略了添加边界边框的代码。函数的调用,我们可以绘制不包含边界边框的世界地图。方案二:绘制不包含边界边框的世界地图。

CodeMaven的博客 2225

MFC 子窗体响应鼠标滚轮消息

MFC 子窗体响应鼠标滚轮消息flyfish在父窗口重写 PreTranslateMessage BOOL CDlgX::PreTranslateMessage(MSG* pMsg) { if ( pMsg->message == WM_MOUSEWHEEL) { POINT pos; GetCursorPos(&pos); pMsg->

二分掌柜的 8286

24、企业治理、风险与合规:精益思维的应用与实践

本文探讨了如何运用精益思维优化企业治理、风险与合规(GRC)流程,分析了职责分离与合规流程的误区,提出了预防性与检测性控制措施的合理搭配,并通过价值流映射、减少合规反馈循环等方法实现流程优化。以Etsy的PCI-DSS实施为例,展示了如何在满足法规要求的同时保持创新活力。文章还强调了构建协作型GRC文化的重要性,并展望了未来GRC的发展趋势,包括数字化转型、全球化风险管理及与可持续发展的结合。

solidity8miner的博客 104

建立窗体时响应的窗体消息

<br />创建窗体 ...<br />1. WM_GETMINMAXINFO <br />2. WM_NCCREATE <br />3. WM_NCCALCSIZE <br />4. WM_CREATE <br />创建完毕. <br /> <br />显示窗体 ...<br />1. WM_SHOWWINDOW <br />2. WM_WINDOWPOSCHANGING <br />3. WM_WINDOWPOSCHANGING <br />4. WM_ACTIVATEAPP <br />5. WM_N

Neok HOME 838

一文读懂OpenClaw:核心组件与工作原理深度解析

Agent核心:负责理解意图、规划任务、协调执行消息系统:统一的消息格式,实现组件间解耦工具注册表:可扩展的工具系统,支持自定义工具模型适配层:多模型支持,统一API接口安全机制:沙箱隔离、权限确认、操作审计性能优化:并行执行、智能缓存、增量更新理解这些核心组件和工作原理,将帮助你更好地使用OpenClaw,也为后续开发自定义扩展打下坚实基础。在下一篇文章中,我们将详细介绍OpenClaw的界面操作,包括命令行与交互模式的各种技巧。

gaoxiang_120的专栏 833

【SpringBoot笔记44】SpringBoot多数据源配置(方式一:配置多个mapper扫描不同的包路径实现多数据源配置)

在SpringBoot应用开发中,一般情况下,都是只会配置一个数据源信息,之后整个工程都是对当前数据源进行增删改查的操作。但是,在实际开发里面,也有可能会遇到多数据源的情况,例如:当前工程中除了需要访问自己应用的数据库,还需要直接连接第三方系统的数据库进行业务处理,这种情况下,就需要进行多数据源的配置。SpringBoot考虑到了这一点,所以它是支持多数据源的配置的,下面介绍一下如何配置多数据源。

✅ Java 开发工程师 1117

窗体生命周期所响应的消息

创建窗体  ... 1. WM_GETMINMAXINFO        2. WM_NCCREATE             3. WM_NCCALCSIZE             4. WM_CREATE               创建完毕.显示窗体  ... 1. WM_SHOWWINDOW            2. WM_WINDOWPOSCHANGI

嬴政 879

uniapp - 实现免费OCR文字识别方案,用户上传图片后进行扫描识别获取图片上的文字,uniApp纯前端做图片OCR识别——无需服务器进行OCR识别插件(不需要依赖任何SDK或第三方API服务)

uniapp实现orc识别免费的插件识别不花钱,无需第三方OCR文字识别API,uniApp拍照或者选择图片免费识别,纯前端不需要服务器,Uniapp提取图片上的文字,本地ocr识别技术,uni-app图片OCR识别文本,uniapp有没有免费的ocr识别组件,uniapp前端实现文字识别,身份证识别,营业执照识别 (兼容APP、H5、小程序 不需要任何SDK)跨端无SDK方案:Uniapp实现OCR文字,离线OCR识别,uniapp tesseract.js实现文字识别,uniapp文字识别无需依赖sdk

🏆 前端领域优质创作者 4251

建立窗体时所响应的消息。

创建窗体  ...1. WM_GETMINMAXINFO        2. WM_NCCREATE             3. WM_NCCALCSIZE             4. WM_CREATE               创建完毕.显示窗体  ...1. WM_SHOWWINDOW            2. WM_WINDOWPOSCHANGING      3. WM_WI

火狐的专栏 989

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

建立窗体时所响应的消息 (zz)

创建窗体  ...1. WM_GETMINMAXINFO        2. WM_NCCREATE             3. WM_NCCALCSIZE             4. WM_CREATE               创建完毕.显示窗体  ...1. WM_SHOWWINDOW            2. WM_WINDOWPOSCHANGING      3. WM_WIND

898

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

建立窗体时所响应的消息顺序

  创建窗体 ...   1. WM_GETMINMAXINFO   2. WM_NCCREATE   3. WM_NCCALCSIZE  4. WM_CREATE   创建完毕.   显示窗体 ...   1. WM_SHOWWINDOW   2. WM_WINDOWPOSCHANGING   3. WM_WINDOWPOSCHANGING   4. WM_A

206

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

移动窗体的函数,在窗体的WM_LBUTTONDOWN消息中,响应下面的函数

移动窗体的函数,在窗体的WM_LBUTTONDOWN消息中,响应下面的函数void CmyDlg::OnLButtonDown(UINT nFlags, CPoint point){    SendMessage(WM_NCLBUTTONDOWN,                HTCAPTION,                MAKELPARAM(point.x,point.y));/**//

skyremember的专栏 1937

SendMessage()窗体之间发消息

SendMessage调用一个窗口的窗口函数,将一条消息发给那个窗口。 一、父窗口向子窗口发消息。 1.1在接收方,也就是子窗口类头文件里面声明消息。 #define MSG_UPDATE_LEFT_CHILD WM_USER+600 1.2消息映射,在头文件里面添加响应函数。 afx_msg LRESULT OnUpdate(WPARAM w, LPARAM l); 1.3响应响应函...

Struggling_Jeff的博客 4177

MFC 自定义 PostMessage 、SendMessage 消息

*@基于 WM_USER 往上加, 其他自定义消息依次累加,自定义消息值不得相同/重复*/@例子:*当上两个消息在同一个窗体的消息映射中:..........UM_MAINDLG_SHOW_DOMODAL 消息会被 UM_MOUSE_RIGHT_KEY 捕获,导致 OnUmNotifyParent 没有响应//头文件.h 声明消息响应函数//源文件 .cpp 定义消息响应函数//解析发送过来的参数case 0:break;return 0;

taihuishu5854的博客 1040
上一篇: Class们的分工合作安排,消息的传递。
下一篇: 理解I/O Completion Port
Garfield
博客等级 码龄26年 24粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值