RGF 仓颉版 DWM 着色器色彩变更事件解析:EvDwmColorizationColorChanged 参数类详解

发布时间:2026/10/15 13:08:44
RGF 仓颉版 DWM 着色器色彩变更事件解析:EvDwmColorizationColorChanged 参数类详解 图形学桌面应用【免费下载链接】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 仓颉版下称 RGF核心事件体系中的EvDwmColorizationColorChanged参数类展开讲解当 Windows 桌面窗口管理器DWM的着色器色彩发生变化时RGF 如何将该系统消息封装为类型安全的事件对象并通过onDwmColorizationColorChanged回调方法与bindDwmColorizationColorChanged绑定属性两种方式暴露给应用层。读完本文你将掌握该事件参数的构造原理、字段语义0xAARRGGBB 着色色值与透明度标志以及在自己的 RGF 窗口中监听系统配色变更的完整写法。事件背景WM_DWMCOLORIZATIONCOLORCHANGED 与 DWM 着色Windows 的桌面窗口管理器DWM负责桌面合成与窗口外观渲染其中着色Colorization决定任务栏、窗口边框等非客户区元素的系统强调色。当用户通过个性化设置修改强调色或系统主题发生切换时DWM 会向所有顶级窗口广播WM_DWMCOLORIZATIONCOLORCHANGED消息消息值0x0320通知应用层着色颜色已变更。在 RGF 中这一原始 Win32 消息在 hwinuser.cj 中被定义为常量public const WM_DWMCOLORIZATIONCOLORCHANGED:UInt32 0x0320RGF 遵循事件参数类以Ev前缀命名的约定见 rgf_proc.cj 的注释约定将这条消息的参数封装为EvDwmColorizationColorChanged与EvDwmCompositionChanged、EvDwmNcRenderingChanged、EvDwmWindowMaximizedChange等共同构成 DWM 相关的事件参数族可在 rgf_core 模块 readme 中查看完整清单。类签名与继承结构EvDwmColorizationColorChanged的定义如下见 rgf_proc.cj/** brief DWM着色器色彩变更 - 事件参数 */ public open class EvDwmColorizationColorChanged : EvCore{ // 0xAARRGGBB public let colorizationColor:UInt32 public let opacity:Bool OverflowWrapping public init(wParam:UInt64, lParam:Int64) { super(0x0320 /*WM_DWMCOLORIZATIONCOLORCHANGED*/, wParam,lParam) colorizationColor UInt32(wParam) opacity lParam ! 0 } }它与文档 EvDwmColorizationColorChanged.md 中声明的 API 签名完全一致public open class EvDwmColorizationColorChanged : EvCore该类继承自EvCore。EvCore是所有 RGF 事件参数类的公共基类见 rgf_proc.cj它为每个事件对象保留了原始消息的完整信息/** brief 核心事件参数 */ public open class EvCore{ // 当前方法是否已经被覆盖 internal var isOverride:Bool true; public let message:UInt32 public let wParam:UInt64 public let lParam:Int64 public init(uMsg:UInt32, wParam:UInt64, lParam:Int64) { this.message uMsg; this.wParam wParam; this.lParam lParam; } }也就是说即便后续 RGF 升级为colorizationColor、opacity增加了更丰富的解析字段你依然可以通过继承自EvCore的message、wParam、lParam访问到最原始的 Win32 消息数据便于排查问题或自行扩展解析逻辑。构造函数与 Win32 消息参数解析函数签名OverflowWrapping public init(wParam: UInt64, lParam: Int64)名称类型描述wParamUInt64DWM 广播的着色颜色值WM_DWMCOLORIZATIONCOLORCHANGED的 wParamlParamInt64透明度启用标志WM_DWMCOLORIZATIONCOLORCHANGED的 lParam参数解析细节构造函数内部完成两件事见 rgf_proc.cj调用基类构造器super(0x0320, wParam, lParam)将消息编号0x0320、原始wParam、lParam一并存入EvCore对参数做类型转换与语义化colorizationColor UInt32(wParam)将 64 位wParam低 32 位截断为UInt32颜色值opacity lParam ! 0将lParam转换为布尔值非零表示透明度已启用。需要注意的是构造器标注了OverflowWrapping注解这与 RGF 其他事件参数类如EvAppCommand、EvDwmNcRenderingChanged保持一致——此类转换基于 Win32 消息参数的实际位布局在参数极端取值下采用包装语义而非抛出溢出异常保证窗口过程在处理系统消息时始终能够稳定构造出事件对象。事件属性详解EvDwmColorizationColorChanged对外暴露两个只读字段public let构造后不可修改colorizationColorUInt32 —— 新的 DWM 着色颜色public let colorizationColor: UInt32其格式为0xAARRGGBB见 rgf_proc.cj 注释与 API 文档 EvDwmColorizationColorChanged.mdAAAlpha 通道透明度分量8 位RR红色分量8 位GG绿色分量8 位BB蓝色分量8 位。由于颜色以UInt32整体存储读取时可直接用于后续的位运算拆解例如let argb e.colorizationColor let a:UInt32 (argb 24) 0xFF // Alpha let r:UInt32 (argb 16) 0xFF // Red let g:UInt32 (argb 8) 0xFF // Green let b:UInt32 argb 0xFF // Blue注意 RGF 渲染侧Surface、Color等通常采用 0~1 的浮点颜色分量可参考 HLT 测试用例 中createSolidColorBrush(0.5,0.0,0.0,1.0,5.0)的用法如需将colorizationColor应用到渲染画刷建议自行完成0~255 → 0~1的换算。opacityBool —— 透明度启用标志public let opacity: Bool由lParam ! 0推导而来true表示当前 DWM 着色启用了透明度false表示不透明。该字段可用于判断系统当前强调色是否为半透明模式从而决定应用窗口是否同步调整自身边框或控件的透明渲染策略。接入事件两种推荐方式RGF 为WM_DWMCOLORIZATIONCOLORCHANGED提供了两条接入路径均可在 API 文档中找到对应接口声明继承覆盖方式重写窗口基类的onDwmColorizationColorChanged(e: EvDwmColorizationColorChanged): Unit方法见 IEvent.md绑定回调方式设置bindDwmColorizationColorChanged: Option(EvDwmColorizationColorChanged) - Unit属性见 IBindEvent.md。方式一继承并覆盖 onDwmColorizationColorChanged在消息分发链路上rgf_proc.cjRGF 收到0x0320消息时会先构造事件对象再派发到回调方法case 0x0320 /*WM_DWMCOLORIZATIONCOLORCHANGED*/ { let eObj:EvDwmColorizationColorChanged EvDwmColorizationColorChanged(wParam,lParam) onDwmColorizationColorChanged(eObj) return (0,eObj.isOverride) }基类默认实现仅将isOverride置为falsergf_proc.cj表示未被覆盖、消息按默认方式处理且该消息处理后返回0。应用层只要在继承WinBase的窗口类中重写该方法即可拦截事件public override open func onDwmColorizationColorChanged(e:EvDwmColorizationColorChanged):Unit{ println(DWM 着色颜色已变更: ${e.colorizationColor.toString(16)}, 透明度: ${e.opacity}) super.onDwmColorizationColorChanged(e) }方式二绑定回调 bindDwmColorizationColorChanged若不想通过继承改写窗口类可以使用绑定属性方式。在绑定分发链路rgf_proc.cj中构造事件对象后直接调用用户绑定的回调case 0x0320 /*WM_DWMCOLORIZATIONCOLORCHANGED*/ { let eObj:EvDwmColorizationColorChanged EvDwmColorizationColorChanged(wParam,lParam) return if(let Some(v) - bindDwmColorizationColorChanged?(eObj)){ 0 }else{ OptionInt64.None } }绑定示例win.bindDwmColorizationColorChanged Some({e println(绑定方式收到 DWM 色彩变更: ${e.colorizationColor} / opacity${e.opacity}) })宏生成机制源码级佐证上述两条分发分支并非手写维护而是由编译期宏生成。在 rgf_proc_utils.cj 与 rgf_proc_utils.cj 中分别以(onDwmColorizationColorChanged,EvDwmColorizationColorChanged,Unit)和(bindDwmColorizationColorChanged,EvDwmColorizationColorChanged,Unit)为键生成对应的case 0x0320分发代码。这意味着只要开发者按 RGF 约定在窗口类中声明覆盖方法或绑定属性宏即自动接入消息循环无需手写任何wndProc分支关于窗口注册与消息循环的完整流程可参考 HLT 测试用例 中的rsMain启动方式。完整实战示例以下示例完整展示如何在 RGF 窗口中监听系统 DWM 着色颜色变化窗口骨架参照 test/HLT/base/src/test_win.cj 的rwTest模式public open class DwmColorWatchWin : WinBase{ // 窗口创建省略部分参数完整签名见 WinBase 文档 public open func createWin( winCtxt:WinContext, lpWindowName:String, x:Int32, y:Int32, nWidth:Int32, nHeight:Int32, parent:RgfHwnd, dwExStyle:UInt32, dwStyle:UInt32, substrate!:Substrate, layered!:Bool ):RgfHwnd{ return super.createWin( winCtxt, lpWindowName, x, y, nWidth, nHeight, parent, dwStyle, dwExStyle:dwExStyle, substrate:substrate, layered:layered ) } // 监听 DWM 着色器色彩变更 public override open func onDwmColorizationColorChanged(e:EvDwmColorizationColorChanged):Unit{ let argb e.colorizationColor println(消息ID0x0320 (WM_DWMCOLORIZATIONCOLORCHANGED)) println(ARGB${argb.toString(16)} (0xAARRGGBB)) println(Alpha${(argb 24) 0xFF} Red${(argb 16) 0xFF} Green${(argb 8) 0xFF} Blue${argb 0xFF}) println(opacity${e.opacity}) // 原始消息数据仍可通过基类访问 println(raw wParam${e.wParam} lParam${e.lParam}) super.onDwmColorizationColorChanged(e) } }运行后在 Windows 设置中修改个性化 → 颜色 → 强调色或切换深浅色主题DWM 广播0x0320消息上述窗口即会打印新的着色颜色与透明度标志。注意事项与扩展阅读触发时机WM_DWMCOLORIZATIONCOLORCHANGED由系统在 DWM 着色颜色或透明度设置变更时向所有顶级窗口广播无需应用主动注册只要窗口消息循环处于运行状态即可收到。仅顶层窗口该消息面向顶级窗口广播子窗口不会直接收到如子窗口需要同步可在父窗口回调中自行转发。返回值RGF 对该消息统一返回0表示已处理应用层回调无需也无法修改该返回值。同类事件如需感知 DWM 合成开关WM_DWMCOMPOSITIONCHANGED、非客户区渲染策略WM_DWMNCRENDERINGCHANGED、窗口最大化WM_DWMWINDOWMAXIMIZEDCHANGE等相邻系统状态可分别使用EvCore/EvDwmNcRenderingChanged/EvDwmWindowMaximizedChange对应事件相关参数类均位于 rgf.rgf_core 类目录 下。底层常量与文档消息编号定义见 hwinuser.cj 与 win_def 变量与常量文档事件类的完整 API 参考见 EvDwmColorizationColorChanged.md模块级索引见 rgf_core readme。综上EvDwmColorizationColorChanged是 RGF 将系统级 DWM 着色变更翻译为类型安全事件参数的典型示例构造器负责位级参数解析wParam → 0xAARRGGBB、lParam → BoolEvCore基类兜底保留原始消息数据宏生成机制负责自动接入窗口消息循环开发者只需选择覆盖方法或绑定回调即可响应系统配色变化。赞分享图形学桌面应用【免费下载链接】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 仓颉版事件体系详解EvContextMenu 上下文菜单事件参数类RGF 仓颉版事件体系详解EvContextMenu 上下文菜单事件参数类 RGF仓颉版在 rgf.rgf_core 子包中提供了一套完整的 Win32图形学桌面应用RGF 仓颉版 ColorUtils 色彩插值工具类lerp 接口解析与实战RGF 仓颉版 ColorUtils 色彩插值工具类 lerp 接口解析与实战 ColorUtils 是 RGF 仓颉版RGF_CJ rgf.rgf_ut图形学桌面应用RGF 仓颉版事件参数 EvCaptureChangedWM_CAPTURECHANGED 鼠标捕获状态变更的完整解析RGF 仓颉版事件参数 EvCaptureChangedWM_CAPTURECHANGED 鼠标捕获状态变更的完整解析 本文围绕 RGFCangjie 版图形学桌面应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询