Witam, w tym artykule pokażę jak zmienić kolor tekstu w konsoli Windows. No to Let's go! Na początek naszej zabawy dodajemy niezbędne pliki nagłówkowe:
#include <windows.h>
#include <iostream>
#include <cstdlib>
Poza nagłówkami z biblioteki standardowej potrzebny jest także nagłówek
windows.h, bo w nim znajdują się funkcje odpowiedzialne za kolorki. Następnie dodajemy:
using namespace std;
int main() {
Nie ma tu nic nowego - standardowy początek programu. Teraz dodajemy specjalny uchwyt:
Fachowo mówiąc będzie tu siedział uchwyt na wyjście konsoli. Taki uchwyt jest podawany jako parametr do windowsowych funkcji odpowiedzialne za kolory. Teraz można się wziąć za kolorki.
Kolory
hOut = GetStdHandle( STD_OUTPUT_HANDLE );
cout << "Standart" << endl << endl;
Po wpisaniu tego w naszym kodzie, pojawi się napis
"Standart"i będzie miał kolor standardowy. Użyliśmy funkcji
GetStdHandle, która zwraca nam jeden ze standardowych uchwytów. Jako argument przyjmuje ona stałą oznaczającą uchwyt, który chcemy uzyskać. Nam potrzebny jest uchwyt do wyjścia konsoli, więc używamy stałej
STD_OUTPUT_HANDLE. Uchwyt ten zapamiętujemy w uprzednio przygotowanej zmiennej
hOut. Teraz zmieńmy jakiś kolor:
SetConsoleTextAttribute( hOut, BACKGROUND_RED );
cout << "Ten napis jest z czerwonym tlem i zwykłym tekstem" << flush << endl << endl;
Użyliśmy funkcji
SetConsoleTextAttribute, która służy do ustawiania atrybutów textu w konsoli. Te atrybuty to kolor tła i kolor textu. Jako pierwszy argument funkcja przyjmuje uchwyt do wyjścia konsoli, kolejny argument to kombinacja flag oznaczających kolory. My użyliśmy stałej
BACKGROUND_RED, która sprawia, że tło jest czerwone. Do dyspozycji mamy jeszcze
BACKGROUND_GREEN - zielone tło i
BACKGROUND_BLUE - niebieskie tło. Możemy też zmienić kolor textu. Oto przykład:
SetConsoleTextAttribute( hOut, FOREGROUND_RED );
cout << "Ten napis jest czerwony bez tla" << endl;
Nazwy flag odpowiedzialnych za kolor textu są podobne do tych od tła, z tym że zamiast
BACKGROUND jest
FOREGROUND. A więc mamy do dyspozycji następujące flagi:
FOREGROUND_RED,
FOREGROUND_GREEN,
FOREGROUND_BLUE. Możemy też sprawić, że kolory będą intensywne (czyli po prostu jaśniejsze ;-)):
SetConsoleTextAttribute( hOut, FOREGROUND_RED | FOREGROUND_INTENSITY );
cout << "Ten napis jest zielony i [i]INTENSITY[/i]" << endl;
Za intensywność odpowiada flaga
FOREGROUND_INTENSITY. Dzięki niej kolor textu jest intensywny. Istnieje też
BACKGROUND_INTENSITY, dla koloru tła. Póki co umiemy wstawić tylko trzy podstawowe kolory. A co jeśli chcemy inny kolor? Łączymy inne kolory w jeden np. tak:
SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), FOREGROUND_BLUE | FOREGROUND_RED );
cout << "Ten napis jest fioletowy'" << endl;
Dzięki połączeniu flag
FOREGROUND_BLUE i
FOREGROUND_RED otrzymaliśmy kolor fioletowy. Ten kolor także może być intensywny. Oto przykład:
SetConsoleTextAttribute( hOut, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY );
cout << "Ten napis jest fioletowy i intesywny" << endl;
Jeśli chcesz użyć innych kolorów to poeksperymentuj z różnymi kombinacjami trzech podstawowych (
GREEN,
BLUE,
RED).
Na zakończenie dodam plik z innymi kolorami:
#include <windows.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
int main() {
HANDLE hOut;
hOut = GetStdHandle( STD_OUTPUT_HANDLE );
cout << "Standart" << endl << endl;
cout << "by DrraVen" << endl;
cout << "Zycze milych prac z c++" << endl;
SetConsoleTextAttribute( hOut, BACKGROUND_RED );
cout << "Ten napis jest z cerwonycm tlem i zwykłym tekstem" << flush << endl << endl;
SetConsoleTextAttribute( hOut, BACKGROUND_GREEN );
cout << "Ten napis ma zielone tlo" << flush << endl;
SetConsoleTextAttribute( hOut, FOREGROUND_RED );
cout << "Ten napis jest czerwony bez tla" << endl;
SetConsoleTextAttribute( hOut, FOREGROUND_GREEN );
cout << "Ten napis jest zielony" << endl << endl;
SetConsoleTextAttribute( hOut, FOREGROUND_BLUE );
cout << "Ten napis jest niebieski" << endl << endl;
SetConsoleTextAttribute( hOut, FOREGROUND_RED | FOREGROUND_INTENSITY );
cout << "Ten napis jest zielony i [i]INTENSITY[/i]" << endl;
SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY );
cout << "Ten napis jest zielony i [i]INTENSITY[/i]" << endl;
SetConsoleTextAttribute( hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY );
cout << "Ten napis jest niebieski i [i]INTENSITY[/i]" << endl;
SetConsoleTextAttribute( hOut, FOREGROUND_BLUE | FOREGROUND_RED );
cout << "Ten napis jest fioletowy'" << endl;
SetConsoleTextAttribute( hOut, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY );
cout << "Ten napis jest fioletowy i intesywny" << endl;
SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_RED );
cout << "Ten napis jest [i]ala[/i] zloty " << endl;
SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY );
cout << "Ten napis jest bardzije podobny do zlotego bo ma intesywnosc" << endl;
SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY );
cout << "Ten napis jest seledynowy, bo jest intesywny" << endl;
SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_BLUE );
cout << "Ten napis jest matowy bo nie ma intesywnosci" << endl;
SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED );
cout << "Mozna powiedzieć ze ten napis jest standartowy" << endl;
SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY );
cout << "Ten napis jest srebny bo ma intesywnosc" << endl;
cout << "" << endl;
cout << "" << endl;
cout << "" << endl;
SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED );
system( "PAUSE" );
return 0;
}
Proszę, a plik z serwisu znajdziesz w dziale
[darkcult.nazwa.pl] DownloadŻyczę miłych prać z kolorkami w waszych pierwszych dziełach.
Konsola w programach okienkowych
Od kiedy zacząłeś tworzyć programy okienkowe (a zacząłeś, prawda?) po konsoli nie ma już ani śladu. Gdy jednak czasem zatęsknisz za starą, dobrą konsolą, to mam dla ciebie dobrą wiadomość: w swoim programie okienkowym też możesz mieć konsole!
Aby uaktywnić konsolę używamy funkcji
AllocConsole, a usuwamy ją przy użyciu
FreeConsole. Funkcje te nie przyjmują żadnych argumentów. Ważne jest, że każdy proces może mieć tylko jedną konsolę (czyli w praktyce jeden program może mieć jedną konsolę). Możemy ustawić tytuł okienka konsoli za pomocą funkcji
SetConsoleTitle. Jako argument przyjmuje ona text, który ma być ustawiony.
Gdy używamy konsoli w programie okienkowym musimy zapomnieć o standardowych metodach wyjścia takich jak strumienie, biblioteka
stdio itp. Najpierw musimy utworzyć zmienne przechowujące uchwyty konsoli:
HANDLE hOut = GetStdHandle( STD_OUTPUT_HANDLE );
HANDLE hIn = GetStdHandle( STD_INPUT_HANDLE );
Mamy tam uchwyt do wyjścia i wejścia konsoli. Pierwszego już używaliśmy przy zmianie kolorów. Drugi będzie nam potrzebny, byśmy mogli wczytywać text od użytkownika z konsoli. Na powyższych uchwytach możemy operować funkcjami
WriteConsole i
ReadConsole. Pierwsza przyjmuje jako argument kolejno: uchwyt wyjścia konsoli, wskaźnik na tablice znaków do zapisania, liczbę znaków do zapisania i wskaźnik na zmienną w której znajdziemy liczbę zapisanych znaków. Ostatni parametr może być
NULL.
ReadConsole przyjmuje praktycznie te same parametry, tylko musisz użyć uchwyty wejścia konsoli (
hIn), a zamiast łańcucha znaków (i jego długości) podajesz bufor (i jego wielkość). Oto przykład:
AllocConsole();
HANDLE hOut = GetStdHandle( STD_OUTPUT_HANDLE );
HANDLE hIn = GetStdHandle( STD_INPUT_HANDLE );
char szText[] = "Wpisz coś: ";
char szBufor[ 100 ];
DWORD dwZap;
WriteConsole( hOut, szText, strlen( szText ) + 1, & dwZap, NULL );
ReadConsole( hIn, szBufor, 100, & dwZap, NULL );
FreeConsole();