实例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.示例拓展

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/34467.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NetSuite 文件夹 Group Restriction的探究

同一个角色&#xff0c;为什么相同的文件&#xff0c;有的用户可以看&#xff0c;而有的用户不能看呢&#xff1f;这其中与一个隐藏功能相关&#xff0c;即文件夹的Restriction相关&#xff0c;其中一个非常典型的点是Group Restriction&#xff08;组限制&#xff09;&#xf…

Web渗透:XXE-XML外部实体漏洞

XML External Entity (XXE) 漏洞是一种注入攻击&#xff0c;利用不安全的XML解析器来执行各种恶意操作&#xff0c;如读取本地文件、执行远程代码、发起拒绝服务攻击等&#xff1b;此漏洞的根本原因在于XML标准允许在文档中定义外部实体&#xff0c;并在解析时进行解析和替换。…

Navicat连接服务器MySQL

Navicat连接服务器MySQL 1. Navicat连接服务器MySQL2. 如何查看MySQL用户名和密码3. 修改MySQL登录密码4. 安装MySQL(Centos7)遇到错误和问题1. error 1045 (28000): access denied for user rootlocalhost (using password:yes) 1. Navicat连接服务器MySQL 选择数据库 直接使用…

jar包转exe封装软件并一键安装使用

目录 封装文档说明如有跨域问题在ems服务增加配置服务启动自动打开浏览器使用工具 Launch4j 把jar包打成exe执行文件现在还不能给用户用&#xff0c;因为缺少jre&#xff0c;后面整合资源会把jre一起打包使用inno setup合并资源&#xff0c;mysql之类的服务&#xff0c;最终打包…

【系统架构设计师】四、嵌入式基础知识(软件|软件设计|硬件|式总线逻辑)

目录 一、嵌入式软件 1.1 嵌入式软件分类 1.2 板级支持包(BSP) 1.3 BootLoader 1.4 设备驱动程序 二、嵌入式软件设计 2.1 编码 2.2 交叉编译 2.3 交叉调试 三、嵌入式系统硬件的分类 3.1 根据用途分类 3.2 存储器分类 四、内&#xff08;外&#xff09;总线逻辑 …

uni-app系列:uni.navigateTo传值跳转

文章目录 1. 使用URL参数2. 使用页面栈注意事项&#xff1a;uni.navigateTo API 参数详细说明回调函数参数 在uni-app中&#xff0c;如果想要通过uni.navigateTo方法跳转到另一个页面并传递参数&#xff0c;可以使用页面路由的URL参数或者页面栈的方式来传递。但是&#xff0c;…

分享一个解决 EF 性能低的思路,通过 Python 访问心跳侦测 API 保持 EF 在线

前言 .NET FrameWork EF&#xff08;Entity Framework&#xff09;是一个很优秀的 ORM 框架&#xff0c;对于提高工作效率很有帮助&#xff0c;但由于底层原因&#xff0c;在程序启动时&#xff0c;EF 需要初始化和加载模型及其对应的数据库元数据等等&#xff0c;涉及到数据库…

20240507-招商证券 基于鳄鱼线的指数择时及轮动策略

动量震荡指标构造 动量震荡指标为交易者提供了获利的钥匙。动量震荡指标测算了5根价格柱相对于34根价格柱的动量变化。首先计算最近5根价格柱的最高价和最低价间的中点的简单移动平均值&#xff0c;即(最高价最低价)12的简单移动平均&#xff0c;将得出的值减去最近34根价格柱…

Cephalo:专门用于仿生设计的多模态视觉大型语言模型

实时了解业内动态&#xff0c;论文是最好的桥梁&#xff0c;专栏精选论文重点解读热点论文&#xff0c;围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;…

审美进阶:7个小程序模板,助你提高设计感!

小程序是一种无需下载和安装即可使用的应用程序。小程序实现了应用程序“触手可及”的梦想。用户可以通过扫描或搜索打开应用程序。对于开发者来说&#xff0c;小程序也大大降低了开发成本。因此&#xff0c;越来越多的品牌争相制作小程序应用程序。本文将为您带来优秀的微信小…

ubuntu安装qtcreator与环境配置

sudo apt-get update sudo apt-get install gcc g # 两个编译器 sudo apt-get install build-essential # 编译c/c所需要的软件包 sudo apt-get install libgl1-mesa-dev # 安装mesa&#xff0c;Mesa 实际上是一个库&#xff0c;它实现了多种图形 API 规范 sudo apt-get insta…

MFC结构体定义中使用CString类型

MFC的结构体定义中字符串可以使用CString类型&#xff1b; struct MyStruct {int x;int y;CString str; }; ...... void CTttView::OnDraw(CDC* pDC) {CTttDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCString str1;MyStruct m_…

vue配置中的process.env

项目中的.env开头的文件是否知道是干什么的呢 主要是为了区分测试环境还是生产环境env.development为测试环境 # 测试环境 NODE_ENV development VUE_APP_BASE_API http://xxxxxxxxx // 命名一定要以 VUE_APP_ 开头&#xff0c;要不然根本取不到 .env.production为生产环境…

C++ 内存分配可视化

GitHub - archibate/mallocvis: allocation visualization in svg graph 正常连续内存分配 #include <vector>int main() {// 堆mallocstd::vector<int> memory;for (int i 0; i < 1000; i) {memory.emplace_back(i*10);}return 0; } 主动内存分配释放 #in…

微信小程序简易录音机

首先先创建一个项目&#xff08;想必大家都会啦那就直接开干&#xff09; 首先上html结构 <view class"wx-container"><view id"title">录音机</view><view id"time">{{hours}}:{{minute}}:{{second}}</view>&l…

20240624在飞凌OK3588-C的Buildroot下查证GPIO64和gpiochip64的差异

20240624在飞凌OK3588-C的Buildroot下查证GPIO64和gpiochip64的差异 2024/6/24 20:19 GPIOchip代表GPIO控制器的编号&#xff0c;gpio代表特定GPIO的引脚号 本文以linux R4/Buildroot位例子&#xff0c;同样适用于Android12和其他【使用linux内核的】操作系统。 https://www.ji…

java医院绩效考核系统源码:医院绩效考核的发展趋势、医院绩效考核的具体方法

java医院绩效考核系统源码&#xff1a;医院绩效考核的发展趋势、医院绩效考核的具体方法 医疗机构绩效考核是对医疗机构绩效进行评估和分析的一项重要工作。它对医疗机构的发展起到了重要的指导和推动作用。本文将会分析国际上医院绩效考核的发展趋势以及医院绩效考核的具体方…

MySQL中的Redo-log是什么?有什么作用?

用来实现数据的恢复&#xff0c;数据被更新到缓冲区但没刷磁盘&#xff0c;然后MySQL宕机了&#xff0c;MySQL会通过日志恢复数据。 1.为什么需要Redo-log日志&#xff1f; MySQL绝大部分引擎都是基于磁盘存储数据的&#xff0c;每次读写数据都走磁盘&#xff0c;效率十分低下…

AI绘画Stable Diffussion 实操教程: 真人图片秒变动漫风,亲手绘制你的专属动漫头像

大家好&#xff0c;我是向阳 你是否曾幻想过自己置身于动漫世界&#xff0c;拥有那些令人羡慕的二次元特征&#xff1f;随着人工智能技术的飞速发展&#xff0c;这一幻想已不再遥不可及。在本文中&#xff0c;我们将一起揭开Stable Diffusion技术的神秘面纱&#xff0c;探索如…

WebFlux 和 Spring Security 会碰出哪些火花?

项目创建成功后&#xff0c;我们添加一个接口&#xff0c;用来获取登录用户信息&#xff0c;如下&#xff1a; RestController public class UserController { GetMapping(“/user”) public Mono getCurrentUser(Mono principal) { return principal; } } 注意我们的返…