图形学桌面应用【免费下载链接】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),仅供参考