2012-03-01 63 views
11

Estoy tratando de establecer el color de fuente de una aplicación de consola win32 a un valor RGB específico como 50, 75, 90 respectivamente. Ya he intentado SetConsoleTextAttribute(), pero desafortunadamente parece estar limitado a 0 o 255 para R, G o B.Consola específica RGB Color de texto C++

Esto tiene que ser posible, porque en la ventana de propiedades del símbolo del sistema puede establecer el color específico, al igual que

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

he buscado un poco, pero parece que la única respuesta es SetConsoleTextAttribute().

+0

Los colores rojo, verde y azul están realmente dentro de un rango de 0 a 255. Cualquier color es una combinación de 3 ocho bits. Ver también - http://service.real.com/help/library/guides/realone/ProductionGuide/HTML/htmfiles/colors.htm –

+4

¿Has leído mi pregunta? –

+0

Por supuesto. No está del todo claro cuál es exactamente su problema. Tienes máscara de bits, tienes una función: llámala y haz que tu consola esté llena de colores. –

Respuesta

15

Debe usar SetConsoleScreenBufferInfoEx para configurar esto, consulte la entrada ColorTable de la estructura CONSOLE_SCREEN_BUFFER_INFOEX. Los colores de la consola son un proceso de dos niveles: está el atributo de la consola, que tiene cuatro bits para primer plano y fondo (rojo, verde, azul e intensidad), que parece limitar los colores a los colores primarios y secundarios básicos. . Pero estos valores se utilizan como índices en la tabla de colores para determinar el valor de visualización real. Así que piense en los bits de atributo de color del carácter como "rojo lógico", etc., en lugar del rojo físico. (El valor al que se asigna el atributo de carácter 'rojo' es en realidad rojo RGB por defecto, pero no tiene que serlo). Por lo tanto, siempre estará limitado a 16 colores indexados; pero puede configurar esos 16 colores RGB completos que desee a través de ColorTable.

La tira de cuadrados de colores que ve en el cuadro de diálogo anterior es esencialmente esa tabla de colores, y enumera los colores en su orden de atributo de carácter, el primer suqare es 'negro lógico', y así sucesivamente.

+0

Guau, gran explicación. ¡Gracias por esto! Tu rock –

0

Hay una manera de hacerlo para que el texto sea completamente RGB, pero requiere 'SetPixel' si hace una réplica del texto, puede cambiar los valores RGB, aquí es algo que hice para A, es difícil de hacer, pero estoy haciendo un archivo .h para que todos puedan usarlo, aquí va:

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; 
    } 
} 
Cuestiones relacionadas