MFC进度条的美化

内容介绍:创建自绘进度条,并在进度条上显示当前进度的百分比。

第一步:创建基于对话框的工程,在对话框中放置一个进度条控件,

把进度条控件的属性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】在CMyProCtrlOnPaint()中添加:

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);//画空白区域

效果图:

MFC进度条的美化

猜你喜欢

转载自www.cnblogs.com/nieshutao/p/11254368.html