您的位置:首页 > 教育 > 培训 > 实例080 进度条百分比显示

实例080 进度条百分比显示

2024/9/16 21:19:27 来源:https://blog.csdn.net/weixin_45794330/article/details/139937729  浏览:    关键词:实例080 进度条百分比显示

本文仅供学习交流,严禁用于商业用途,如本文涉及侵权请及时联系本人将于及时删除

目录

1.实例说明

2.技术要点

3.实现过程

4.实例结果

5.示例拓展


2.10 进度条控件典型实例进度条控件(Progress)用于显示程序的进度,在进行程序安装、文件传输时经常用到。

1.实例说明

在设计应用程序时,通常使用进度条来描述当前的操作进度。但是MFC提供的进度条控件不能够利用精确的数字或百分比来描述进度。本实例将实现进度条的百分比显示的功能,运行结果如图所示。

2.技术要点

在进度条控件中显示文字比较简单,只需要在进度条控件的OnPaint方法中根据当前的位置值输出字符串文本就可以了。为了提供进度条窗口的绘制效率,这里使用了BeginPaint方法来获得进度条窗口的设备上下文,在进度条窗口的设备上下文使用后,调用EndPaint方法来结束进度条窗口的绘制。

下面介绍这两个方法的使用。

(1)BeginPaint方法。

BeginPaint方法用于为窗口准备绘制操作,将绘制的信息填充到参数中。语法如下:

HDC BeginPaint(LPPAINTSTRUCT lpPaint);
参数说明:
● lpPaint:是一个PAINTSTRUCT结构指针,表示接收的绘制信息。
返回值:表示关联窗口的设备上下文指针。

(2)EndPaint方法。

EndPaint方法用于表示窗口的绘制操作结束。语法如下:

void EndPaint(LPPAINTSTRUCT lpPaint);
参数说明:
● lpPaint:是一个PAINTSTRUCT结构指针,包含了由BeginPaint方法获取的绘制信息。

3.实现过程

(1)新建一个基于对话框的应用程序。

(2)从CProgressCtrl类派生一个子类CTextProgress。

(3)向对话框中添加一个进度条控件,设置控件的Border和Smooth属性,关联变量m_Progress,其类型为CTextProgress。

(4)向CTextProgress类中添加成员变量。代码如下:

#pragma once
#include "afxcmn.h"
class CTextProgress :public CProgressCtrl
{
public:CTextProgress();~CTextProgress();COLORREF m_crText;         //文本颜色COLORREF m_crProgress;     //进度颜色COLORREF m_crBlank;        //空白区域颜色
};

并初始化对象

https://blog.csdn.net/self_mind/article/details/50859718

CTextProgress::CTextProgress()
{m_crText=RGB(255, 0, 0);m_crProgress=RGB(0,0,255);m_crBlank = RGB(255, 255, 255);
}

(5)处理进度条的WM_PAINT消息,在其消息处理函数中绘制进度条的文本和当前进度。代码如下:

void CTextProgress::OnPaint()
{//CPaintDC dc(this); // device context for painting// TODO:  在此处添加消息处理程序代码// 不为绘图消息调用 CProgressCtrl::OnPaint()PAINTSTRUCT ps;CDC*pDC = BeginPaint(&ps);                              //开始绘制int nPos = GetPos();                                     //获取当前进度条的位置CString csPos;csPos.Format(_T("%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));          //使用蓝色标识当前的进度/**********************************二选一*****************************/for (int m = 255; m>0; m--){int x, y;x = leftRC.Width() * m / 255;pDC->FillRect(CRect(0, 0, x, leftRC.Height()), &CBrush(RGB(255, m, 0)));}//使用彩色标识当前的进度/***************************************************************/pDC->FillRect(rightRC, &CBrush(m_crBlank));            //使用白色标识剩余的部分pDC->SetTextColor(m_crText);                          //设置文本颜色pDC->TextOut(nX, nY, csPos);                            //输出当前的进度ReleaseDC(pDC);                                       //释放设备上下文EndPaint(&ps);                                  //结束窗口绘制}

(6)处理主窗口的WM_TIMER消息,在消息处理函数中设置进度条的显示进度。代码如下:

void C进度条百分比Dlg::OnTimer(UINT_PTR nIDEvent)
{// TODO:  在此添加消息处理程序代码和/或调用默认值if (nIDEvent == 1){int nCurPos = m_Progress.GetPos();                    //获取进度条的当前位置m_Progress.SetPos(nCurPos + 1);                      //设置进度条的位置if (m_Progress.GetPos() >= 100){KillTimer(1);MessageBox(_T("进程完毕"));}}CDialogEx::OnTimer(nIDEvent);
}

(7)在进度条百分比Dlg::OnInitDialog()中添加相应的初始化代码,代码如下:

BOOL C进度条百分比Dlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);			// 设置大图标SetIcon(m_hIcon, FALSE);		// 设置小图标// TODO:  在此添加额外的初始化代码m_Progress.SetRange(0, 100);		// 设置进展条范围//m_Progress.SetStep(5);m_Progress.SetPos(0); //设置进度条初始位置SetTimer(1, 1000, NULL); //启动Timerreturn TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

4.实例结果

5.示例拓展

根据本实例,读者可以:在滑块显示的进度条中显示进度文本。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com