2012-03-01 19 views
11

Próbuję ustawić kolor czcionki aplikacji konsoli win32 na konkretną wartość RGB, np. 50, 75, 90. Próbowałem już SetConsoleTextAttribute(), ale niestety wydaje się być ograniczone do 0 lub 255 dla R, G lub B.Kolor tekstu specyficznej konsoli RGB C++

To musi być możliwe, ponieważ w oknie właściwości wiersza poleceń można ustawić określony kolor, jak tak

http://www.yourgamercard.net/screen/i/4a8c57.png

rozglądałem się trochę, ale wydaje się, że jedynym rozwiązaniem jest SetConsoleTextAttribute().

+0

Kolory czerwony, zielony i niebieski mieszczą się w zakresie od 0 do 255. Dowolny kolor to kombinacja 3 ośmiu bitów. Zobacz także - http://service.real.com/help/library/guides/realone/ProductionGuide/HTML/htmfiles/colors.htm –

+4

Czy przeczytałeś nawet moje pytanie? –

+0

Oczywiście. Nie jest absolutnie jasne, jaki jest dokładnie twój problem. Masz maskę bitową, masz funkcję - zadzwoń i spraw, by twoja konsola była pełna kolorów. –

Odpowiedz

15

Aby to ustawić należy użyć SetConsoleScreenBufferInfoEx, zobacz wpis ColorTable struktury CONSOLE_SCREEN_BUFFER_INFOEX.

Kolory konsoli są procesem dwupoziomowym: istnieje atrybut konsoli, który ma cztery bity dla pierwszego planu i tła (czerwony, zielony, niebieski i intensywność), co wydaje się ograniczać kolory do podstawowych kolorów podstawowych i dodatkowych . Ale te wartości są używane jako wskaźniki do tabeli kolorów, w celu ustalenia rzeczywistej wartości wyświetlanej. Pomyśl o atrybutach "bity" koloru jako "logicznej czerwieni" itd., A nie o fizycznej czerwieni. (Wartość atrybutu "czerwony" dla atrybutu znaku jest domyślnie czerwona RGB, ale nie musi być.) Więc zawsze jesteś ograniczony do 16 indeksowanych kolorów; ale możesz ustawić je na 16 dowolnych kolorach RGB, korzystając z ColorTable.

Pasek kolorowych kwadratów, który widzisz w powyższym oknie dialogowym, jest w istocie tą tabelą kolorów i zawiera listę kolorów w kolejności ich atrybutów znaków, pierwszy suqare to "logiczna czerń" i tak dalej.

+0

Wow, świetne wyjaśnienie. Dzięki za to! Rządzisz. –

0

Istnieje sposób, aby tekst był w całości RGB, ale wymaga "SetPixel", jeśli wykonasz replikę tekstu, możesz zmienić wartości RGB, tutaj jest coś, co zrobiłem dla A, to jest trudne do zrobienia, ale robię plik .h, więc każdy może z niego korzystać, proszę:

void PrintA(int R, int G, int B) 
{ 
    HWND myconsole = GetConsoleWindow(); 
    HDC mydc = GetDC(myconsole); 
    SetPixel(mydc, i + 0, i2 + 3, RGB(R, G, B)); 
    SetPixel(mydc, i + 0, i2 + 4, RGB(R, G, B)); 
    SetPixel(mydc, i + 0, i2 + 5, RGB(R, G, B)); 
    SetPixel(mydc, i + 0, i2 + 6, RGB(R, G, B)); 
    SetPixel(mydc, i + 0, i2 + 7, RGB(R, G, B)); 
    SetPixel(mydc, i + 0, i2 + 8, RGB(R, G, B)); 
    SetPixel(mydc, i + 0, i2 + 9, RGB(R, G, B)); 
    SetPixel(mydc, i + 1, i2 + 2, RGB(R, G, B)); 
    SetPixel(mydc, i + 1, i2 + 3, RGB(R, G, B)); 
    SetPixel(mydc, i + 1, i2 + 4, RGB(R, G, B)); 
    SetPixel(mydc, i + 1, i2 + 5, RGB(R, G, B)); 
    SetPixel(mydc, i + 1, i2 + 6, RGB(R, G, B)); 
    SetPixel(mydc, i + 1, i2 + 7, RGB(R, G, B)); 
    SetPixel(mydc, i + 1, i2 + 8, RGB(R, G, B)); 
    SetPixel(mydc, i + 1, i2 + 9, RGB(R, G, B)); 
    SetPixel(mydc, i + 2, i2 + 1, RGB(R, G, B)); 
    SetPixel(mydc, i + 2, i2 + 2, RGB(R, G, B)); 
    SetPixel(mydc, i + 2, i2 + 6, RGB(R, G, B)); 
    SetPixel(mydc, i + 3, i2 + 1, RGB(R, G, B)); 
    SetPixel(mydc, i + 3, i2 + 2, RGB(R, G, B)); 
    SetPixel(mydc, i + 3, i2 + 6, RGB(R, G, B)); 
    SetPixel(mydc, i + 4, i2 + 2, RGB(R, G, B)); 
    SetPixel(mydc, i + 4, i2 + 3, RGB(R, G, B)); 
    SetPixel(mydc, i + 4, i2 + 4, RGB(R, G, B)); 
    SetPixel(mydc, i + 4, i2 + 5, RGB(R, G, B)); 
    SetPixel(mydc, i + 4, i2 + 6, RGB(R, G, B)); 
    SetPixel(mydc, i + 4, i2 + 7, RGB(R, G, B)); 
    SetPixel(mydc, i + 4, i2 + 8, RGB(R, G, B)); 
    SetPixel(mydc, i + 4, i2 + 9, RGB(R, G, B)); 
    SetPixel(mydc, i + 5, i2 + 3, RGB(R, G, B)); 
    SetPixel(mydc, i + 5, i2 + 4, RGB(R, G, B)); 
    SetPixel(mydc, i + 5, i2 + 5, RGB(R, G, B)); 
    SetPixel(mydc, i + 5, i2 + 6, RGB(R, G, B)); 
    SetPixel(mydc, i + 5, i2 + 7, RGB(R, G, B)); 
    SetPixel(mydc, i + 5, i2 + 8, RGB(R, G, B)); 
    SetPixel(mydc, i + 5, i2 + 9, RGB(R, G, B)); 
    i += 8; 

    if (i/80 == 8) 
    { 
     i = 0; 
     i2 += 12; 
    } 
}