Windows 驱动实例分析系列:libwdi 驱动分析 - examples 篇(四)

子文档四:Zadig UI 与标准对话框模块

Zadig 的用户界面完全使用 Win32 原生控件构建,未使用任何第三方 UI 库。其 UI 相关代码主要分布在 zadig_stdlg.c 和 zadig.c 的主窗口过程部分。本子文档重点分析 zadig_stdlg.c 中实现的标准对话框和辅助 UI 组件。

文件夹浏览对话框

BrowseForFolder 函数实现了文件夹选择功能,用于让用户指定驱动文件的提取目录。它同时支持两种实现路径:

  1. 首选路径 :使用 Windows Vista 及以后引入的 IFileOpenDialog(设置 FOS_PICKFOLDERS 选项),提供更现代的界面和更好的高 DPI 支持。
  2. 回退路径 :若 IFileOpenDialog 不可用(如 Windows XP),则使用传统的 SHBrowseForFolder API。

BrowseForFolder 还通过子类化 SHBrowseForFolder 的编辑框控件,实现了用户可以直接在编辑框中输入路径的功能,提升了易用性。

文件对话框(打开/保存)

FileDialog 函数封装了 IFileDialog(Vista+)和传统的 GetOpenFileName/GetSaveFileName,支持自定义文件类型过滤器。它接受一个 ext_t 结构体,其中定义了文件扩展名和对应的描述,用于构建过滤器字符串。

FileDialog 还处理了 UTF-8 路径的转换:内部将传入的 UTF-8 路径转换为 UTF-16 调用 Windows API,返回时将结果转换回 UTF-8,确保在整个应用程序中字符串编码统一。

自定义通知对话框

zadig_stdlg.c 实现了 notification 函数和对应的对话框过程 notification_callback,用于替代标准的 MessageBox,提供以下增强功能:

  • 自定义图标(支持信息、警告、错误、询问四种类型)。
  • 可选的"更多信息"按钮,用于打开一个额外的对话框(如更新策略详情)。
  • 居中于父窗口,且禁用窗口最大化/调整大小,防止用户意外操作。
  • 模态行为,阻塞父窗口直到用户响应。

该通知对话框在 Zadig 中广泛用于显示操作结果、警告信息以及询问用户是否允许更新检查等。

关于对话框

about_callback 实现了关于对话框,其特殊之处在于:

  • 使用 Rich Edit 控件(RichEdit20W)显示 RTF 格式的版权声明和附加版权信息。
  • 支持超链接自动检测(EM_AUTOURLDETECT)和点击打开(通过 EN_LINK 通知)。
  • 包含一个"许可证"按钮,点击后显示 GPLv3 全文的模态对话框。
  • 包含一个"更新策略"按钮,点击后显示更新策略对话框。

关于对话框的版权文本定义在 zadig_license.h 中,包括主程序版权、libwdi 版权、profile.c 版权等,充分尊重了所有依赖项目的许可证要求。

更新策略对话框

UpdateCallback 实现了更新策略设置对话框,允许用户配置:

  • 更新检查频率(禁用/每日/每周/每月/自定义)。
  • 是否包含测试版(Beta)更新。
  • 手动触发立即检查。

该对话框将用户的偏好存储到注册表(HKCU\Software\Akeo Consulting\Zadig\)中,并在下次启动时应用。

新版本通知对话框

当检测到新版本时,Zadig 会显示 new_version_callback 对话框。该对话框包含:

  • 当前版本和最新版本的对比显示。
  • 发布说明(RTF 格式,支持超链接)。
  • "下载"按钮,点击后启动后台下载线程,并在进度条上显示下载进度。
  • 下载完成后,按钮变为"启动",点击后启动新版本的可执行文件,并关闭当前 Zadig 实例。

该实现展示了如何结合多线程和进度条实现流畅的用户体验。

工具提示(Tooltip)管理

zadig_stdlg.c 中实现了 create_tooltip、destroy_tooltip 和 destroy_all_tooltips 三个函数,用于为控件添加自定义提示。它们维护了一个全局数组 ttlist,存储每个工具提示的句柄、原始窗口过程和 UTF-8 字符串。工具提示支持多行文本,并可以设置显示时长。

Zadig 为几乎所有控件都添加了工具提示,极大地提升了软件的易用性。

状态栏

create_status_bar 函数创建了一个状态栏(STATUSCLASSNAME),分为两个部分:左侧用于显示动态提示信息,右侧用于显示应用程序版本号。版本号部分使用了自定义绘制(WM_DRAWITEM),以灰色文字显示,与状态栏背景协调。


相关推荐
WangWei_CM1 小时前
Windows 会话、Session 0 与进程 Token 隔离身份
windows
波力海苔夹心脆6752 小时前
C# 海康威视摄像头二次开发入门:HCNetSDK 登录、实时预览、云台控制、录像与抓图(WinForms 实战)
开发语言·windows·经验分享·tcp/ip·c#
爱上网的小舟2 小时前
windows无法启动windows audio服务怎么办?6个步骤排查修复windows audio无法启动
windows
SoStraw2 小时前
跨平台P2P通信SDK,Windows/Android/iOS/Linux/macOS一套API全兼容
android·linux·windows·跨平台·p2p·webrpc
爱写代码的小朋友2 小时前
Windows 下 MSYS2 + MinGW64 安装与使用 OpenCV 全指南(含踩坑记录)
c++·人工智能·windows·opencv
the3clipse2 小时前
Windows 11 对 VVC 与 AV1 编码支持全景解析:硬件、软件与开发者指南
windows·视频编解码·av1·vvc·h.266·硬件加速·视频扩展
百事牛科技12 小时前
WinRAR注释功能:给压缩包留个便签
windows·winrar
sukalot13 小时前
Windows 驱动实例分析系列:libwdi 驱动分析 - examples 篇(一)
windows·驱动开发
加载力科技13 小时前
硬盘咔咔响是坏盘信号!赶在数据丢失前克隆换盘:不重装系统、不丢文件
windows·嵌入式硬件·系统安全·策略模式·命令模式·硬盘