适用于各种场合的新进度条...






4.95/5 (62投票s)
一个 CStatic 派生的进度条控件,可以有效地指示“忙碌状态”,并兼具美观的进度条外观。
描述
本文介绍了一个 CStatic
派生的进度条,它允许通过沙漏光标以外的方式来指示没有明确结束的“忙碌”时间。
将代码添加到您的项目
通过以下步骤,可以将 CKCBusyProgress 控件子类化到对话框中:
- 将 .h 和 .cpp 文件插入到您的项目中
- 在您的对话框资源中添加一个静态控件
- 为静态控件添加一个成员变量(例如
m_ctlBProgress
) - 将变量声明从
CStatic m_ctlBProgress;
toCKCBusyProgress m_ctlBProgress;
- 搞定!控件已嵌入!
公共函数
void SetNumSteps(int nNumSteps)
设置控件中可见块的数量
int GetNumSteps()
获取控件中可见块的数量
void SetCurPos(int nCurPos)
设置标记的当前位置
int GetCurPos()
获取标记的当前位置
void SetInterBlockPadding(int nPadding)
设置每个块之间的像素数
int GetInterBlockPadding()
获取每个块之间的像素数
void SetSpeed(int nSpeed)
在 BPC_MODE_BUSY 模式下设置控件视觉更新的速度(以毫秒为单位)
int GetSpeed()
获取控件在 BPC_MODE_BUSY 模式下视觉更新的速度(以毫秒为单位)
bool IsRunning()
指示控件当前是否正在指示忙碌状态(控件必须处于 BPC_MODE_BUSY 模式)
void SetMode(int nMode = BPC_MODE_BUSY)
设置控件的模式
有效参数是:
BPC_MODE_BUSY | 0x00000001 | 将控件置于 BusyProgress 模式(无需范围) |
BPC_MODE_PROGRESS | 0x00000002 | 将控件置于 ProgressBar 模式(可以设置范围 - 默认为 0 .. 100) |
int GetMode()
获取控件的当前模式
void SetRange(int nLower, int nUpper)
设置控件在 BPC_MODE_PROGRESS 模式下的下限和上限
void GetRange(int& nLower, int& nUpper)
获取控件的下限和上限
void Recalc()
请求控件重新计算其内部视觉元素和比例
void Reset()
调用此函数可将控件重置为创建时的状态
void Start()
请求控件启动其“忙碌”模式。仅当控件的模式为 BPC_MODE_BUSY 时有效
void End()
请求控件结束其“忙碌”模式。仅当控件的模式为 BPC_MODE_BUSY 且先前调用了 Start() 函数时才有效
void StepIt()
调用此函数可手动“步进”控件标记。此函数在两种模式下都有效。在 BPC_MODE_BUSY 模式下调用时,一旦标记到达控件的左边缘或右边缘,该函数将自动使其改变方向
COLORREF GetColBkg()
获取背景颜色
void SetColBkg(COLORREF col)
设置背景颜色
请记住,如果不想让系统对话框颜色的变化影响控件的背景,请调用 UseSysColBkg(false)
COLORREF GetColBlockFace()
获取普通块面的填充颜色
void SetColBlockFace(COLORREF col)
设置普通块面的填充颜色
COLORREF GetColBlockEdge()
获取普通块边框的画笔颜色
void SetColBlockEdge(COLORREF col)
设置普通块边框的画笔颜色
COLORREF GetColBlockFaceHi()
获取高亮块面的填充颜色
void SetColBlockFaceHi(COLORREF col)
设置高亮块面的填充颜色
COLORREF GetColBlockEdgeHi()
获取高亮块边框的画笔颜色
void SetColBlockEdgeHi(COLORREF col)
设置高亮块边框的画笔颜色
void UseSysColBkg(bool bUse = true)
指示控件是否使用 COLOR_3DFACE 系统颜色绘制背景。如果 bUse = true,控件将响应 WM_SYSCOLORCHANGE 消息并根据系统颜色变化进行更新
void SetBusyType(int nType = BPC_BUSY_PINGPONG)
指示控件在 BPC_MODE_BUSY 模式下运行时的运动类型。有 3 种选项:BPC_BUSY_PINGPONG, BPC_BUSY_LTR, BPC_BUSY_RTL
int GetBusyType()
获取控件在 BPC_MODE_BUSY 模式下当前使用的运动类型。
void SetBusyFill(int nFill = BPC_BUSYFILL_BLOCK)
指示控件在 BPC_MODE_BUSY 模式下运行时使用的填充方法类型。选项有:BPC_BUSYFILL_BLOCK
和 BPC_BUSYFILL_SMOOTH
int GetBusyFill()
获取控件在 BPC_MODE_BUSY 模式下运行时使用的填充方法类型。
void SetGranularity(int nGranularity = 5)
设置在 BPC_MODE_BUSY 模式下使用 BPC_BUSYFILL_SMOOTH 填充选项时的粒度级别。粒度越高,填充效果越平滑,但从控件的一侧到另一侧所需的时间也越长
int GetGranularity()
获取在 BPC_MODE_BUSY 模式下使用 BPC_BUSYFILL_SMOOTH 填充选项时的粒度级别。
可重写函数
virtual void DrawBackground(CDC& dc, CRect& rect)
如果您想要不同的背景绘制逻辑,请重写此函数。CRect rect 参数包含控件客户端区域的尺寸
virtual void DrawBlock(CDC& dc, CRect& rect)
如果您想更改控件中标准块的绘制逻辑,请重写此函数
CRect rect 参数包含正在绘制的块的尺寸
virtual void DrawHiliteBlock(CDC& dc, CRect& rect)
如果您想更改控件中高亮块的绘制逻辑,请重写此函数
CRect rect 参数包含正在绘制的块的尺寸
virtual void DrawPartialBlock(CDC& dc, CRect& rect)
如果您想更改控件中部分高亮块的绘制逻辑,请重写此函数
CRect rect 参数包含正在绘制的块的尺寸
... 控件响应消息 ...
以下消息用于通过SendMessage()
或 PostMessage()
函数与控件进行交互
Message |
WPARAM |
LPARAM |
对应的函数 |
BPM_SETNUMSTEPS |
步数 (int) |
N/A |
SetNumSteps(int nNumSteps) |
BPM_SETCURPOS |
当前标记位置 (int) |
N/A |
SetCurPos(int nCurPos) |
BPM_SETIBPAD |
块间填充(像素)(int) |
N/A |
SetInterBlockPadding(int nPadding) |
BPM_SETSPEED |
忙碌模式速度(毫秒)(int) |
N/A |
SetSpeed(int nSpeed) |
BPM_SETRANGE |
进度条下限 (int) |
进度条上限 (int) |
SetRange(int& nLower, int& nUpper) |
BPM_SETMODE |
控件模式 (int) |
N/A |
SetMode(int nMode) |
BPM_STARTBUSY |
N/A |
N/A |
Start() |
BPM_ENDBUSY |
N/A |
N/A |
End() |
BPM_STEPIT |
N/A |
N/A |
StepIt() |
BPM_SETBUSYTYPE |
忙碌模式类型 (int) |
N/A |
SetBusyType(int nType) |
BPM_SETBUSYFILL |
填充类型 (int) |
N/A |
SetBusyFill(int nFill) |
BPM_SETGRANULARITY |
粒度 (int) |
N/A |
SetGranularity(int nGran) |
BPM_SETCOLBKG |
颜色 (COLORREF) |
N/A |
SetColBkg(COLORREF col) |
BPM_SETCOLBFACE |
颜色 (COLORREF) |
N/A |
SetColBlockFace(COLORREF col) |
BPM_SETCOLBEDGE |
颜色 (COLORREF) |
N/A |
SetColBlockEdge(COLORREF col) |
BPM_SETCOLBFACEHI |
颜色 (COLORREF) |
N/A |
SetColBlockFaceHi(COLORREF col) |
BPM_SETCOLBEDGEHI |
颜色 (COLORREF) |
N/A |
SetColBlockEdgeHi(COLORREF col) |
BPM_RECALC |
N/A |
N/A |
Recalc() |
BPM_RESET |
N/A |
N/A |
Reset() |
BPM_USESYSCOL |
标志 (0 = false, 非零 = true) |
N/A |
UseSysCol() |
已知问题/待办事项列表
结论
如果您想要标准 Windows CProgressCtrl 控件的替代品,可以试试这个。如果您喜欢,请告诉我;)
历史
版本 |
发布日期 |
更改日志 |
0.3 | 2003-05-05 |
|
0.21 | 2003-04-30 |
Start() 时发生的线程 bug。感谢 Mark Richards 的告知 |
0.20 | 2003-04-22 |
BPC_BUSY_PINGPONG 、BPC_BUSY_LTR 和 BPC_BUSY_RTL BPC_BUSYFILL_BLOCK 和 BPC_BUSYFILL_SMOOTH |
0.1 | 2003-04-21 |
|