RGB Контекст Цвет текста С++

Я пытаюсь установить цвет шрифта консольного приложения win32 на определенное значение RGB, например 50, 75, 90. Я уже пробовал SetConsoleTextAttribute(), но, к сожалению, он ограничен 0 или 255 для R, G или B.

Это должно быть возможно, потому что в окне свойств командной строки вы можете установить конкретный цвет, например

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

Я искал совсем немного, но кажется, что единственный ответ - SetConsoleTextAttribute().

Ответ 1

Вам нужно использовать SetConsoleScreenBufferInfoEx, чтобы установите это, см. запись ColorTable в CONSOLE_SCREEN_BUFFER_INFOEX struct.

Консольные цвета - это двухуровневый процесс: есть атрибут консоли, который имеет четыре бита для фона и фона (красный, зеленый, синий и интенсивный), который, как представляется, ограничивает цвета основными основными и вторичными цветами. Но эти значения используются в качестве индексов для таблицы цветов, чтобы определить фактическое отображаемое значение. Поэтому подумайте о битах символа "цвет" как "логический красный" и т.д., А не о физическом красном. (Значение, которое соответствует атрибуту "красный" атрибута персонажа, на самом деле является RGB красным по умолчанию, но необязательно.) Таким образом, вы всегда ограничены 16 индексированными цветами; но вы можете установить их на любые 16 цветов с полным RGB, которые вы хотите с помощью ColorTable.

Полоса цветных квадратов, которые вы видите в диалоговом окне выше, по существу, является той таблицей цветов и отображает цвета в их порядке атрибутов символов, первый suqare - "логический черный" и т.д.

Ответ 2

Извините за задержку с ответом, но вот код, который вам нужен:

CONSOLE_SCREEN_BUFFER_INFOEX info;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfoEx(hConsole, &info);

info.ColorTable[0] = RGB(0,0,0);
...
info.ColorTable[3] = RGB(135, 206, 235);
...
info.ColorTable[15] = RGB (25,25,25);

SetConsoleScreenBufferInfoEx(hConsole, &info);

С помощью этого кода вы можете изменить цветовые значения всех 16 индексных цветов на любой цвет RGB по вашему желанию.

Чем вы можете напечатать строку нужного вам цвета следующим образом:

SetConsoleTextAttribute(hConsole, 3);
std::cout << "Hello World!" << std::endl;

И вот мой вывод: Мои выходные окна

Ответ 3

Есть способ сделать так, чтобы текст был полностью RGB, но для него требуется "SetPixel", если вы сделаете реплику текста, затем вы можете изменить значения RGB, вот что я сделал для 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;
    }
}