平台:VS2005;
资料参考:来源于网络;
内容介绍:创建自绘进度条,并在进度条上显示当前进度的百分比。
第一步:创建基于对话框的工程,在对话框中放置一个进度条控件,
把进度条控件的属性Smooth设置为真。
第二步:
【1】添加基于进度条CProgressCtrl控件新类CMyProCtrl;
【2】为CMyProCtrl类添加WM_PAINT消息
【3】为CMyProCtrl类添加public变量如下:
COLORREF m_ColText;//文本颜色
COLORREF m_ColProgress;//进度条颜色
COLORREF m_ColBlank;//空白区域颜色
【4】在CMyProCtrl类构造函数中初始化变量:
m_ColText=RGB( 255, 0, 0);//文本颜色
m_ColProgress=RGB( 0, 255, 255);//进度条颜色
m_ColBlank=RGB( 192, 192, 192);//空白区域颜色
【5】在CMyProCtrl类OnPaint()中添加:
PAINTSTRUCT ps;//声明一个绘画区域
CDC *pDC=BeginPaint(&ps);//把绘画区域选入设备上下文并开始
int AdrPos=GetPos();//获取进度条的进度位置
CString StrPos;//声明字符串,用于显示进度条的进度
StrPos.Format ("%d%%",AdrPos);//把进度位置复制到StrPos
CRect ClientRC;
GetClientRect(&ClientRC);//获取客户区矩形
CSize CsText=pDC->GetTextExtent (StrPos);//获取显示StrPos的规模大小
int nX=(ClientRC.Width ()-CsText.cx )/2;//获取显示字符串的X
int nY=(ClientRC.Height ()-CsText.cy )/2;//获取显示字符串的Y
pDC->SetBkMode (TRANSPARENT);//设置背景模式为透明
int nMin,nMax;//声明进度条的最大最小限制
GetRange(nMin,nMax);//获取限制
double Every=(double)ClientRC.Width ()/(nMax-nMin);//获取单位刻度
int Now=Every*AdrPos;//当前长度
CRect LeftRC,RightRC;//声明进度条区域和空白区域
LeftRC=RightRC=ClientRC;
LeftRC.right =Now;//进度条区域
RightRC.left =Now;//空白区域
pDC->FillRect (LeftRC,&(CBrush)m_ColProgress);//画进度条区域
pDC->FillRect (RightRC,&(CBrush)m_ColBlank);//画空白区域
pDC->SetTextColor (m_ColText);//设置文本颜色
pDC->TextOutA (nX,nY,StrPos);//写文本
ReleaseDC(pDC);//销毁设备上下文
EndPaint(&ps);//结束绘画区域绘画
【6】把在CMyProCtrl类的头文件包含到对话框程序中;给进度条控件添加基于CMyProCtrl类的变量:m_ProCtrl
【7】为对话框程序添加WM_TIMER消息
SetTimer(1,100,NULL);
//在对话框程序初始化函数中开启时钟
在对话框程序OnTimer(UINT_PTR nIDEvent)中添加:
int NowPos=m_Progress.GetPos();//获取当前进度
m_Progress.SetPos (NowPos+1);//设置进度
【8】拓展:若要用位图绘画进度条,只需把CMyProCtrl类中的画刷换成位图画刷。
pDC->FillRect (LeftRC,&(CBrush)m_ColProgress);//画进度条区域
pDC->FillRect (RightRC,&(CBrush)m_ColBlank);//画空白区域
效果图: