Strona główna » C++ » Kurs » Kolorowe komunikaty w konsoli
C:\

Kolorowe komunikaty w konsoli

Wstęp

Niemalże każda konsola systemowa ma ten sam układ kolorów: czarne tło i białe napisy. Oczywiście konsola ma być przejrzysta, funkcjonalna i nie zabierać dużo zasobów komputera. W przypadku platformy Windows® kolor tekstu oraz tła konsoli można dostosować. Zmiana kolorów wyświetlanego tekstu może się okazać bardzo pomocna. Przykładowo wszystkie błędy mogą być wyświetlane na kolor czerwony. Tego typu rozwiązanie raczej nadaje się do drobnych projektów kiedy dłużej pisałoby się kod interfejsu niż właściwy kod.

Konsola

Na początek warto przyjrzeć się poleceniom konsoli, a konkretniej poleceniu COLOR. Polecenie to służy do ustawiania koloru tła oraz tekstu na podstawie dwóch znaków zapisanych w systemie szesnastkowym. Pierwszy znak oznacza kolor tła, a drugi kolor tekstu. Poniżej znajduje się tabelka, która przedstawia dostępne kolory:

Kod0123456789ABCDEF
Kolor

Wtedy, aby mieć czarny tekst na białym tle wystarczy odczytać, że biały kolor to F, a czarny to 0. Zapisać obok siebie pamiętając, że pierwszy znak oznacza kolor tła i zaakceptować polecenie:

  1. C:\WINDOWS\system32>COLOR F0
  2. C:\WINDOWS\system32>

W celu przywrócenia początkowego ustawienia kolorów można wpisać COLOR 07, ale zdecydowanie lepszym sposobem jest zresetowanie przy pomocy polecenia COLOR bez podawania argumentów:

  1. C:\WINDOWS\system32>COLOR
  2. C:\WINDOWS\system32>

W przypadku wybrania takiego samego koloru dla tła oraz tekstu nie uzyska się jednolitego koloru na powierzchni całej konsoli, ale zostanie zwrócony błąd.

Konsola i C++

Jednym z prostszych sposobów, który jest podawany dla osób zbytnio niewtajemniczonych w C++ jest właśnie wykorzystanie funkcji COLOR przy pomocy polecenia system(). Załóżmy, że program ma zmienić kolor konsoli na ciemnoniebieski, a kolor tekstu na jasnoniebieski. Wtedy wystarczy zaledwie (2.) jedna linijka kodu:

  1. int main () {
  2.   system("COLOR 9B");
  3.   system("pause");
  4.   return 0;
  5. }

Wtedy po uruchomieniu programu konsola przyjmie następujący wygląd:

  1. Press any key to continue . . .
  2.  

Ograniczenia

Niestety każde najprostsze rozwiązanie ma pewne ograniczenia. W tym przypadku każda zmiana koloru oznacza całkowite nadpisanie poprzednich ustawień. Z tego tą metodą nie można uzyskać tylko pojedynczej linijki pokolorowanej na inny kolor co ilustruje poniższy kod:

  1. int main () {
  2.   system("COLOR 0C");
  3.   cout << "Wystapil blad\n";
  4.   system("COLOR");
  5.   cout << "Konczenie dzialania programu";
  6.   system("pause");
  7.   return 0;
  8. }

(2.) Zmiana tekstu koloru na czerwony (tło pozostaje czarne). (3.) Wypisanie błędu. (4.) Zresetowanie koloru. W tym przypadku reset koloru nie będzie dotyczył tylko tekstu wypisanego dalej, ale również poprzednio wypisanego. (5.) Wypisanie tekstu końcowego. Po uruchomieniu pojawi się taki wygląd konsoli:

  1. Wystapil blad
  2. Konczenie dzialania programu
  3. Press any key to continue . . .

Zmiana bez ograniczeń

Konsola systemowa umożliwia jednak nadawanie innego koloru nawet pojedynczym znakom. Jednak, aby tego dokonać należy dołączyć bibliotekę windows.h. Teraz w celu dopisania kolorowego tekstu potrzebny jest uchwyt na konsolę tak, aby można było wydawać do niej polecenia. Następnie przy pomocy poleceń SetConsoleTextAttribute() można ustawić dowolny wygląd tekstu. Jako argumenty funkcja przyjmuje kolejno: uchwyt konsoli oraz kolor zapisany w systemie dziesiętnym tj. wartość 0C powinna być przekazana jako 12 (a np. kod AA jako 170):

  1. #include <iostream>
  2. using namespace std;
  3. int main () {
  4.   system("COLOR 0C");
  5.   cout << "Wystapil blad\n";
  6.   system("COLOR");
  7.   cout << "Konczenie dzialania programu";
  8.   system("pause");
  9.   return 0;
  10. }

Program nie skompiluje się dopóki (2.) odpowiednia bibliotek nie zostanie dołączona. (7.) Zdobądź uchwyt konsoli. (8.) Ustal kolor dla błędu i (9.) go wypisz. (10.) Zresetuj kolor tekstu i (11.) pokaż kolejny komunikat. Jak widać teraz po uruchomieniu program wypisuje komunikaty zgodnie z wcześniejszymi oczekiwaniami:

  1. Wystapil blad
  2. Konczenie dzialania programu
  3. Press any key to continue . . .

Zadania

Zadanie 1

Napisz program, który na ekran wypisze tego typu tabelkę:

  1.  0123456789ABCDEF
  2. 0
  3. 1
  4. 2
  5. 3
  6. 4
  7. 5
  8. 6
  9. 7
  10. 8
  11. 9
  12. A
  13. B
  14. C
  15. D
  16. E
  17. F

Przedstawiony znak w tabelce to ■. Zgodnie z rozszerzona tablicą ASCII ma on kod 254, który można wpisać w C++ jako '\xFE'.