RGF 窗口消息事件参数解析:EvNextMenu 与 WM_NEXTMENU 菜单切换事件
图形学桌面应用【免费下载链接】RGF_CJRGF是仓颉Windows系统下的通用渲染框架兼应用开发框架。RGF仓颉版后续简称RGF基于RGF(C/C版)封装优化而来。RGF为开发者提供轻量化、安全、高性能以及高度一致性的2D渲染能力以及常用的桌面应用开发工具并且提供对接Direct3D的相关接口以满足开发者对3D画面渲染的需求。在Windows开发方面RGF在子包内也提供开箱即用的Windows API确保熟悉Win32的开发者快速上手。此外RGF还提供一些常用功能的封装如XAudio2、MF以辅助开发者实现音频、摄像头等扩展功能的管理。项目地址https://gitcode.com/Cangjie-SIG/RGF_CJ点击查看免费下载导读在 RGF仓颉 Windows 通用渲染框架中Win32 消息被封装为各类Ev*事件参数对象EvNextMenu正是对应WM_NEXTMENU0x0213消息的事件参数类。当用户在窗口菜单栏与系统菜单之间使用左/右方向键切换时系统向窗口发送该消息RGF 将其解析为EvNextMenu对象并回调给应用层。读完本文你将掌握EvNextMenu的成员含义、lParam指向的MDINEXTMENU结构体如何被解析与回写以及如何通过onNextMenu/bindNextMenu两种方式接管菜单切换行为。一、背景WM_NEXTMENU 消息与菜单切换在 Win32 编程中WM_NEXTMENU0x0213是一条由系统发送给窗口的消息当用户使用**向右键VK_RIGHT或向左键VK_LEFT**在菜单栏与系统菜单之间切换时触发。它的两个消息参数约定如下参数含义wParam触发切换的按键虚拟键码Virtual-Key CodelParam指向MDINEXTMENU结构体的指针携带当前菜单与目标菜单的信息RGF 的消息处理循环在收到0x0213后会构造EvNextMenu(wParam, lParam)事件对象并派发源码位置见 src/rgf_core/rgf_proc.cjcase 0x0213 /*WM_NEXTMENU*/ { let eObj:EvNextMenu EvNextMenu(wParam,lParam) onNextMenu(eObj) if(eObj.isOverride){ eObj.postProcess() } return (0,eObj.isOverride) }可以看到分发流程分为三步构造事件对象 → 回调默认事件方法onNextMenu→ 若事件被覆盖isOverride为真则执行postProcess()回写修改结果。二、EvNextMenu 类定义与继承关系EvNextMenu定义在 src/rgf_core/rgf_proc.cj继承自事件参数基类EvCorepublic open class EvNextMenu : EvCoreEvCore见 src/rgf_core/rgf_proc.cj 与 EvCore.md是所有窗口消息事件参数的公共基类提供三个只读字段message: UInt32—— 消息编号EvNextMenu构造时固定为0x0213wParam: UInt64—— 原始消息的wParamlParam: Int64—— 原始消息的lParam此外EvCore内部维护isOverride: Bool用于标记该事件是否被应用层覆盖处理默认构造后为true这直接决定了消息循环是否执行postProcess()回写。三、成员变量详解EvNextMenu在基类之外定义了四个公开成员构成了该事件的完整载荷成员类型可变性说明keyEmKeylet只读触发菜单切换的按键虚拟键码来源于wParamhmenuInCPointerUnitvar可写当前激活的菜单句柄HMENU即切换前的菜单hmenuNextCPointerUnitvar可写下一个要激活的菜单句柄HMENUhwndNextRgfHwndvar可写接收菜单通知消息的目标窗口句柄HWND三个与句柄相关的成员hmenuIn、hmenuNext、hwndNext对应 Win32 结构体MDINEXTMENU的三个字段该结构体在 src/win_def/hwinuser.cj 中声明C public struct tagMDINEXTMENU { public var hmenuIn:HMENU HMENU(); public var hmenuNext:HMENU HMENU(); public var hwndNext:HWND HWND(); } public type MDINEXTMENU tagMDINEXTMENUhmenuIn切换发生时正处于激活状态的菜单句柄hmenuNext系统计划切换到的下一个菜单句柄hwndNext将接收菜单消息的窗口句柄通常用于 MDI 应用中指定目标子窗口。key 字段与 EmKey 枚举key字段把wParam的虚拟键码转换为框架枚举EmKey映射逻辑为EmKey.num2e(UInt8(wParam))。EmKey枚举完整定义于 src/rgf_core/rgf_proc.cj包含LButton、Back、Tab、Escape、Left、Up、Right、Down、F1~F24、Numpad0~Numpad9等常用按键其num2e静态方法src/rgf_core/rgf_proc.cj按 Win32 虚拟键码映射例如虚拟键码EmKey 值0x25Left0x26Up0x27Right0x28Down0x1BEscape对于WM_NEXTMENU而言实际出现的key通常为Left或Right对应菜单栏/系统菜单两个方向的切换。四、构造与解析流程EvNextMenu的构造函数签名如下OverflowWrapping public init(wParam: UInt64, lParam: Int64)其参数与文档参数表一致wParam: UInt64、lParam: Int64。构造过程在 src/rgf_core/rgf_proc.cj 中完整实现核心逻辑是把lParam指针读取为MDINEXTMENU结构体并拆包OverflowWrapping public init(wParam:UInt64, lParam:Int64) { super(0x0213 /*WM_NEXTMENU*/, wParam,lParam) ptr CPointerMDINEXTMENU(ruUllToPtr(ruInt64SafeToUIntNative(lParam))) Obj unsafe{ ptr.read() } key EmKey.num2e(UInt8(wParam)) hmenuIn CPointerUnit(Obj.hmenuIn) hmenuNext CPointerUnit(Obj.hmenuNext) hwndNext Obj.hwndNext.toUIntNative() }具体步骤如下调用super(0x0213, wParam, lParam)以WM_NEXTMENU消息号初始化基类EvCore将lParam经ruInt64SafeToUIntNative与ruUllToPtr转换为CPointerMDINEXTMENU再通过unsafe{ ptr.read() }读取结构体副本ObjwParam的低 8 位经EmKey.num2e转为key将结构体字段拆包为公开成员hmenuIn、hmenuNext转为CPointerUnit形式hwndNext转为RgfHwnd。OverflowWrapping注解表明数值转换采用回绕wrap-around语义用于处理指针/整型转换中的溢出边界。五、postProcess()修改后的回写机制public func postProcess()postProcess()是事件参数类向 Windows 反馈处理结果的通道。WM_NEXTMENU允许应用修改目标菜单与窗口因此 RGF 在事件处理完成后若isOverride为真会调用postProcess()把开发者修改后的成员值写回原始MDINEXTMENU结构体public func postProcess(){ Obj.hmenuIn CPointerUNUSED(hmenuIn) Obj.hmenuNext CPointerUNUSED(hmenuNext) Obj.hwndNext ruToHwnd(hwndNext) unsafe{ ptr.write(Obj) } }实现要点src/rgf_core/rgf_proc.cj把hmenuIn、hmenuNext从CPointerUnit转回HMENU此处以CPointerUNUSED形式承载赋给结构体副本hwndNext经ruToHwnd转回HWND最后unsafe{ ptr.write(Obj) }将修改后的结构体整体写回lParam指向的内存使系统按新值继续菜单切换流程。也就是说开发者只需在事件回调中修改hmenuNext、hwndNext等可写成员框架即会自动完成回写无需直接操作指针。六、事件分发链路从消息到回调EvNextMenu的消费有两种方式均由消息处理系统统一驱动方式一覆盖默认事件方法 onNextMenuIEvent接口声明了onNextMenu(e: EvNextMenu): Unit见 IEvent.md描述为“使用向右键或向左键在菜单栏和系统菜单之间切换时触发”。其框架默认实现为空操作src/rgf_core/rgf_proc.cj// brief 使用向右键或向左键在菜单栏和系统菜单之间切换时触发 func onNextMenu(e:EvNextMenu):Unit{ e.isOverride false }注意默认实现会把isOverride置为false即不触发回写。若需要干预菜单切换应在自定义窗口事件处理中覆盖onNextMenu并主动将e.isOverride true才能让postProcess()生效。方式二事件绑定 bindNextMenuIBindEvent接口提供属性绑定方式见 IBindEvent.mdmut prop bindNextMenu: Option (EvNextMenu) - Unit 对应底层属性定义位于 src/rgf_core/rgf_proc.cj消息分发的宏模板见 src/rgf_core/macros/rgf_proc_utils.cjcase 0x0213 /*WM_NEXTMENU*/ { let eObj:EvNextMenu EvNextMenu(wParam,lParam) return if(let Some(v) - bindNextMenu?(eObj)){ eObj.postProcess();0 }else{ 0 } }绑定方式下语义略有不同只要绑定了处理函数并正常消费事件就会自动调用postProcess()回写且消息返回值为 0。两种方式的分发逻辑由宏rgf_proc_utils.cj统一生成onNextMenu的宏模板见同文件 L735-L740保证接口与绑定两条路径行为一致。七、实战示例拦截并重定向菜单切换以下示例展示如何通过覆盖事件方法的方式在用户按方向键切换菜单时把目标菜单重定向到自定义菜单并回写系统// 在自定义窗口事件处理类中覆盖默认行为 func onNextMenu(e: EvNextMenu): Unit { // 查看触发键通常为 Left 或 Right println(NextMenu key ${e.key}) // 重定向到自定义目标菜单句柄 e.hmenuNext myMenuHandle // 若不需要重定向窗口可保持 hwndNext 不变 // e.hwndNext ... // 标记已覆盖处理触发 postProcess() 回写 e.isOverride true }也可以使用属性绑定方式在窗口初始化时注册回调win.bindNextMenu { e // 处理菜单切换事件 e.hmenuNext myMenuHandle // 绑定方式下框架自动调用 postProcess() }实际使用中请注意hmenuNext、hwndNext属于底层句柄CPointerUnit/RgfHwnd赋值前应确保对应菜单或窗口已创建且句柄有效key为只读字段无法通过事件对象改写触发键本身。八、相关文档与源码索引类文档EvNextMenu.md、基类 EvCore.md接口文档事件方法 IEvent.md、绑定属性 IBindEvent.md源码实现src/rgf_core/rgf_proc.cj类定义、消息分发 L5483-L5490、onNextMenu 默认实现 L6639-L6642、bindNextMenu 属性 L8334宏模板src/rgf_core/macros/rgf_proc_utils.cj 与 L1845-L1848Win32 结构体src/win_def/hwinuser.cjtagMDINEXTMENU菜单应用示例可参考 课程 017_菜单管理九、小结EvNextMenu是 RGF 对WM_NEXTMENU消息的完整封装继承EvCore获得消息三元组message/wParam/lParam通过init将lParam解析为MDINEXTMENU结构体并拆包出hmenuIn、hmenuNext、hwndNext三个句柄成员将wParam映射为EmKey按键枚举再经由onNextMenu接口覆盖或bindNextMenu属性绑定两条路径派发给应用层最后由postProcess()将应用层修改回写系统。理解这一“构造解析 → 回调处理 → 回写提交”的三段式事件模型即可举一反三掌握 RGF 中所有带postProcess()的可干预型窗口事件如EvSizing、EvMoving的使用方法。赞分享图形学桌面应用【免费下载链接】RGF_CJRGF是仓颉Windows系统下的通用渲染框架兼应用开发框架。RGF仓颉版后续简称RGF基于RGF(C/C版)封装优化而来。RGF为开发者提供轻量化、安全、高性能以及高度一致性的2D渲染能力以及常用的桌面应用开发工具并且提供对接Direct3D的相关接口以满足开发者对3D画面渲染的需求。在Windows开发方面RGF在子包内也提供开箱即用的Windows API确保熟悉Win32的开发者快速上手。此外RGF还提供一些常用功能的封装如XAudio2、MF以辅助开发者实现音频、摄像头等扩展功能的管理。项目地址https://gitcode.com/Cangjie-SIG/RGF_CJ点击查看免费下载相关推荐RGF 菜单选中事件参数 EvMenuSelect 详解WM_MENUSELECT 消息的封装与实战RGF 菜单选中事件参数 EvMenuSelect 详解WM_MENUSELECT 消息的封装与实战 RGF仓颉 Windows 通用渲染框架将 Win3图形学桌面应用RGF 窗口移动事件深入解析EvMoving 参数类与 WM_MOVING 消息分发机制RGF 窗口移动事件深入解析EvMoving 参数类与 WM_MOVING 消息分发机制 RGF仓颉版通用渲染框架将 Win32 窗口消息封装为事件参数图形学桌面应用RGF 窗口滚动条事件参数解析深入理解 EvScroll 与 WM_HSCROLL / WM_VSCROLL 消息处理RGF 窗口滚动条事件参数解析深入理解 EvScroll 与 WM_HSCROLL / WM_VSCROLL 消息处理 导读 EvScroll 是 RGF仓图形学桌面应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

8086系统结构深度拆解:从BIU/EU到分段机制与标志位实战

8086系统结构深度拆解:从BIU/EU到分段机制与标志位实战

1. 为什么还要啃8086这颗“老芯片”如果你正在上微机原理这门课,或者准备考研复试、参加嵌入式相关的面试,大概率绕不开8086。很多人的第一反应是:都什么年代了,还在讲四十多年前的芯片?我一开始也这么想,直…

2026/10/15 10:18:17 阅读更多 →
Android智慧食堂点餐系统开发实践与优化

Android智慧食堂点餐系统开发实践与优化

1. 项目背景与核心价值大学食堂就餐高峰期排队时间长、点餐效率低是困扰师生多年的痛点。这款基于Android平台的食堂点餐系统,通过移动端与后厨的实时数据联动,实现了"线上点餐-厨房接单-线下取餐"的完整闭环。我在参与某高校智慧食堂改造项目…

2026/10/15 10:18:17 阅读更多 →
WebRTC 1对1连接建立的五阶段源码级解析

WebRTC 1对1连接建立的五阶段源码级解析

1. 为什么“1对1连接”是WebRTC源码里最该先啃下的硬骨头很多人一打开WebRTC源码,眼睛就直奔PeerConnection类、RTCPeerConnection接口、CreateOffer这些高亮函数——结果三天过去,连offer怎么生成的都还没理清逻辑链。我带过几届某高校实验室的实习生&a…

2026/10/15 10:18:17 阅读更多 →

最新新闻

专家PID控制MATLAB程序代码:规则表与增量式PID融合实现

专家PID控制MATLAB程序代码:规则表与增量式PID融合实现

简介:这份资源是面向自动化、控制工程方向学习者与科研人员的专家PID控制MATLAB程序代码文档,适合已掌握常规PID、希望进一步理解智能控制策略的中高级读者。资源以PDF形式呈现,共1个文件,压缩包约85KB,内容围绕专家PI…

2026/10/15 11:00:08 阅读更多 →
深度学习如何提升视觉SLAM性能:从特征提取到不确定性建模

深度学习如何提升视觉SLAM性能:从特征提取到不确定性建模

1. 视觉SLAM的“眼睛”与“脑子”:为什么传统方法卡在精度和鲁棒性的死循环里 视觉SLAM(Simultaneous Localization and Mapping)不是个新概念,但直到今天,很多刚接触ROS小车建图、PX4无人机自主导航的朋友&#xff0c…

2026/10/15 11:00:08 阅读更多 →
Matlab实现车辆路径规划(VRP)算法详解

Matlab实现车辆路径规划(VRP)算法详解

1. 车辆路径规划问题概述 车辆路径规划(Vehicle Routing Problem, VRP)是运筹学中一个经典且实用的研究方向,主要解决如何在满足各种约束条件下,为车队设计最优的配送路线。这个问题最早由Dantzig和Ramser在1959年提出&#xff0c…

2026/10/15 11:00:08 阅读更多 →
专家PID控制MATLAB程序代码:规则表到闭环实现

专家PID控制MATLAB程序代码:规则表到闭环实现

简介:这份资源是面向自动化、控制工程方向学习者与科研人员的专家PID控制MATLAB程序代码文档,适合已掌握常规PID、希望进一步理解智能控制策略的中高级读者。资源以PDF形式呈现,共1个文件,压缩包约85KB,内容围绕专家PI…

2026/10/15 11:00:08 阅读更多 →
社区健康管理系统毕业设计实战:Vue+Spring Boot+AI风险预测

社区健康管理系统毕业设计实战:Vue+Spring Boot+AI风险预测

如果一个社区的居民健康管理还停留在纸质档案和Excel表格的阶段,光是整理高血压随访记录就能让人崩溃。青湖社区健康管理系统就是为这种场景做的:面向社区基层的健康管理平台,前端用Vue搭建,后端提供稳定接口服务,同时…

2026/10/15 11:00:08 阅读更多 →
GC2145 datasheet实战:从寄存器手册到图像链路调试

GC2145 datasheet实战:从寄存器手册到图像链路调试

简介:GC2145数据手册面向嵌入式视觉、摄像头模组与图像采集方向的硬件工程师及驱动开发者,用于快速掌握这款1/5英寸UXGA CMOS图像传感器的规格与设计要点。资源包共1个PDF文件,约814KB,即Galaxy Core发布的GC2145 CSP Datasheet V…

2026/10/15 10:59:04 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →