65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.95/5 (62投票s)

2003年4月21日

CPOL

6分钟阅读

viewsIcon

229494

downloadIcon

5522

一个 CStatic 派生的进度条控件,可以有效地指示“忙碌状态”,并兼具美观的进度条外观。

Sample Image - kcbusyprogress.jpg

描述

本文介绍了一个 CStatic 派生的进度条,它允许通过沙漏光标以外的方式来指示没有明确结束的“忙碌”时间。

将代码添加到您的项目

通过以下步骤,可以将 CKCBusyProgress 控件子类化到对话框中:

  1. 将 .h 和 .cpp 文件插入到您的项目中
  2. 在您的对话框资源中添加一个静态控件
  3. 为静态控件添加一个成员变量(例如 m_ctlBProgress
  4. 将变量声明从
    CStatic m_ctlBProgress;
    to
    CKCBusyProgress m_ctlBProgress;
  5. 搞定!控件已嵌入!

公共函数

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_BLOCKBPC_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()

已知问题/待办事项列表

  • 必须实现一个方向标志来指示水平或垂直显示
  • 正在考虑添加一个工具提示,在控件处于 BPC_MODE_PROGRESS 模式时指示“百分比”完成

    结论

    如果您想要标准 Windows CProgressCtrl 控件的替代品,可以试试这个。如果您喜欢,请告诉我;)

    历史

    版本

    发布日期

    更改日志

    0.3 2003-05-05
  • 为剩余的“SetXXX()”函数添加了 BPM_XXXXX 消息。上面的消息列表已更新
  • 修复了一个严重的线程 bug(感谢 luedi 提供的此问题)
  • 0.21 2003-04-30
  • 修复了快速连续调用 Start() 时发生的线程 bug。感谢 Mark Richards 的告知
  • 0.20 2003-04-22
  • 添加了对 WM_SYSCOLORCHANGE 消息的支持
  • 添加了一个标志,指示背景颜色是否为系统颜色(默认为 true)
  • 将所有 ON_MESSAGE() 处理程序更改为返回 LRESULT(与 VC7 的兼容性问题)
  • 添加了“忙碌类型”标志以支持在忙碌模式下的不同运动。支持的模式有:BPC_BUSY_PINGPONGBPC_BUSY_LTRBPC_BUSY_RTL
  • 添加了“忙碌填充”标志以支持在忙碌模式下的不同填充方法。支持的填充模式有:BPC_BUSYFILL_BLOCKBPC_BUSYFILL_SMOOTH
  • 更新了源文件和演示 .zip 文件
  • 修复了进度条百分比计算中的一个小 bug。
  • 0.1 2003-04-21
  • 首次公开发布
  • © . All rights reserved.