4.自定义类的使用,添加进度条控件,关联变量CProgressEx m_Progress;添加按钮,关联函数用于触发定时器SetT ...
94上位机VC MFC进度条文字显示进度百分比
功能展示
MFC默认的进度条只有滚动的进度,没有具体的文字显示当前进百分比,我们当前例程就给进度条添加进度百分比,显示滚动比例的同时显示文字百分比,方便用户一目了然知晓当前操作进度。效果如图 要点提示 只需要在从CProgressCtrl派生自己的类,在OnPaint() 函数中实现便可。我们输出字符的起始位置是比较关键的一点:要输出字符串的总长度可以用进度条的CDC获得CSizesztext = pDC->GetTextExtent(sText); sztext 就包含了指定字符串的总长度和高度;获得进度条的窗口总长宽可用GetClientRect(clientRC),clientRC就包含了窗口的总长宽;那么文字输出的坐标X,Y,就可能通过int nX = (clientRC.Width() - sztext.cx) / 2; int nY = (clientRC.Height() -sztext.cy) / 2;获得; 实现功能 1.新建基于对话框的应用程序 2.从CProgressCtrl派生一个新类,class CProgressEx : public CProgressCtrl,添加三个变量用于设置不同的颜色值private: COLORREF m_crText; //文本颜色 COLORREFm_crProgress; //进度颜色 COLORREF m_crBlank; //空白区域颜色;并在构造函数中初始化 m_crText = RGB(255,0, 0); m_crBlank = RGB(182, 182, 182); m_crProgress = RGB(0,255, 0);
3.添加OnPaint()函数实现当前进度文字显示功能; - void CProgressEx::OnPaint()
- {
- // CPaintDC dc(this); // device context for painting
- PAINTSTRUCT ps;
- CDC* pDC = BeginPaint(&ps); //开始绘制
- int nPos = GetPos(); //获取当前进度条的位置
- CString csPos;
- csPos.Format("%d%%", nPos); //格式化字符串
- CRect clientRC;
- GetClientRect(clientRC); //获取客户区域
- CSize sztext = pDC->GetTextExtent(csPos); //获取字符串的高度和宽度
- int nX = (clientRC.Width() - sztext.cx) / 2; //计算中心位置
- int nY = (clientRC.Height() - sztext.cy) / 2;
- pDC->SetBkMode(TRANSPARENT); //将设备上下文的背景模式设置为透明
- int nMin, nMax;
- GetRange(nMin, nMax); //获取进度条的显示范围
- //获取单位刻度
复制代码- double dFraction = (double)clientRC.Width() / (nMax-nMin);
- int nLeft = nPos * dFraction; //计算左边距
- CRect leftRC = clientRC;
- leftRC.right = nLeft;
- CRect rightRC = clientRC;
- rightRC.left = nLeft;
- pDC->FillRect(leftRC, &CBrush(m_crProgress)); //使用蓝色标识当前的进度
- pDC->FillRect(rightRC, &CBrush(m_crBlank)); //使用白色标识剩余的部分
- pDC->SetTextColor(m_crText); //设置文本颜色
- pDC->TextOut(nX, nY, csPos); //输出当前的进度
- ReleaseDC(pDC); //释放设备上下文
- EndPaint(&ps);
- }
复制代码4.自定义类的使用,添加进度条控件,关联变量CProgressEx m_Progress;添加按钮,关联函数用于触发定时器SetTimer(1, 100, NULL);再实现定时器处理功能 if(1==nIDEvent) { int nMin, nMax; m_Progress.GetRange(nMin,nMax); if(m_Progress.GetPos()>=nMax)//进度完成时处理 { CDialog::OnOK(); } m_Progress.SetPos(m_Progress.GetPos()+1); }
我们来演示下功能实现的整个过程
|