progress control主要用来在进行数据读写,文件拷贝等操作总显示当前的工作进度,因此其主要操作就是设置进度条的位置和范围,并不断更新当前位置。
VC自带的进度条控件,除了在进度条上显示一个蓝色的光带外,没有其他的说明。下面我写了一个自己的控件类,如果对OnPaint函数进行一些修改的话就可以实现各种动画的功能了。
//MyTextProgressCtr.h
#ifndef define MYTEXTPROGRESSCTRL
#define MYTEXTPROGRESSCTRL
#pragma once
#include "afxcmn.h"
class CMyTextProgressCtrl :
public CProgressCtrl
{
public:
CString strBarTitle;
public:
CMyTextProgressCtrl(void);
virtual ~CMyTextProgressCtrl(void);
void SetBarCaption(CString title);
protected:
afx_msg void OnPaint();
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
DECLARE_MESSAGE_MAP()
};
#endif
//MyTextProgressCtrl.cpp
#include "StdAfx.h"
#include "./mytextprogressctrl.h"
CMyTextProgressCtrl::CMyTextProgressCtrl(void)
{
strBarTitle.Empty();
}
CMyTextProgressCtrl::~CMyTextProgressCtrl(void)
{
}
BEGIN_MESSAGE_MAP(CMyTextProgressCtrl,CProgressCtrl)
ON_WM_PAINT()
ON_WM_CREATE()
END_MESSAGE_MAP()
void CMyTextProgressCtrl::OnPaint()
{
CPaintDC dc(this);
int pos = GetPos();
int low,hight;
low=hight=0;
GetRange(low,hight);
int range=hight-low;
float percent = float(pos)/float(range);
CRect rect;
GetClientRect(&rect);
rect.right = rect.left + percent * rect.Width();
dc.FillSolidRect(&rect,RGB(0,0,255));
if (!strBarTitle.IsEmpty())
{
CRect rt;
GetClientRect(&rt);
dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(RGB(255,255,255));
CSize ext;
ext = dc.GetTextExtent(strBarTitle);
int text=(rt.Width()-ext.cx)/2;
if (percent*rt.Width()<text)
{
dc.SetTextColor(RGB(0,0,255));
}
dc.DrawText(strBarTitle,rt,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
}
}
int CMyTextProgressCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CProgressCtrl::OnCreate(lpCreateStruct) == -1)
{
return -1;
}
return 0;
}
void CMyTextProgressCtrl::SetBarCaption(CString title)
{
strBarTitle = title;
Invalidate();
}