【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】一些补充
(欢迎留言交流呀)
在进度条左/中/右,添加百分比显示?
上述代码,存在不足与优化?