Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: 'Drraven'
Biblioteki C++

Kolory w konsoli

[lekcja] Artykuł opisuje w jaki sposób ustawiać kolor wyświetlanego tekstu oraz tła pod tekstem w aplikacji konsolowej.
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:
C/C++
#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:
C/C++
using namespace std;

int main() {
Nie ma tu nic nowego - standardowy początek programu. Teraz dodajemy specjalny uchwyt:
C/C++
HANDLE hOut;
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

C/C++
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:
C/C++
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:
C/C++
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 ;-)):
C/C++
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:
C/C++
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:
C/C++
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:
C/C++
#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;
    //Standardowy ^
    SetConsoleTextAttribute( hOut, BACKGROUND_RED );
    cout << "Ten napis jest z cerwonycm tlem i zwykłym tekstem" << flush << endl << endl;
    //Tło ^
    SetConsoleTextAttribute( hOut, BACKGROUND_GREEN );
    cout << "Ten napis ma zielone tlo" << flush << endl;
    //Tło2 ^
    SetConsoleTextAttribute( hOut, FOREGROUND_RED );
    cout << "Ten napis jest czerwony bez tla" << endl;
    //Napis ^
    SetConsoleTextAttribute( hOut, FOREGROUND_GREEN );
    cout << "Ten napis jest zielony" << endl << endl;
    //Napis2 ^
    SetConsoleTextAttribute( hOut, FOREGROUND_BLUE );
    cout << "Ten napis jest niebieski" << endl << endl;
    //Napis3 ^
    SetConsoleTextAttribute( hOut, FOREGROUND_RED | FOREGROUND_INTENSITY );
    cout << "Ten napis jest zielony i [i]INTENSITY[/i]" << endl;
    //Intesywny ^
    SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY );
    cout << "Ten napis jest zielony i [i]INTENSITY[/i]" << endl;
    //Intesywny2 ^
    SetConsoleTextAttribute( hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY );
    cout << "Ten napis jest niebieski i [i]INTENSITY[/i]" << endl;
    //inne kolory ^
    SetConsoleTextAttribute( hOut, FOREGROUND_BLUE | FOREGROUND_RED );
    cout << "Ten napis jest fioletowy'" << endl;
    //inne kolory ^
    SetConsoleTextAttribute( hOut, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY );
    cout << "Ten napis jest fioletowy i intesywny" << endl;
    //inne kolory + intesywność ^
    SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_RED );
    cout << "Ten napis jest [i]ala[/i] zloty " << endl;
    //inne kolory2 ^
    SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY );
    cout << "Ten napis jest bardzije podobny do zlotego bo ma intesywnosc" << endl;
    //inne kolory 2 + intesywność ^
    SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY );
    cout << "Ten napis jest seledynowy, bo jest intesywny" << endl;
    //inne kolory3 + intesywność ^
    SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_BLUE );
    cout << "Ten napis jest matowy bo nie ma intesywnosci" << endl;
    //inne kolory3 ^
    SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED );
    cout << "Mozna powiedzieć ze ten napis jest standartowy" << endl;
    //inne kolory4 ^
    SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY );
    cout << "Ten napis jest srebny bo ma intesywnosc" << endl;
    //inne kolory4 + intesywność ^
    // endl;
    cout << "" << endl;
    cout << "" << endl;
    cout << "" << endl;
    // 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:
C/C++
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:
C/C++
AllocConsole();

HANDLE hOut = GetStdHandle( STD_OUTPUT_HANDLE );
HANDLE hIn = GetStdHandle( STD_INPUT_HANDLE );

char szText[] = "Wpisz coś: ";
char szBufor[ 100 ];

DWORD dwZap;

// Piszemy coś (jakby cout)
WriteConsole( hOut, szText, strlen( szText ) + 1, & dwZap, NULL );

// Pobieramy coś (jakby cin)
ReadConsole( hIn, szBufor, 100, & dwZap, NULL );

FreeConsole();
Poprzedni dokument Następny dokument
Jedna instancja Obsługa podwójnego kliknięcia