IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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
Napríklad pre tmavo zelený text na modrom pozadí stačí napísať:
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 SetConsoleCur­sorPosition. Tej odovzdáme ako prvý parameter GetStdHandle (STD_OUTPUT_HAN­DLE) (rovnako ako u SetConsoleTex­tAttribute) 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 SetConsoleCur­sorInfo. Tá má rovnako ako SetConsoleCur­sorPosition a SetConsoleTex­tAttribute dva parametre:

GetStdHandle (STD_OUTPUT_HANDLE) a inštanciu štruktúry CONSOLE_CURSOR_IN­FO.

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:

  1. Nie je dobré používať funkciu system (). Po prvé je pomalá a za druhé jej používanie nie je práve prehľadné.
  2. Namiesto neustáleho písania GetStdHandle (STD_OUTPUT_HAN­DLE) si môžeme vytvoriť premennú s rovnakými dátami: HANDLE cHandle = GetStdHandle (STD_OUTPUT_HAN­DLE); SetConsoleTex­tAttribute (cHandle, grey);

 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 322x (19.43 MB)
Aplikácia je vrátane zdrojových kódov v jazyku C++

 

Všetky články v sekcii
Zdrojákoviště C ++ - Základná konštrukcia
Článok pre vás napísal Zdeněk Pavlátka
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje spoustě zajímavých věcí ze světa informatiky a grafiky
Aktivity