测试环境:Windows平台
编译环境:VS2013
依赖图库:EasyX
①创建一个窗口
②绘画一个矩形
③填充该矩形(填充形式 : 颜色 )
窗口的宽高与进度条的宽高一致。使用函数 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
在进度条到达100% 的时候显示一些文字以提示。由于进度条有颜色,所以首先需要设置文字背景透明,然后再输出文字。使用函数为 setbkmode( )、outtextxy( )。在这里需要确认程序编译使用的字符集为 多字节字符集。
setbkmode(TRANSPARENT);//设置文字背景透明 outtextxy(90, 7, "是时候去做点别的事情了!");//在指定位置输出字符串
窗口最顶层化,那进度条就呈现在桌面最上面,而不会被其它窗口覆盖,可以随时观看到进度条的进度。方法为在函数 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;
在进度条达到 100% 之后,去干点别的事情回来~,希望还能继续使用进度条,而不需要重新打开一次。在本文,将使用按键循环的方式,按键检测(如是否按下回车键),然后使用无条件转移语句 goto 重新开始进度条。同时,为了减少代码量,还能实现提示(如:按回车键继续),可以直接将VS下的该项目名称修改成该提示即可。使用函数 getchar()。
flag: //这个标签号放在main()函数里的第一行 ... //这行代码要去掉,仅表示包含其它语句 if(getchar() == '\n')goto flag; //需添加 stdio.h 头文件
至此,整个项目已完成。在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; }
(欢迎留言交流呀)
在进度条左/中/右,添加百分比显示? 上述代码,存在不足与优化?