【VS项目详解】C/C++ 三步 制作超简单进度条

【1/7】项目效果

在这里插入图片描述

【2/7】项目环境

测试环境:Windows平台
编译环境:VS2013
依赖图库:EasyX

【3/7】步骤摘要

①创建一个窗口
②绘画一个矩形
③填充该矩形(填充形式 : 颜色 )

【4/7】步骤详解

①创建一个窗口

窗口的宽高与进度条的宽高一致。使用函数 initgraph( ) 。

#include<graphics.h>//图形库 

#define WIDTH 300 //进度条宽
#define	HEIGHT	30 //进度条高

int main(){

	initgraph(WIDTH, HEIGHT);//需要用到 graphics.h 头文件
	
	return 0;
}

②绘画一个矩形

矩形的宽高与进度条的宽高一致。使用函数 solidrectangle( )。

solidrectangle(0, 0, WIDTH, HEIGHT);

③填充该矩形

填充形式选择,以某种颜色,从步骤②所绘的矩形的一窄边,开始向该矩形的另一端填充。在图形库上可表述为,设置一种填充颜色,然后以该颜色绘画一个动态矩形,该动态矩形的高与步骤②所绘的矩形的高一致,该动态矩形的宽从 0 开始动态增加到与步骤②所绘的矩形的宽一致。使用函数为 setfillcolor( )、solidrectangle( )。

setfillcolor(GREEN);//设置填充颜色为 青色 
	int i = 0;//定义动态矩形的宽
	while (i < WIDTH+1)
	{
		solidrectangle(0, 0, i, HEIGHT);//绘画动态矩形
		i++;//动态矩形的宽递增
	}

完成啦!
将上面的代码组合起来就可以实现一个超简单的进度条效果。不过此时的进度条从 0 到 100% 只需一瞬间。而要让进度条变慢,则需要使用延时函数。使用函数为 Sleep( )。延时多少时间根据个人喜好,就如延时1秒。由于其它程序语句运行速度极快,延时时间乘上循环次数(进度条完整宽度)就约等于进度条从 0 到 100% 所需的时间(5 min ),经测试误差可忽略。

Sleep(1000);	//1000ms=1s    进度条从0到100%约 1*300/60=5min

【5/7】 其它修饰

1)显示文字

在进度条到达100% 的时候显示一些文字以提示。由于进度条有颜色,所以首先需要设置文字背景透明,然后再输出文字。使用函数为 setbkmode( )、outtextxy( )。在这里需要确认程序编译使用的字符集为 多字节字符集。

在这里插入图片描述

setbkmode(TRANSPARENT);//设置文字背景透明
	outtextxy(90, 7, "是时候去做点别的事情了!");//在指定位置输出字符串

2)窗口最顶层

窗口最顶层化,那进度条就呈现在桌面最上面,而不会被其它窗口覆盖,可以随时观看到进度条的进度。方法为在函数 SetWindowPos( )中传入参数 HWND_TOPMOST,其它参数有窗口句柄、窗口的宽高。使用函数为SetWindowPos( )、GetWindowRect( )。

HWND hwnd = initgraph(WIDTH, HEIGHT);//指定窗口句柄 进度条所在的窗口  
	                                     //WIDTH与HEIGHT的范围不包括窗口标题栏
	RECT rect;                 //矩形框对象 包含标题栏在内的整个窗口
	GetWindowRect(hwnd, &rect);//获取指定窗口包含标题栏在内的矩形框参数
	SetWindowPos(hwnd, HWND_TOPMOST, 700, 647, rect.right - rect.left, rect.bottom - rect.top, 0);
	     //HWND_TOPMOST 表示将窗口(即使未被激活)保持顶级位置。
	     // 700, 647    表示将该窗口左上角放到屏幕的(700,647)
	     //rect.right - rect.left 为窗口宽(包含标题栏); rect.bottom - rect.top 为窗口高(包含标题栏)

另外,附上 windef.h 上关于 RECT 的定义。(这不需要在自己的代码里重定义。)

typedef struct tagRECT
{
    LONG    left;		//矩形框左边界
    LONG    top;		//矩形框顶部边界
    LONG    right;		//矩形框右边界
    LONG    bottom;		//矩形框底部边界
} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;

3)按键循环

在进度条达到 100% 之后,去干点别的事情回来~,希望还能继续使用进度条,而不需要重新打开一次。在本文,将使用按键循环的方式,按键检测(如是否按下回车键),然后使用无条件转移语句 goto 重新开始进度条。同时,为了减少代码量,还能实现提示(如:按回车键继续),可以直接将VS下的该项目名称修改成该提示即可。使用函数 getchar()。

flag:		//这个标签号放在main()函数里的第一行
	...			//这行代码要去掉,仅表示包含其它语句
	if(getchar() == '\n')goto flag;	//需添加 stdio.h 头文件

【6/7】 完整代码

至此,整个项目已完成。在VS的Release模式下编译运行,就可以生成一个可执行文件,以后就可以直接点击该文件运行进度条啦!附上完整代码,如下图所示:

#include<graphics.h>				     //图形库 
#include<stdio.h>					  	 //标准输入输出

#define WIDTH 300						 //进度条宽
#define	HEIGHT	30						 //进度条高

int main(){
flag:
	HWND hwnd = initgraph(WIDTH, HEIGHT);//指定窗口句柄 进度条所在的窗口  
	RECT rect;                			 //矩形框对象 包含标题栏在内的整个窗口
	GetWindowRect(hwnd, &rect);
	SetWindowPos(hwnd, HWND_TOPMOST, 700, 647, rect.right - rect.left, rect.bottom - rect.top, 0);
	    								 //HWND_TOPMOST 表示将窗口(即使未被激活)保持顶级位置。
	     
	solidrectangle(0, 0, WIDTH, HEIGHT); //画矩形
	
	setfillcolor(GREEN);				 //设置填充颜色为 青色 
	int i = 0;					         //定义动态矩形的宽
	while (i < WIDTH+1)
	{
		solidrectangle(0, 0, i, HEIGHT); //绘画动态矩形
		Sleep(1000);					 //1000ms=1s    进度条从0到100%约 1*300/60=5min
		i++;							 //动态矩形的宽递增
	}
	
	setbkmode(TRANSPARENT);				 //设置文字背景透明 输出字符串
	outtextxy(70, 7, "是时候去做点别的事情了!");
	
	if(getchar() == '\n')goto flag;		 //按回车键,重新来一遍
	return 0;
}

【7/7】一些补充

(欢迎留言交流呀)

在进度条左/中/右,添加百分比显示? 上述代码,存在不足与优化?