#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
/// <summary>
/// 在控制台上显示一个进度条
/// </summary>
/// <param name="hConsole">控制台</param>
/// <param name="percent">需要显示的进度条百分比 0 -100</param>
/// <param name="back">光标是否回到起始位置,方便下一次刷新进度条,或者指向下一行</param>
/// <param name="show">是否显示光标</param>
/// <param name="clear">是否清空进度条</param>
void print_percent(HANDLE ostd, int percent, BOOL back, BOOL show, BOOL clear = FALSE)
{
COORD cur_coord = { 0, 0 }; // 记录起始光标位置
DWORD written;
CONSOLE_SCREEN_BUFFER_INFO csbi;
DWORD number;
if (ostd == NULL)
{
ostd = GetStdHandle(STD_OUTPUT_HANDLE);
}
if (percent > 100)
percent = 100;
else if (percent < 0)
percent = 0;
if (clear)
percent = 100; // 百分比影响绘制长度,clear时按100的长度来清空
if (!GetConsoleScreenBufferInfo(ostd, &csbi))
{
return;
}
WORD attr = 0;// 指定属性,0为默认属性
if (!clear)
attr = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_BLUE;
number = csbi.dwSize.X * percent / 200; // 获得百分比对应的dwConsize,进度占整个屏幕宽度的一半
cur_coord = csbi.dwCursorPosition; // 进度条起始位置
TCHAR str[10];
swprintf_s(str, 10, TEXT("%d%%"), percent);
// 填充屏幕
if (!FillConsoleOutputCharacter(ostd,
(TCHAR)' ', // 填充内容
number, // 绘制数量
cur_coord, // 绘制起始坐标
&written))
{
return;
}
WriteConsole(ostd, str, lstrlen(str), &written, NULL);
// 设置显示样式.
if (!FillConsoleOutputAttribute(ostd,
attr,
number,
cur_coord,
&written))
{
return;
}
if (back) // 光标回到进度条开头
{
SetConsoleCursorPosition(ostd, cur_coord);
}
else // 光标指向下一行
{
SetConsoleCursorPosition(ostd, cur_coord);
printf("\n");
}
// 隐藏或显示光标
CONSOLE_CURSOR_INFO cursorInfo;
GetConsoleCursorInfo(ostd, &cursorInfo);
cursorInfo.bVisible = show;
SetConsoleCursorInfo(ostd, &cursorInfo);
}
void progress_demo(void)
{
int count = 0;
while (1)// 发送
{
int progress = count % 100;
if (0 == progress)
{
print_percent(NULL, 0, TRUE, FALSE, TRUE); // 清空进度条
}
print_percent(NULL, count % 100, TRUE, FALSE); // 绘制进度条
Sleep(100);
count++;
}
return;
}
int main()
{
progress_demo();
getchar();
return 1;
}