ProgressCtrlST位图进度条控件类


翻译来源codeproject:https://www.codeproject.com/Articles/2840/CProgressCtrlST

请自行到codeproject下载,最后有我写的案例及改善后的class

位图进度条控制


一、介绍

CProgressCtrlST是从MFC CProgressCtrl派生的类。使用这个类,您的应用程序可以使用位图进行条,如许多现代安装程序和游戏中所见!

CProgressCtrlST功能:

  • 使用方便
  • 标准CProgressCtrl方法
  • 支持256+颜色位图
  • 支持负范围
  • 支持垂直进度控制
  • 包含完整的源代码!
  • 现有应用中无需成本实现

二、如何在您的应用程序中集成CProgressCtrlST

1.在您的项目中包括以下文件:

  • ProgressCtrlST.h
  • ProgressCtrlST.cpp
您还需要一个位图来绘制进度条。例如包括在您的项目中 Tile.bmp ,并将其  称为IDB_TILE 使用对话框编辑器创建一个称为进度控件,例如  IDC_TILED

2.然后为此进度控件创建一个成员变量:

CProgressCtrlST m_progressTiled;

3.现在将进度控件附加到CProgressCtrlST对于基于对话的应用程序,在 OnInitDialog中

// Call the base-class method
CDialog::OnInitDialog();

// Create the IDC_TILED progress control
m_progressTiled.SubclassDlgItem(IDC_TILED, this);
或在您的DoDataExchange中(一般采用此方法):
// Call the base method
CDialog::DoDataExchange(pDX);

// Create the IDC_TILED progress control
DDX_Control(pDX, IDC_TILED, m_progressTiled);
控件将具有与基本MFC类 CProgressCtrl 中相同的默认范围和起始位置 可以使用与基类相同的方法来修改这些值,例如, SetRange SetPos 此时 OffsetPos 不支持。

默认情况下,控件将像正常的进度条一样绘制自己。可以分配位图来获取进度条,而不是正常的标准块!

该位图将被平铺以绘制进度条的必要部分; 它不会以任何方式收缩或扩大。

4.为进度条分配位图:

// Assign a bitmap
m_progressTiled.SetBitmap(IDB_TILE);
您的进度控制现在是 CProgressCtrlST

三、类方法

SetBitmap
设置用于绘制进度条的位图。

// Parameters:
//     [IN]   nBitmap
//            Resource ID of the bitmap to use as background.
//            Pass NULL to remove any previous bitmap.
//     [IN]   bRepaint
//            If TRUE the control will be repainted.
//
// Return value:
//     PROGRESSST_OK
//        Function executed successfully.
//     PROGRESSST_INVALIDRESOURCE
//        The resource specified cannot be found or loaded.
//
DWORD SetBitmap(int nBitmap, BOOL bRepaint = TRUE)
SetBitmap
设置用于绘制进度条的位图。
// Parameters:
//     [IN]   hBitmap
//            Handle to the bitmap to use as background.
//            Pass NULL to remove any previous bitmap.
//     [IN]   bRepaint
//            If TRUE the control will be repainted.
//
// Return value:
//     PROGRESSST_OK
//        Function executed successfully.
//     PROGRESSST_INVALIDRESOURCE
//        The resource specified cannot be found or loaded.
//
DWORD SetBitmap(HBITMAP hBitmap, BOOL bRepaint = TRUE)
SetRange
设置进度条控件的范围的上限和下限,并重绘条以反映新的范围。
// Parameters:
//     [IN]   nLower
//            Specifies the lower limit of the range (default is zero).
//     [IN]   nUpper
//            Specifies the upper limit of the range (default is 100).
//
void SetRange(int nLower, int nUpper)
SetStep
指定进度条控件的步进增量。
步进增量是对StepIt的调用增加进度条的当前位置的量。
// Parameters:
//     [IN]   nStep
//            New step increment.
//
// Return value:
//     The previous step increment.
//
int SetStep(int nStep)
SetPos
设置进度条控件由nPos指定的当前位置,并重新绘制栏以反映新位置。
进度条控制的位置不是屏幕上的物理位置,而是位于SetRange中指示的上下范围之间。
// Parameters:
//     [IN]   nPos
//            New position of the progress bar control.
//
// Return value:
//     The previous position of the progress bar control.
//
int SetPos(int nPos)
StepIt
进展由步长增量进度栏控件的当前位置和重绘棒,以反映新的位置。
步增量由SetStep方法设置。
// Return value:
//     The previous position of the progress bar control.
//
int StepIt()
OnDrawText
每次重绘进度条时都会调用此函数。
这是一个虚拟函数,让派生类进行自定义绘图。
默认实现什么都不做。
// Parameters:
//     [IN]   pDC
//            Pointer to the device context.
//     [IN]   nPercentage
//            Current percentage of the progress bar.
//     [IN]   rcCtrl
//            A CRect object that indicates the dimensions of the entire control.
//     [IN]   rcProgress
//            A CRect object that indicates the dimensions of the currently displayed bar.
//     [IN]   bVertical
//            TRUE if the progress is vertical, otherwise FALSE.
//
virtual void OnDrawText(CDC* pDC, int nPercentage, CRect rcCtrl, CRect rcProgress, BOOL bVertical)
GetVersionI
将类版本作为一个简短的值返回。
// Return value:
//     Class version. Divide by 10 to get actual version.
//
static short GetVersionI()

GetVersionC

返回类版本作为字符串值。

// Return value:
//     Pointer to a null-terminated string containig the class version.
//
static LPCTSTR GetVersionC()

四、案例

关于讨论区提到的内存泄漏问题,需要卸载相应对象。案例ProgressCtrlST类已修改...

OnPaint() 
{
..

CRect rcFullCtrl;

GetClientRect(rcFullCtrl);
OnDrawText(&dc, nPercentage, rcFullCtrl, rcCtrl, bVertical);

// need this lines...
DeleteDC(hdcMem);
DeleteDC(hdcTemp);
DeleteObject(hbmpTemp);

}

src+vs2015案例: http://download.csdn.net/detail/greless/9869264
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值