资讯动态

RGF_CJ 窗口可视状态变更事件:EvShow 事件参数类深度解析

发布时间:2026/10/14 5:46:26 来源:尧图企业网站定制
图形学桌面应用【免费下载链接】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_CJ仓颉版通用渲染框架在rgf.rgf_core子包中完整封装了 Win32 窗口体系其中EvShow是承载窗口显示/隐藏状态变更WM_SHOWWINDOW的事件参数类。本文以其官方 API 文档为主体结合rgf_proc.cj源码中的EmShow枚举、事件分发宏以及 HLT 测试用例系统讲解EvShow的类结构、参数解析规则、状态枚举编码以及继承覆盖与属性绑定两种使用方式帮助开发者在窗口生命周期中精确捕获可视状态变化。一、事件概述WM_SHOWWINDOW 与窗口可视状态变更在 Win32 消息体系中WM_SHOWWINDOW消息值0x0018在窗口即将被显示或隐藏时发送到窗口。它属于窗口状态类通知消息常见触发场景包括应用程序调用ShowWindow主动显示或隐藏窗口窗口被最小化、最大化或还原含由于其他窗口最大化导致的间接变化窗口所有者父级窗口被最小化或还原导致本窗口随之隐藏或显示。RGF_CJ将其封装为独立的事件参数类EvShow并接入窗口主过程wndProc()的分发逻辑。窗口类的每一个实例在窗口存在的全部时期都会经由wndProc()处理这条消息因此EvShow是观察窗口可视状态最直接、最底层的入口。二、EvShow 类定义与继承结构依据 EvShow.mdEvShow的类声明如下public open class EvShow : EvCore它继承自EvCore核心事件参数基类见 rgf_proc.cj。EvCore为所有 RGF 事件参数类提供了统一的底层字段public open class EvCore{ internal var isOverride:Bool true; // 当前方法是否已经被覆盖 public let message:UInt32 // 消息 ID public let wParam:UInt64 // 原始 wParam public let lParam:Int64 // 原始 lParam public init(uMsg:UInt32, wParam:UInt64, lParam:Int64) { … } }因此每个EvShow实例除了自身携带的语义化字段外还保留了message固定为0x0018、原始wParam、lParam以及内部传递标志isOverride方便开发者在需要时回查原始消息数据。三、构造函数与参数解析规则EvShow的构造函数签名与实现源码位于 rgf_proc.cjpublic open class EvShow : EvCore{ public let show:Bool public let state:EmShow OverflowWrapping public init(wParam:UInt64, lParam:Int64) { super(0x0018 /*WM_SHOWWINDOW*/,wParam,lParam) show wParam ! 0 state EmShow.num2e(UInt8(lParam)) } }参数类型含义与解析规则wParamUInt64窗口是否被显示非零TRUE表示窗口正在显示为零FALSE表示窗口正在隐藏直接映射为show属性lParamInt64窗口被显示/隐藏时所处的状态取其低 8 位UInt8(lParam)并通过EmShow.num2e()转换为EmShow枚举两点值得注意构造器标注了OverflowWrapping注解用于在仓颉整型转换时启用环绕溢出回绕语义避免在数值转换边界上抛异常state仅取lParam的低 8 位做映射这是因为 Win32 的WM_SHOWWINDOW状态标志SW_*系列取值 04本就定义在低位字节内高位置零不影响结果。四、核心属性详解1.show: Bool—— 窗口是否正在显示public let show: Bool语义窗口当前是否处于显示状态。true窗口正在被显示对应 Win32 中wParam TRUEfalse窗口正在被隐藏对应 Win32 中wParam FALSE。该属性直接由wParam ! 0计算得出是判断“显示”还是“隐藏”方向的第一手依据。2.state: EmShow—— 可视状态变化原因public let state: EmShow语义本次可视状态变更的类型/原因。它补充说明了“为什么窗口被显示或被隐藏”例如是因为自身最大化还原还是因为父窗口最小化而被连带隐藏。具体取值见下一节的EmShow枚举。五、EmShow 枚举窗口可视状态编码state属性的类型为EmShow窗口可视状态枚举完整定义位于 rgf_proc.cj。枚举值、数值编码及含义如下表枚举值数值e2Num含义OtherUnzoom4正在展示窗口因为最大化窗口已还原或最小化OtherZoom2窗口正被已最大化的另一个窗口覆盖ParentClosing1窗口的所有者父级窗口正在最小化ParentOpening3正在还原窗口的所有者父级窗口Null0未定义默认兜底值对应源码public enum EmShow{ |OtherUnzoom // 正在展示窗口因为最大化窗口已还原或最小化。 |OtherZoom //窗口正被已最大化的另一个窗口覆盖。 |ParentClosing //窗口的所有者(父级)窗口正在最小化。 |ParentOpening //正在还原窗口的所有者(父级)窗口。 |Null // 未定义 public const static func e2Num(tk:EmShow):UInt8{ return match (tk) { case OtherUnzoom 4u8 case OtherZoom 2u8 case ParentClosing 1u8 case ParentOpening 3u8 case Null 0u8 } } public const static func num2e(num:UInt8):EmShow{ return match (num) { case 4u8 OtherUnzoom case 2u8 OtherZoom case 1u8 ParentClosing case 3u8 ParentOpening case _ Null } } public operator func (right:EmShow):Bool{ return e2Num(this) e2Num(right); } public operator func !(right:EmShow):Bool{ return e2Num(this) ! e2Num(right); } }枚举本身自带两套工具能力双向转换e2Num(EmShow): UInt8与num2e(UInt8): EmShow前者在EvShow构造时用于把lParam低字节还原为语义枚举后者供开发者将枚举转回数值如需要拼装原始消息参数比较运算重载了与!运算符比较基于各自数值编码可在回调中直接书写e.state EmShow.OtherUnzoom这类可读性强的判断。说明本文以源码注释为准罗列各枚举值含义官方枚举文档 EmShow.md 中个别条目的注释文字与源码存在出入阅读时请以源码实现为准。六、事件分发链路从 wndProc 到回调EvShow并非孤立的数据类它通过窗口主过程与两种回调形式构成完整的事件链路。1. wndProc 中的消息分发在 rgf_proc.cj 的窗口主过程wndProc()中0x0018分支负责构造EvShow并调用覆盖回调case 0x0018 /*WM_SHOWWINDOW*/ { let eObj:EvShow EvShow(wParam,lParam) onShowWindow(eObj) return (0,eObj.isOverride) }绑定分支rgf_proc.cj则走bindShowWindow属性case 0x0018 /*WM_SHOWWINDOW*/ { let eObj:EvShow EvShow(wParam,lParam) return if(let Some(v) - bindShowWindow?(eObj)){ 0 }else{ OptionInt64.None } }2. 宏自动生成机制上述case分支并非全部手写。RGF_CJ的仓颉宏包在 rgf_proc_utils.cj 中通过模式匹配方法签名自动生成对应分支case (onShowWindow,EvShow,Unit) ## case 0x0018 /*WM_SHOWWINDOW*/ { let eObj:EvShow EvShow(wParam,lParam) onShowWindow(eObj) return 0 }##以及绑定形式rgf_proc_utils.cjcase (bindShowWindow,EvShow,Unit) ## case 0x0018 /*WM_SHOWWINDOW*/ { let eObj:EvShow EvShow(wParam,lParam) bindShowWindow?(eObj) return 0 }##这意味着只要开发者声明的回调签名与(onShowWindow,EvShow,Unit)一致宏就会自动把该回调接入wndProc()的WM_SHOWWINDOW分支无需手动维护消息路由。3. 两种事件使用形式RGF_CJ为窗口事件提供了“继承覆盖”与“属性绑定”两种等价形式继承覆盖在继承WinCore/WinBase的窗口子类中重写onShowWindow(e: EvShow)。默认实现在 rgf_proc.cj仅将isOverride置为false后透传不做任何处理属性绑定通过bindShowWindow属性定义于 rgf_proc.cj类型为Option(EvShow)-Unit为窗口类实例动态注入处理逻辑无需继承。七、实战监听窗口的显示与隐藏场景 1继承覆盖形式假设我们需要在窗口被隐藏时释放资源、被重新显示时恢复渲染可继承WinBase并重写onShowWindowimport rgf.rgf_core.* public open class rwTest : WinBase{ public init(){} // 窗口可视状态变更回调 public override open func onShowWindow(e:EvShow):Unit{ if(e.show){ println(窗口正在显示state${e.state}) // 恢复渲染资源 / 重新绘制 }else{ println(窗口正在隐藏state${e.state}) // 释放可回收资源 } } }场景 2属性绑定形式无需继承利用bindShowWindow可以在不修改窗口类的情况下为实例挂接处理逻辑let mainWin:WinCore WinCore() mainWin.bindShowWindow {e:EvShow if(e.show){ println(显示窗口变化原因${e.state}) }else{ println(隐藏窗口变化原因${e.state}) } }场景 3状态精细化判断结合EmShow的枚举语义可以区分不同来源的可视状态变化例如判断窗口是否因其他窗口最大化而被动隐藏public override open func onShowWindow(e:EvShow):Unit{ if(!e.show e.state EmShow.OtherZoom){ // 窗口被已最大化的另一个窗口覆盖而隐藏 } if(e.show e.state EmShow.OtherUnzoom){ // 窗口因最大化还原或最小化恢复而重新展示 } }与主动控制 API 的配合RGF_CJ的窗口类还提供了主动改变/查询可视状态的方法见 rgf_base_method.cjfunc show(cmd: UInt32):Unit // 设置窗口是否显示底层封装 Win32 ShowWindow func isShow():Bool // 获取窗口当前是否显示调用show()触发的状态变化会经由系统再次以WM_SHOWWINDOW的形式反馈到onShowWindow/bindShowWindow形成“主动控制—事件反馈”的闭环。HLT 测试用例中窗口创建完成后即调用show(true)显示窗口见 test_win.cj随后开发者便可在onShowWindow中观察这次显示事件。八、注意事项与边界isOverride传递属性EvCore.isOverride用于标记当前方法是否被开发者覆盖。默认回调onShowWindow中将其置为false表示未覆盖时事件继续向后续链路传递若开发者重写了该方法isOverride保持初始值truewndProc 据此决定是否继续传递因此自定义处理应避免误改该内部字段。state的取值边界EmShow.num2e()对未识别数值统一返回Null即lParam低字节超出 04 范围时不会抛出异常只会得到Null处理逻辑应对该兜底值有所准备。消息时机WM_SHOWWINDOW在窗口显示状态即将变更时发送此时窗口本身的创建/销毁流程不一定完成不要在回调中执行依赖窗口句柄完全可用的重量级操作资源分配与释放建议仍交由createDeviceResources()/destroyDeviceResources()等渲染生命周期事件管理。源码路径速查EvShow与EmShow定义于 rgf_proc.cj消息分支宏位于 rgf_proc_utils.cj默认回调与绑定属性分别见 rgf_proc.cj 与 rgf_proc.cj。赞分享图形学桌面应用【免费下载链接】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_CJ 多文档窗口MDI事件编程指南EvMDICreate 事件参数类深度解析RGF_CJ 多文档窗口MDI事件编程指南EvMDICreate 事件参数类深度解析 导读 在基于仓颉语言Cangjie的 Windows 通用渲染框图形学桌面应用RGF_CJ 窗口消息事件深入解析EvDeleteItem 删除项事件参数类RGF_CJ 窗口消息事件深入解析EvDeleteItem 删除项事件参数类 EvDeleteItem 是 RGF_CJ仓颉 Windows 通用渲染框架图形学桌面应用RGF_CJ 事件参数类 EvDwmWindowMaximizedChange 解析在仓颉应用中监听 DWM 窗口最大化状态变更RGF_CJ 事件参数类 EvDwmWindowMaximizedChange 解析在仓颉应用中监听 DWM 窗口最大化状态变更 EvDwmWindowMax图形学桌面应用上一篇终极指南OpenPI如何革新机器人视觉语言动作模型研究下一篇内存映射文件性能优化WinFsp虚拟内存技术实践指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑