2012-03-01 67 views
11

我試圖設置一個win32控制檯應用程序的字體顏色分別爲50,75,90等特定的RGB值。我已經嘗試過SetConsoleTextAttribute(),但不幸的是,它似乎被限制爲0或255的R,G或B.RGB特定控制檯文本顏色C++

這是必須的,因爲在命令提示屬性窗口中可以設置特定的顏色,像這樣

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

我已經搜查了不少,但似乎唯一的答案是SetConsoleTextAttribute()

+0

紅色,綠色和藍色的顏色實際上是在0到255範圍內。任何顏色都是3個8位的組合。另請參閱 - http://service.real.com/help/library/guides/realone/ProductionGuide/HTML/htmfiles/colors.htm – 2012-03-01 01:28:42

+4

你甚至讀過我的問題嗎? – 2012-03-01 01:30:26

+0

當然。目前還不清楚你的問題到底是什麼。你有位掩碼,你有一個功能 - 調用它,讓你的控制檯充滿色彩。 – 2012-03-01 01:37:26

回答

15

您需要使用SetConsoleScreenBufferInfoEx來設置它,請參閱CONSOLE_SCREEN_BUFFER_INFOEX結構的ColorTable條目。

控制檯顏色是一個兩級過程:有控制檯屬性,前景和背景各有四個位(紅色,綠色,藍色和強度),這似乎將顏色限制爲基本主色和次色。但是這些值被用作顏色表的索引,以確定實際的顯示值。所以將字符屬性'color'認爲是「邏輯紅色」而不是物理紅色。 (字符屬性'紅'映射到的值實際上是默認的紅色,但不一定是。)所以你總是限制在16種索引顏色;但是你可以通過ColorTable將它們設置爲你想要的16種全RGB顏色。

您在上面對話框中看到的彩色方塊條基本上就是該顏色表,並且按照其字符屬性順序列出了顏色,第一個suqare是「邏輯黑色」,依此類推。

+0

哇,很好的解釋。感謝你!你搖滾。 – 2012-03-01 02:56:13

0

有一種方法可以使文本完全RGB,但如果您製作文本的副本,然後更改RGB值,則需要'SetPixel',這是我爲A製作的內容,它是很難做,但我正在製作一個.h文件,所以每個人都可以使用它,在這裏你去:

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