带文本的进度控件






4.89/5 (49投票s)
一个带有文本的平滑进度控件。
这是一个简单的 CProgressCtrl
派生类,它允许在进度条上显示文本,方式与许多“安装程序”显示长时间操作进度的方式非常相似。
该控件非常简单,允许执行标准 CProgressCtrl
的相同操作,以及
void SetShowText(BOOL bShow); | 指定在更新期间是否显示控件的文本 |
COLORREF SetBarColor(COLORREF crBarClr = CLR_DEFAULT); | 指定进度控件条的颜色,并返回之前的颜色。如果颜色设置为 CLR_DEFAULT ,则使用 Windows 默认颜色。 |
COLORREF GetBarColor(); | 返回进度控件条的颜色,如果正在使用默认的 Windows 颜色,则返回 CLR_DEFAULT 。 |
COLORREF SetBarBkColor(COLORREF crBarClr = CLR_DEFAULT); | 指定控件背景的颜色,并返回之前的背景颜色。如果颜色设置为 CLR_DEFAULT ,则使用 Windows 默认颜色。 |
COLORREF GetBarBkColor(); | 返回控件背景的颜色,如果正在使用默认的 Windows 颜色,则返回 CLR_DEFAULT 。 |
COLORREF SetTextColor(COLORREF crBarClr = CLR_DEFAULT); | 指定文本的颜色,并返回之前的颜色。如果颜色设置为 CLR_DEFAULT ,则使用 Windows 默认颜色。 |
COLORREF GetTextColor(); | 返回文本的颜色,如果正在使用默认的 Windows 颜色,则返回 CLR_DEFAULT 。 |
COLORREF SetTextBkColor(COLORREF crBarClr = CLR_DEFAULT); | 指定文本的背景颜色,并返回之前的背景颜色。如果颜色设置为 CLR_DEFAULT ,则使用 Windows 默认颜色。 |
COLORREF GetTextBkColor(); | 返回文本的背景颜色,如果正在使用默认的 Windows 颜色,则返回 CLR_DEFAULT 。 |
BOOL SetShowPercent(BOOL bShow) | 设置是否显示进度条的百分比值,并返回旧值 |
DWORD AlignText(DWORD dwAlignment = DT_CENTER) | 设置文本对齐方式并返回旧值 |
BOOL SetMarquee(BOOL bOn, UINT uMsecBetweenUpdate) | 设置进度控件是否处于跑马灯模式,以及跑马灯块之间步骤的间隔(以毫秒为单位) |
int SetMarqueeOptions(int nBarSize) | 将跑马灯的大小设置为控件总宽度的百分比 |
要设置显示的文本,请使用标准的 CWnd::SetWindowText
。如果您调用 SetShowText(TRUE)
但没有使用 CWnd::SetWindowText
指定任何窗口文本,则默认显示进度的百分比分数。
要使用该控件,只需像往常一样在您的应用程序中包含一个 CProgressCtrl
(动态添加或使用对话框模板),并将变量类型从 CProgressCtrl
更改为 CTextProgressCtrl
。(请确保包含 TextProgressCtrl.h)
目前进度仅显示为平滑条,颜色严格为 Windows 默认颜色。(这些可能在未来版本中更改。)
致谢
感谢 Keith Rule 提供的 CMemDC
类。
更新
Pete Arends 对代码进行了重大改进。他的更新内容包括:
- 将字体设置为父窗口字体
- 添加了
SetTextColour()
和GetTextColour()
函数 - 添加了许多消息处理程序,因此控件现在响应标准的进度条
PBM_*
消息。现在可以通过发送消息来控制文本进度控件。(从工作线程中效果很好)。 - 添加了两个新消息
PBM_SETSHOWTEXT
和PBM_SETTEXTCOLOR
。 - 添加了一个
OnGetPos()
处理程序。GetPos()
函数现在可以正常工作了!!
感谢 Pete!
2005 年 1 月 3 日:Kriz 也扩展了代码,添加了两个基本方法,允许在三种对齐样式 LEFT
、CENTER
和 RIGHT
之间切换 - 甚至可以动态切换。
代码更改
- 创建了一个受保护的
DWORD
成员m_dwTextStyle
- 在
OnPaint
中禁用了所有dwTextStyle
变量,或将其替换为
m_dwTextStyle
- 添加了两个名为
AlignText
和AlignTextInvalidate
的方法
语法
BOOL AlignText(DWORD aligment = DT_CENTER); BOOL AlignTextInvalidate(DWORD aligment = DT_CENTER);
参数/返回值
“alignment”可以是 DT_LEFT
、DT_CENTER
(默认)或 DT_RIGHT
。使用带无效化的版本会强制控件自动重绘自身。如果提供了错误的对齐标志,这两个方法都会返回 FALSE
,否则它们将向调用者返回 TRUE
。
感谢 Kriz!
我还更新了代码,使其可以在 VC7.X 中编译。
2006 年 3 月 9 日:Tony Bommarito 更新了代码,增加了更多的颜色设置,修正了垂直文本模式,并添加了新的跑马灯模式。
2007 年 2 月 26 日:Tony Mommarito 提供了进一步的更新
- 修复了一个 bug,当使用应用程序清单时,XP 上进度条的外边缘未绘制。
- 以一种与 Robert Pickford 消息中建议的方式略有不同的方式,添加了完全关闭跑马灯模式的功能。
- 修复了 dev75040 消息中报告的 Unicode 编译 bug。
- 添加了三个 SLN 和 VCPROJ 文件集;每个集分别用于 VS2002、VS2003 和 VS2005。通过移除正确集合的 VS… 扩展名,可以使用这三个 IDE 中的任何一个。
2023 年 12 月 18 日:UrbanBlues 将项目迁移到 VS 2022