2013-06-15 16 views
10

Znam trochę, jak robić kolory w konsoli Win32 C++. Ale to nie jest naprawdę skuteczne. Na przykład:C++ Win32 Console Color

SYSTEM("color 01") 

Spowolnienie procesu. Również:

HANDLE h = GetStdHandle (STD_OUTPUT_HANDLE); 
WORD wOldColorAttrs; 
CONSOLE_SCREEN_BUFFER_INFO csbiInfo; 

/* 
    * First save the current color information 
    */ 

GetConsoleScreenBufferInfo(h, &csbiInfo); 
wOldColorAttrs = csbiInfo.wAttributes; 

/* 
    * Set the new color information 
    */ 

SetConsoleTextAttribute (h, FOREGROUND_RED); 

Działa świetnie, ale nie ma zbyt wielu kolorów. Ponadto, FOREGROUND_RED jest ciemno-czerwony.

Więc co chcę zapytać, czy nie istnieje sposób, jak zestaw właściwości CLR Console::ForegroundColor, więc możesz użyć dowolnego koloru z enum ConsoleColor?

+2

Czy próbowałeś ustawienie Flaga 'FOREGROUND_INTENSITY' zmienia kolor na jasny? Na przykład: 'SetConsoleTextAttribute (h, FOREGROUND_RED | FOREGROUND_INTENSITY)' –

+0

To działa, ale wciąż zastanawiam się, czy jest jakiś sposób, aby uzyskać więcej kolorów, może z paletą? –

+0

Konsola obsługuje tylko 16 kolorów, które są tworzone przez połączenie FOREGROUND_RED, FOREGROUND_BLUE, FOREGROUND_GREEN i FOREGROUND_INTENSITY. – riv

Odpowiedz

20

Konsola obsługuje tylko 16 kolorów, które są utworzone przez połączenie czterech wartości następująco (może mam szary/darkgray mylić, ale masz pomysł):

namespace ConsoleForeground 
{ 
    enum { 
    BLACK    = 0, 
    DARKBLUE   = FOREGROUND_BLUE, 
    DARKGREEN   = FOREGROUND_GREEN, 
    DARKCYAN   = FOREGROUND_GREEN | FOREGROUND_BLUE, 
    DARKRED   = FOREGROUND_RED, 
    DARKMAGENTA  = FOREGROUND_RED | FOREGROUND_BLUE, 
    DARKYELLOW  = FOREGROUND_RED | FOREGROUND_GREEN, 
    DARKGRAY   = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, 
    GRAY    = FOREGROUND_INTENSITY, 
    BLUE    = FOREGROUND_INTENSITY | FOREGROUND_BLUE, 
    GREEN    = FOREGROUND_INTENSITY | FOREGROUND_GREEN, 
    CYAN    = FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE, 
    RED    = FOREGROUND_INTENSITY | FOREGROUND_RED, 
    MAGENTA   = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE, 
    YELLOW   = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN, 
    WHITE    = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE, 
    }; 
} 
+0

Dzięki, to bardzo przydatne, dziękuję za wszystkie odpowiedzi. –

+0

Możesz po prostu usunąć wszystkie przypisania i nadal będzie działać, ponieważ kody kolorów są w porządku rosnącym. – fereh

2

Konsola ma ograniczony zestaw kolorów. Implementacja .NET używa ConsoleColor do ustawiania kolorów, które są wyliczeniem 16 kolorów.

Podstawowa konsola Win32 ma 8 kolorów podstawowych, które są podwojone poprzez użycie flagi intensywności (jak wspomniano w komentarzu Shaktal pod twoim pytaniem).