前言
有時候我們會遇到在CMD或DOS控制台上出現的加載進度條,雖然不是如網頁和軟件寫的美觀。但確確實實也有着自己的特色。而且,一個好看的加載進度條也能增加用戶使用控制台程序的體驗!所以,拿來研究一下也未嘗不可!
博主,一開始寫了個加載進度條的模擬。但是,效果不是很理想!於是,我默默地掏出了度娘....
What are you 搞啥勒?網上的答案幾乎千篇一律,哎~有時候還能看見兩篇一模一樣的文章作者居然同時標注原創!而且,模擬的效果也不咋滴!
沒辦法,自己動手豐衣足食!還是得我自己來!
第一次嘗試
這是博主第一次寫的進度條,怎么講呢!兩個方塊之間的空隙讓人看了是真的不爽!
之前見那些控制台應用程序的加載進度條也不是這樣的啊!為什么他們寫的挺好看的?
中間這個方塊怎么解決?
莫非不是某個字符輸出的?這時,我不經意間發現了這個....
好像被選中的兩個字符中間是連續的啊!難道那些應用就是通過選中了那塊內容覆蓋弄出的嗎?好像不對!一來,這樣實現似乎比較困難;二來,每次...總之還是比較困難o(////▽////)o....
不過....
第二次嘗試
成了!!!真的可以,如果我們通過改變每個單位位寬的字體顏色和背景顏色一致,那不就實現連續的樣式了嗎?
所以,上代碼!
#include <iostream>
#include <stdio.h>
#include <windows.h>
void gotoxy(int x, int y);
int main()
{
char a[4] = {'|','/','-','\\'}; //存儲相關的字符
int i, j, x=2, y=1; //聲明變量
std::cout << "*******加載進度條模擬*******" << std::endl; //輸出頂框
putchar('\n'); //為接下來的進度條保留空位
std::cout << "******點贊***+***關注******" << std::endl; //輸出底框
gotoxy(x,y); //調用函數控制光標位置
for (i = 0;i <= 100;i++) { //進度條總進度控制
std::cout << " ["; //進度條左邊框
for (j = 0;j < i/10;j++) { //控制加載進度的顯示
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | BACKGROUND_INTENSITY); //設置加載條樣式配置
std::cout << "_";
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY); //恢復原配置
for (j = 0;j < (10-(i/10));j++) { printf("%c", '.'); } //未加載進度顯示
std::cout << "] "; //進度條右邊框
std::cout << a[i%4] << "正在加載中"; //顯示和程序進行中提示和“正在加載”字樣提示
for (j = 0;j < (i%4);j++) { std::cout << "."; } //實現動態顯示
for (j = 0;j < (4-i%4);j++) { printf("%c", ' '); }
Sleep(100); //控制程序運行速度
putchar('\r'); //回車
}
std::cout << "( ゜- ゜)つロBiliBili干杯~\n" << std::endl; //防覆蓋
}
void gotoxy(int x, int y) //自定義 gotoxy 函數
{
COORD c;
c.X = x;c.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
}
總結
- gotoxy(int x,int y);函數的使用可以極大的增強我們在控制台輸入和輸出的靈活性;
- BOOL SetConsoleTextAttribute(HANDLE hConsoleOutput, WORD wAttributes);函數的使用,使得控制台樣式的多樣性得以補充。
說明
本內容首發於BiliBili!為作者本人原創!
如有轉載,請務必注明出處!
原文章地址:https:////www.cnblogs.com/seafever/p/12345200.html