Pokročilá práca s konzolou v C ++
V nasledujúcom tutoriále si ukážeme, ako zmeniť farbu textu v konzole. Ďalej nastavíme konzolu titulok a naučíme za meniť pozíciu kurzora alebo ho úplne vypnúť.
Zmena farby textu v konzole
Začneme tým, že si vytvoríme nový projekt (alebo otvoríme starý) a do súboru s kódom vložíme asi tohle:
#include <iostream> //standartní výstup #include <windows.h> //tady jsou definované funkce, které budeme používat using namespace std; int main(void) { cin.get(); //opatření, aby se program hned neukončil a čekal na stisk kávesy Enter return 0; }
Asi najjednoduchší spôsob ako zmeniť farbu textu je použiť funkciu system (). Tej ako parameter odovzdáme reťazec "color xy", kde za xa y dosadíme šestnástkovej hodnoty 0-F. X mení farbu pozadia ay farbu textu.
číslo | farba |
---|---|
0 | ponechať pôvodnú farbu |
1 | tmavo modrá |
2 | tmavo zelená |
3 | tmavo tyrkysová |
4 | tmavo červená |
5 | tmavo ružová (fialová) |
6 | tmavo žltá |
7 | šedá |
8 | tmavo šedá |
9 | modrá |
A | zelená |
B | tyrkysová |
C | červená |
D | ružová (fialová) |
E | žltá |
F | biela |
system("color 92");
Hlavná nevýhoda tejto funkcie je, že zmení farbu celého textu. Ak chceme meniť len jeho časť, musíme na to ísť zložitejšie. Asi najlepšie je použiť:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), /*barva*/)
K tomu si pripravíme zoznam farieb (všimnite si rovnakého poradia farieb ako pri funkcii system ()):
#define black 0 #define dark_blue 1 #define dark_green 2 #define dark_cyan 3 #define dark_red 4 #define dark_magenta 5 #define dark_yellow 6 #define grey 7 #define dark_grey 8 #define blue 9 #define green 10 #define cyan 11 #define red 12 #define magenta 13 #define yellow 14 #define white 15
alebo
enum Colors{black, dark_blue, dark_green, dark_cyan, dark_red, dark_magenta, dark_yellow, grey, dark_grey,
blue, green, cyan, red, magenta, yellow, white};
Potom si vytvoríme funkciu pre zmenu farby:
void set_text_color(int background_color, int foreground_color) { //barvu získáme jako hodnotu barvy textu přičtenou k šestnáctinásobku hodnoty barvy pozadí SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), background_color*16+foreground_color); }
Každý výstup na konzolu po zavolaní tejto funkcie bude mať zvolenú farbu. K tomu si môžeme vytvoriť funkciu pre výstup farebného textu:
void colored_cout(int background_color, int foreground_color, const char* text) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), background_color*16+foreground_color);//nová barva cout << text; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), grey);//nastavení původní (základní) barvy }
Túto funkciu si môžeme preťažiť aj pre ďalšie dátové typy:
void colored_cout(int background_color, int foreground_color, bool value) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), background_color*16+foreground_color);//nová barva cout << value; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), grey);//původní barva } void colored_cout(int background_color, int foreground_color, short number) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), background_color*16+foreground_color);//nová barva cout << number; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), grey);//původní barva } void colored_cout(int background_color, int foreground_color, int number) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), background_color*16+foreground_color);//nová barva cout << number; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), grey);//původní barva } void colored_cout(int background_color, int foreground_color, float number) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), background_color*16+foreground_color);//nová barva cout << number; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), grey);//původní barva } void colored_cout(int background_color, int foreground_color, double number) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), background_color*16+foreground_color);//nová barva cout << number; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), grey);//původní barva }
Funkčnosť môžeme vyskúšať napríklad jednoduchým cyklom, ktorý zobrazí všetky možné kombinácie farieb.
for(int i = 0; i<16; i++) for(int j = 0; j<16; j++) { colored_cout(i, j, i*16+j); colored_cout(i, j, " Hello world\n"); }
Zmena titulku konzoly
Zmeny titulku môžeme docieliť napríklad takto:
system("Title Text coloring");
Tento spôsob by sa ale nemal používať (rovnako ako system ( "color 0F")). Preto použijeme funkciu SetConsoleTitle. Tej ako parameter odovzdáme nový titulok konzola v tvare TEXT ( "nový titulok") (to kvôli správnemu dátovému typu).
SetConsoleTitle(TEXT("Text coloring"));
Pozícia kurzora
Pozíciu v konzole môžeme meniť pomocou funkcie SetConsoleCursorPosition. Tej odovzdáme ako prvý parameter GetStdHandle (STD_OUTPUT_HANDLE) (rovnako ako u SetConsoleTextAttribute) a ako druhý parameter inštanciu štruktúry COORD. Do nej môžeme pozíciu uložiť dvoma spôsobmi:
COORD pozice = { x, y };
//nebo
COORD pozice;
pozice.X = x;
pozice.Y = y;
Takže funkcie pre presunutie kurzora by mohla vyzerať takto:
void move_cursor( int x, int y ) { COORD pozice = { x, y }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pozice); }
Skrytie kurzora
Na záver si ešte ukážeme, ako skryť (alebo zobraziť) kurzor pomocou SetConsoleCursorInfo. Tá má rovnako ako SetConsoleCursorPosition a SetConsoleTextAttribute dva parametre:
GetStdHandle (STD_OUTPUT_HANDLE) a inštanciu štruktúry CONSOLE_CURSOR_INFO.
void cursor_visible(bool visible) { CONSOLE_CURSOR_INFO info = {100, visible}; /*nebo CONSOLE_CURSOR_INFO info; info.dwSize = 100; info.bVisible = visible;*/ SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info); }
A ešte pár rád na záver:
- Nie je dobré používať funkciu system (). Po prvé je pomalá a za druhé jej používanie nie je práve prehľadné.
- Namiesto neustáleho písania GetStdHandle (STD_OUTPUT_HANDLE) si môžeme vytvoriť premennú s rovnakými dátami: HANDLE cHandle = GetStdHandle (STD_OUTPUT_HANDLE); SetConsoleTextAttribute (cHandle, grey);
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 323x (19.43 MB)
Aplikácia je vrátane zdrojových kódov v jazyku C++