VC MFC进程条(CProgressCtrl)控件

来源:互联网 发布:刷枪软件手机版 编辑:程序博客网 时间:2024/06/05 10:51

VC MFC进程条(CProgressCtrl)控件

CProgressCtrl类里相关函数介绍

void CProgressCtrl::SetRange( short nLower, short nUpper );//设置进程条上下限(范围)

int CProgressCtrl::GetPos();//获取进程条位置

int CProgressCtrl::SetPos( int nPos );//设置进程条位置

void CProgressCtrl::GetRange( int& nLower, int& nUpper );//获得进程条上下限

自绘进程条控件

首先得准备两张图片,如下图:

背景

前景

导入这两张位图到工程,ID号分别为IDB_BK   IDB_FE;

从CProgressCtrl派生出子类CNewProgressCtrl,然后给对话框添加进程条控件,关联变量m_ProgressCtrl(类型:CNewProgressCtrl),接着给子类添加WM_PAINT消息处理函数,该函数代码如下:

void CNewProgressCtrl::OnPaint()
{

 CPaintDC dc(this); // device context for painting
 CRect rect;
 GetClientRect(rect);
 CRect strRect=rect;//文字区域
 int nPos=GetPos();
 int nMin,nMax;
 CDC memDC;
 memDC.CreateCompatibleDC(&dc);
 CBitmap bmp;
 bmp.LoadBitmap(IDB_BK);
 BITMAP bmpInfo;
 bmp.GetBitmap(&bmpInfo);
 memDC.SelectObject(&bmp);
 dc.StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&memDC,0,0,
           bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY);//画背景
 GetRange(nMin,nMax);
 double ratio=(double)rect.Width()/(nMax-nMin);
 rect.right=nPos*ratio;//计算进程条当前宽度
 bmp.DeleteObject();
 bmp.LoadBitmap(IDB_FE);
 bmp.GetBitmap(&bmpInfo);
 memDC.SelectObject(&bmp);
 dc.StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&memDC,0,0,
           rect.Width(),rect.Height(),SRCCOPY);//画前景
    bmp.DeleteObject();
 double hratio=nMax/(double)100;
 int hPos=nPos/hratio;//计算百分比值
 CFont Font;
 Font.CreatePointFont(150,"宋体");
 dc.SelectObject(&Font);
 dc.SetTextColor(RGB(255,255,255));
 CString str;
 str.Format("%d%%",hPos);
 dc.SetBkMode(TRANSPARENT);
 dc.DrawText(str,strRect,DT_VCENTER|DT_CENTER);
 memDC.DeleteDC();
 Font.DeleteObject();
 // TODO: Add your message handler code here
 
 // Do not call CProgressCtrl::OnPaint() for painting messages
}

给对话框类添加WM_TIMER(计时器)消息处理函数,这里设置进程条位置,每隔一段时间。该函数代码如下:

void CSeventhDlg::OnTimer(UINT nIDEvent)
{
 static int i=0,nMin,nMax;
 if(i==0)
 m_ProgressCtrl.GetRange(nMin,nMax);
 // TODO: Add your message handler code here and/or call default
 m_ProgressCtrl.SetPos(i);
 i++;
   if(i>nMax)
 {
  KillTimer(1001);
  MessageBox("已完成");
 }
 //CDialog::OnTimer(nIDEvent);
}

对话框初始化函数添加代码如下:
 m_ProgressCtrl.SetRange(0,130);
 SetTimer(1001,100,NULL);

运行效果:

原创粉丝点击