MFC进度条学习笔记

MFC进度条学习笔记最近工作中有使用到进度条的知识,就来学习学习这个控件~~先来看看想要达到的效果:好的,现在开始正题。我们这里的进度条,在程序里面叫做CProgressCtrl,它是继承自CWnd类的基础控件类,用来展示工作进展度。1、主线程的处理方式。1.1先给我们的控件添加一个环境变量,起个名字就叫做: CProgressCtrlm_progressCtrl;1.2接着,在对话框初始化的时…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

最近工作中有使用到进度条的知识,就来学习学习这个控件~~
先来看看想要达到的效果:
在这里插入图片描述
好的,现在开始正题。
我们这里的进度条,在程序里面叫做CProgressCtrl,它是继承自CWnd类的基础控件类,用来展示工作进展度。

1、主线程的处理方式。
1.1先给我们的控件添加一个环境变量,起个名字就叫做:

	CProgressCtrl m_progressCtrl;

1.2 接着,在对话框初始化的时候做一些初始化工作:

void CdemoDlg::Init()
{ 
   
	m_progressCtrl.SetRange(0, 100);//设置进度条数值变化范围
	m_progressCtrl.SetPos(0);			  //设置进度条默认初始进度
	m_progressCtrl.SetStep(m_nStep);

	//文本框百分比显示
	CString str;
	int nPos = m_progressCtrl.GetPos(); // 获取进度条的当前位置
	str.Format("%d", nPos);
	GetDlgItem(IDC_STATIC_PERCENT)->SetWindowText(str + _T("%"));//显示进度条初始进度
}

1.3 然后,需要在头文件里面添加几个重要的方法和变量:

private:
	int m_nStopType;	//0加载完毕结束1外界干扰结束
public:
	int m_nStep;		//步长
	void UpdateProgress();	//用来更新我们的进度条
	void StopUpdate();		//用来结束我们的进度条
	afx_msg void OnBnClickedButtonPerLoad();	//手动点击
	afx_msg void OnBnClickedButtonAutoLoad();	//自动
	afx_msg void OnBnClickedButtonStopLoad();	//停止
	afx_msg void OnTimer(UINT_PTR nIDEvent);	//定时器

1.4 实现那些关键的函数:

void CdemoDlg::UpdateProgress()
{ 
   
	m_progressCtrl.SetStep(m_nStep); 	 //设置进度条步长
	m_progressCtrl.StepIt();   			 //按照当前步长更新位置
	int nPos = m_progressCtrl.GetPos();  // 获取进度条的当前位置

	CString str;
	str.Format("%d", nPos);
	GetDlgItem(IDC_STATIC_PERCENT)->SetWindowText(str + _T("%"));//显示进度条进度

	if (100 == nPos)
	{ 
   
		StopUpdate();
	}
}
void CdemoDlg::StopUpdate()
{ 
   
	KillTimer(1);
	if (0 == m_nStopType)
	{ 
   
		MessageBox("加载完毕", "温馨提示", MB_OKCANCEL);
	}
	else if (1 == m_nStopType)
	{ 
   
		int nPos = m_progressCtrl.GetPos();
		CString tips;
		tips.Format("您已取消加载,目前进度:%d%%", nPos);
		MessageBox(tips, "温馨提示", MB_OKCANCEL);
	}
}
void CdemoDlg::OnBnClickedButtonPerLoad()
{ 
   
	UpdateProgress();
}

void CdemoDlg::OnBnClickedButtonAutoLoad()
{ 
   
	SetTimer(1, 10, NULL); //开启自动加载
}

void CdemoDlg::OnBnClickedButtonStopLoad()
{ 
   
	m_nStopType = 1;
	StopUpdate();
}

void CdemoDlg::OnTimer(UINT_PTR nIDEvent)
{ 
   
	if (1 == nIDEvent)
	{ 
   
		UpdateProgress();
	}
	CDialogEx::OnTimer(nIDEvent);
}

2、工作者线程的处理方式。
有时候,我们需要创建多线程来帮助我们提高程序效率,这种情况下又该怎样处理控件呢?
我们需要思考,这个工作者线程,只需要去计算我们的数据,算完一部分,就向我们的主程序发送消息,更新我们的UI就好。
2.1首先,添加新类,就叫做:CMyThread

#pragma once

class CMyThread
{ 
   
public:
	CMyThread();
	~CMyThread();
};

2.2 接着,添加功能函数,并实现:

	static void Calculate(void *p);

Ps: 至于这里为何需要使用static成员函数,就请移驾到参考里面看下吧,嘤嘤嘤~~

void CMyThread::Calculate(void *p)
{ 
   
	HWND hWnd = (HWND)p;
	
	const int MM = 100;			//为了做模拟,假定进行一百次数据计算
	const int NN = 1000000000;	//模拟工程计算量
	const   int nStep = 10;		//增量步长
	for (int i = 0; i < MM;i++)
	{ 
   
		long long sum = 0;
		for (int j = 0; j < NN;j++)
		{ 
   
			sum += j;
		}

		::PostMessage(hWnd, WM_MSG_UPDATE, WPARAM(nStep), LPARAM(0));
		Sleep(100);
	}

	_endthread();
}

2.3 然后,消息映射:

2.3.1 在CMyThread类头文件里面添加消息声明:

#define WM_MSG_UPDATE WM_USER+119

2.3.2 在对话框类的头文件里面添加新的自定义消息:

	afx_msg LRESULT  OnMessageProgress(WPARAM w, LPARAM l);

2.3.3 在对话框类的源文件里面实现消息函数:

LRESULT   CdemoDlg::OnMessageProgress(WPARAM w, LPARAM l)
{ 
   
	m_nStep = w;
	UpdateProgress();
	return TRUE;
}

2.3.4 在对话框类的源文件的消息映射添加条目:

	ON_MESSAGE(WM_MSG_UPDATE, &CdemoDlg::OnMessageProgress)

2.4 然后,主程序调用:

void CdemoDlg::OnBnClickedButtonStart()
{ 
   
	_beginthread(&CMyThread::Calculate, 0, this->GetSafeHwnd());
}

3.总结。
3.1 对话框中启动新线程。把句柄做参数传递。
3.2 线程类中定义静态函数,也可以在对话框类中定义个全局函数。
3.3 线程回调函数必须是静态,且以void*为参数。
3.4 定义自定义消息,线程类发送,对话框类响应。

参考文章:http://greatverve.cnblogs.com/archive/2012/12/21/mfc-thread-CProgressCtrl.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157808.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Python攻防-暴力激活成功教程附近局域网WIFI密码「建议收藏」

    Python攻防-暴力激活成功教程附近局域网WIFI密码「建议收藏」文章目录前言无图形界面WIFI爆破脚本优化图形化界面简单版UIUI升级版总结前言本文将记录学习下如何通过Python脚本实现WIFI密码的暴力激活成功教程,从而实现免费蹭网。无图形界面先来看看没有图形界面版的爆破脚本。WIFI爆破importpywififrompywifiimportconstimporttimeimportdatetime#测试连接,返回链接结果defwifiConnect(pwd):#抓取网卡接口wifi=pywifi

    2022年8月22日
    6
  • Navicat 15.0.23激活码[在线序列号][通俗易懂]

    Navicat 15.0.23激活码[在线序列号],https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    140
  • 利用Python+阿里云实现DDNS(动态域名解析)

    利用Python+阿里云实现DDNS(动态域名解析)引子我想大家应该都很熟悉DNS了,这回在DNS前面加了一个D又变成了什么呢?这个D就是Dynamic(动态),也就是说,按照传统,一个域名所对应的IP地址应该是定死的,而使用了DDNS后,域名所对应的IP是可以动态变化的。那这个有什么用呢?比如,在家里的路由器上连着一个raspberrypi(树莓派),上面跑着几个网站,我应该如和在外网环境下访问网站、登陆树莓派的SSH呢?还有,家里…

    2022年6月8日
    26
  • DVWA登录出现allow_url_fopen = On allow_url_include = On的错误

    DVWA登录出现allow_url_fopen = On allow_url_include = On的错误进入到DVWA页面中:点击下图中按钮Creat/ResetDatabase创建数据库:出现如下错误提示:CouldnotconnecttotheMySQLservice.Pleasechecktheconfigfile.12意思是:无法连接到MySQL服务。请检查你的config文件。问题解决此时我们找到config文件下的config.inc.php文件打开进行操作,将$DVWA[‘db_password’]改为和phpstudy_pro中数据

    2022年7月16日
    14
  • Tomcat闪退问题

    Tomcat闪退问题这两天快被这些搞的头大了,tomcat重配了几次,老出现闪退的问题(直接下的tomcat8.0压缩包免安装),总结下来有三个方面,大家如果也遇到这个问题,可以试试下面三个办法:1.网上帖子基本上说出现这个问题最大的原因是因为环境变量没有配对,大家可以参见下面这个帖子比对一下:http://blog.csdn.net/wsad_hjk/article/details/27374753我这里jdk8….

    2022年5月30日
    33
  • Android加密之全盘加密

    Android加密之全盘加密Android加密之全盘加密前言Android的安全性问题一直备受关注,Google在Android系统的安全方面也是一直没有停止过更新,努力做到更加安全的手机移动操作系统。在Android的安全性方面,有很多模块:内核安全性应用安全性应用签名身份验证TrustyTEESELinux加密等等

    2022年5月13日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号