图形学桌面应用【免费下载链接】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点击查看免费下载导读tagGESTURENOTIFYSTRUCT是 RGF 仓颉版RGF_CJ在rgf.win_def子包中提供的一个与 Win32 手势触控机制直接相关的原生结构体用于承载WM_GESTURENOTIFY0x011A消息的附加数据——包括触控设备实例、目标窗口句柄、设备坐标位置与标志位等。本篇以该结构体的 API 参考文档为骨架结合 hwinuser.cj 的源码定义、rgf_proc.cj 的事件封装实现逐字段讲解其类型、默认值与底层含义并演示它如何通过EvGestureNotify接入 RGF 的事件体系让熟悉 Win32 的开发者能够快速定位、读懂并在自己的窗口中处理手势通知数据。结构体定位Win32 手势通知消息的数据载体在 RGF 的rgf.win_def子包中hwinuser.cj 定义了手势相关的两条窗口消息常量WM_GESTURE0x0119实际的手势动作消息WM_GESTURENOTIFY0x011A手势通知消息在触控设备到达/移除等场景下由系统向窗口发送用于告知应用当前手势状态并允许其配置手势。tagGESTURENOTIFYSTRUCT正是WM_GESTURENOTIFY消息中lParam所指向的数据结构。其声明如下C public struct tagGESTURENOTIFYSTRUCTC注解表明该结构体被标记为 C 兼容extern C ABI类型保证其在内存中的布局与 Win32 原生 SDK 结构体一致从而可以通过指针安全地与系统消息进行互操作。完整的定义位于 src/win_def/hwinuser.cj#L1237-L1245。五个字段逐一解析API 参考文档中罗列了该结构体的五个公开字段各字段的声明、类型与默认值如下cbSize结构体大小public var cbSize: UINT 0类型UINT在 wintype.cj 中定义为UInt32的类型别名该字段用于存放结构体自身的字节大小是 Win32 消息结构体的惯用约定系统据此校验传入指针的合法长度在 RGF 封装层中该值直接由系统填充解析侧无需主动维护。dwFlags标志位public var dwFlags: DWORD 0类型DWORD同样在 wintype.cj 中定义为UInt32该字段承载本次通知的标志信息。仓库在 hwinuser.cj 中同时提供了与之配套的两个标志常量GIDC_ARRIVAL 1触控设备到达与GIDC_REMOVAL 2触控设备移除可用于与dwFlags比对以判断触控设备的变化类型。hwndTarget目标窗口句柄public var hwndTarget: HWND HWND()类型HWND在 hwindef.cj 中定义为CPointerUNUSED即窗口句柄的指针形式该字段标识手势通知所指向的目标窗口。ptsLocation设备坐标位置public var ptsLocation: POINTS POINTS()类型POINTS在 hwindef.cj 中定义为tagPOINTS结构体tagPOINTS 内部包含两个SHORTInt16类型的成员x、y表示屏幕坐标点。值得注意此处使用POINTS短整型坐标而非POINT长整型坐标可见该字段用于承载压缩后的位置信息。dwInstanceID设备实例标识public var dwInstanceID: DWORD 0类型DWORD即UInt32该字段标识发起通知的触控输入设备实例 ID可用于区分多个触控设备。字段速查表字段声明类型实际类型默认值语义cbSizeUINTUInt320结构体字节大小dwFlagsDWORDUInt320通知标志可对比GIDC_ARRIVAL/GIDC_REMOVALhwndTargetHWNDCPointerUNUSEDHWND()目标窗口句柄ptsLocationPOINTStagPOINTSPOINTS()屏幕坐标SHORT类型 x/ydwInstanceIDDWORDUInt320触控设备实例 ID关于字段顺序与内存布局的一点说明需要留意API 参考文档tagGESTURENOTIFYSTRUCT.md中字段的罗列顺序为cbSize → dwFlags → dwInstanceID → hwndTarget → ptsLocation而源码 hwinuser.cj#L1237-L1245 中实际定义的成员顺序为cbSize → dwFlags → hwndTarget → ptsLocation → dwInstanceID。由于该结构体带有C注解其真实内存布局以源码定义顺序为准该顺序与 Win32 原生GESTURENOTIFYSTRUCT的标准布局保持一致。在通过指针读取如ptr.read()或跨 FFI 边界传递时务必以源码中的成员顺序作为唯一依据文档罗列顺序仅作字段清单参考。类型别名与指针类型除结构体本体外hwinuser.cj 还提供了两个配套类型别名也收录在 类型别名.md 与 类型别名.md#L860-L862 中public type GESTURENOTIFYSTRUCT tagGESTURENOTIFYSTRUCT public type PGESTURENOTIFYSTRUCT CPointertagGESTURENOTIFYSTRUCTGESTURENOTIFYSTRUCT去掉tag前缀的别名与 Win32 SDK 命名习惯一致日常使用更简洁PGESTURENOTIFYSTRUCT指向该结构体的指针类型。由于WM_GESTURENOTIFY的lParam携带的正是结构体指针该别名在消息解析场景中最为常用。在 RGF 事件体系中的接入EvGestureNotify 封装tagGESTURENOTIFYSTRUCT的价值最终体现在 RGF 的事件体系中。在 rgf_proc.cj#L3259-L3290 中RGF 将WM_GESTURENOTIFY封装为EvGestureNotify事件类对应 EvGestureNotify.md其核心解析逻辑如下public open class EvGestureNotify : EvCore{ public var cbSize:UInt32; public var dwFlags:UInt32; public var hwndTarget:RgfHwnd; public var ptsLocation:Point; public var dwInstanceID:UInt32; internal let ptr:CPointerGESTURENOTIFYSTRUCT; internal var Obj:GESTURENOTIFYSTRUCT; OverflowWrapping public init(wParam:UInt64, lParam:Int64) { super(0x011A /*WM_GESTURENOTIFY*/, wParam,lParam) ptr CPointerGESTURENOTIFYSTRUCT(ruUllToPtr(ruInt64SafeToUIntNative(lParam))) Obj unsafe{ ptr.read() } // 逐字段拷贝为 RGF 友好的类型 cbSize Obj.cbSize dwFlags Obj.dwFlags hwndTarget Obj.hwndTarget.toUIntNative() ptsLocation Point(Int32(Obj.ptsLocation.x),Int32(Obj.ptsLocation.y)) dwInstanceID Obj.dwInstanceID } // postProcess() 反向写回原始结构体此处略 }这段实现清晰展示了结构体在框架中的实际用法通过CPointerGESTURENOTIFYSTRUCT将lParam转换为结构体指针用unsafe { ptr.read() }一次性读出原生结构体逐字段转换为 RGF 更友好的类型——HWND转为RgfHwnd、POINTS转为Point同时把SHORT提升为Int32供上层业务直接使用事件类还提供postProcess()方法将修改后的字段反向写回原始结构体用于需要回写系统参数的场景。消息分发onGestureNotify 与 bindGestureNotify在 RGF 的消息分发层WM_GESTURENOTIFY同时接入了两套事件 API继承式接口IEvent接口提供onGestureNotify(e: EvGestureNotify): Unit对应文档 IEvent.md#L714-L719 中标注的“本消息可设置手势配置”分发实现在 rgf_proc.cj#L5300-L5304绑定式接口IBindEvent接口提供bindGestureNotify: Option(EvGestureNotify) - Unit属性对应 IBindEvent.md#L378-L380分发实现在 rgf_proc.cj#L7461-L7464。两条分发路径的源码中都带有同一行关键注释// 本消息始终应该从 DefWindowProc 返回值这意味着WM_GESTURENOTIFY是一个“只读通知 配置入口”性质的消息——应用在处理完EvGestureNotify读取结构体字段、必要时修改配置后不应吞掉消息返回值而是应当返回DefWindowProc的处理结果让系统继续完成手势相关的默认处理。这也是tagGESTURENOTIFYSTRUCT相比普通消息结构体在使用上最需要注意的约定。小结tagGESTURENOTIFYSTRUCT是 RGF 仓颉版对接 Win32 手势触控机制的底层数据契约它由C注解保证 ABI 兼容五个字段分别承担结构体大小、通知标志、目标窗口、设备坐标与设备实例 ID 的传递配合 hwinuser.cj 中的GESTURENOTIFYSTRUCT/PGESTURENOTIFYSTRUCT别名以及 rgf_proc.cj 中EvGestureNotify的指针解析与类型转换开发者可以在不接触裸指针的情况下读取全部字段并通过onGestureNotify/bindGestureNotify接入自己的窗口逻辑。需要进一步查阅完整定义与关联常量时可参考 变量与常量.md 中的WM_GESTURENOTIFY说明及 readme.md 的结构体索引。赞分享图形学桌面应用【免费下载链接】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 仓颉版 win_def 子包中的 SECURITY_ATTRIBUTES 结构体字段定义与 Win32 API 实战指南RGF 仓颉版 win_def 子包中的 SECURITY_ATTRIBUTES 结构体字段定义与 Win32 API 实战指南 本篇技术指南聚焦 RGF 仓图形学桌面应用RGF仓颉版 EvChar 字符输入事件解析从 Win32 消息到仓颉事件对象的完整链路RGF仓颉版 EvChar 字符输入事件解析从 Win32 消息到仓颉事件对象的完整链路 本篇围绕 RGF仓颉版RGF_CJ rgf.rgf_core 子图形学桌面应用仓颉版 RGF 中 Win32 安全描述符结构体 _SECURITY_DESCRIPTOR 完整解析仓颉版 RGF 中 Win32 安全描述符结构体 _SECURITY_DESCRIPTOR 完整解析 导读本文以 RGF 仓颉版RGF_CJ win_de图形学桌面应用上一篇Karate测试框架完全指南从入门到精通的实战教程下一篇终极LastPass CLI指南如何在命令行中高效管理你的密码创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考