进度条控件是一种广泛应用于 Windows 窗口程序的用户界面元素,用于显示任务的进度。在某些场景中,例如文件加载或网络请求,具体的进度百分比可能无法确定,此时需要使用“不确定模式”的进度条,通过滚动动画表示任务正在进行。
Windows 提供了自动滚动的 API 支持,可以通过设置进度条的 PBS_MARQUEE
样式和发送 PBM_SETMARQUEE
消息轻松实现滚动效果。然而,许多开发者对这项功能了解不多,甚至额外使用时钟事件来模拟滚动逻辑,这不仅增加了开发复杂度,还浪费了系统资源。
以下是实现不确定模式进度条涉及的主要 Windows API:
IsWindow
GetWindowLong
/ SetWindowLong
PBS_MARQUEE
。SendMessageA
设置“不确定模式”的默认逻辑如下:
PBS_MARQUEE
标志。SendMessageA
发送 PBM_SETMARQUEE
消息,设置滚动动画的时间间隔(默认 30 毫秒)。示例代码:
```易语言
.版本 2
.子程序 设置不确定模式, 逻辑型
.参数 窗口句柄, 整数型
.参数 滚动延迟, 整数型, 可空, 默认为 30 毫秒
.局部变量 当前样式, 整数型
' 验证窗口句柄是否有效
.如果真 (IsWindow (窗口句柄) = 0)
返回 (假)
.如果真结束
当前样式 = GetWindowLongA (窗口句柄, #GWL_STYLE)
当前样式 = 位或 (当前样式, #PBS_MARQUEE)
SetWindowLongA (窗口句柄, #GWL_STYLE, 当前样式)
.如果真 (滚动延迟 <= 0)
滚动延迟 = 30
.如果真结束
返回 (SendMessageA (窗口句柄, #PBM_SETMARQUEE, #TRUE, 滚动延迟) = 1)
#### **优化与扩展实现**
在原有逻辑基础上,增加以下功能:
1. **支持普通模式的恢复**
- 通过移除 `PBS_MARQUEE` 样式,将进度条恢复为普通模式。
- 适用于需要动态切换进度条模式的场景。
2. **参数校验**
- 确保滚动延迟值在合理范围内(例如 10~500 毫秒)。
- 对非法窗口句柄进行提前退出处理。
3. **兼容手动滚动**
- 在不使用系统自动滚动的场景下,可以通过时钟事件实现自定义滚动效果,提供更高的灵活性。
扩展后的代码如下:
```易语言
.版本 2
.子程序 设置进度条模式, 逻辑型, 公开
.参数 窗口句柄, 整数型
.参数 启用不确定模式, 逻辑型, 可空, 默认为 真
.参数 滚动延迟, 整数型, 可空, 默认为 30 毫秒
.局部变量 当前样式, 整数型
' 验证窗口句柄是否有效
.如果真 (IsWindow (窗口句柄) = 0)
返回 (假)
.如果真结束
当前样式 = GetWindowLongA (窗口句柄, #GWL_STYLE)
.如果真 (启用不确定模式)
当前样式 = 位或 (当前样式, #PBS_MARQUEE)
SetWindowLongA (窗口句柄, #GWL_STYLE, 当前样式)
.如果真 (是否为空 (滚动延迟) 或 滚动延迟 < 10 或 滚动延迟 > 500)
滚动延迟 = 30
.如果真结束
返回 (SendMessageA (窗口句柄, #PBM_SETMARQUEE, #TRUE, 滚动延迟) = 1)
.否则
当前样式 = 位与 (当前样式, 位取反 (#PBS_MARQUEE))
SetWindowLongA (窗口句柄, #GWL_STYLE, 当前样式)
返回 (SendMessageA (窗口句柄, #PBM_SETMARQUEE, #FALSE, 0) = 1)
.如果真结束
时钟 vs 自动滚动
PBM_SETMARQUEE
)是首选方案,能有效减少开发复杂度和资源消耗。参数边界处理
兼容性检查
Comctl32.dll
版本 6.0 或更高版本,否则 PBS_MARQUEE
将不起作用。https://wwcw.lanzoue.com/iIe1X2kd6o5g
密码:ba9d
lxn2wyf 发表于 2025-1-15 02:42
哦哟,这思路有点意思啊,不过直接用时钟感觉有点复杂呢,还有没有更简单的法子呀。 ...
欢迎光临 精易论坛 (https://125.confly.eu.org/) | Powered by Discuz! X3.4 |