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);

运行效果:

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bczheng1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值