SetTextColor не меняет цвет текста командной строки - PullRequest
0 голосов
/ 12 декабря 2018

Поскольку BGI устарел, и большая часть его исходного кода, по-видимому, отсутствует на исходном веб-сайте, я намеревался разработать свой собственный механизм обработки цветов, который будет воздействовать на линии по отдельности.До сих пор 16 цветов, которые может принимать «SetConsoleTextAttribute ()» из windows.h, работали нормально, но я намеревался использовать больше цветов (используя RGB вместо 0xbf), чтобы улучшить его внешний вид и раскрасить цвет.собственный ASCII art.

"SetTextColor ()", кажется, маршрут, который я хочу пройти.Я настроил функцию тестирования, чтобы увидеть, работает ли она.Вот фрагмент кода с настройкой.

HDC hType;    // Handle DC, save some work to reduce repetition
int initColor ()    // Initializes engine
{
    hType = GetDC (GetConsoleWindow ());

    printf ("String     Hexadecimal\n");
    testcolorR (RGB(255, 0, 0));    // Red
    testcolorR (RGB(0, 255, 0));    // Green
    testcolorR (RGB(0, 0, 255));    // Blue

    getch ();    // Pause to see results
    return 0;    // Exit success
}

// Take in RGB
void colortextR (COLORREF rgbcolor)
{
    SetTextColor (hType, rgbcolor);
}

// Test RGB colors
int testcolorR (COLORREF color)
{
    colortextR (color);
    printf ("Hello      %#x\n", color);
    return 0;
}

Однако в командной строке цвет не изменился и остался в качестве светло-серого по умолчанию, но это результат.

  1. Шестнадцатеричная строка
  2. Привет 0xff
  3. Привет 0xff00
  4. Привет 0xff0000

Это означает, что RGBцвет передается, но что-то еще вызывает эту проблему.Я подозреваю, что виновником является функция GetConsoleWindow ().

1 Ответ

0 голосов
/ 12 декабря 2018

SetTextColor - функция графического интерфейса;он не даст желаемого эффекта в стандартной консоли Windows.


Если ваше приложение будет работать только в Windows 10 build 14392 или новее или на (большинстве) не Windows-платформах, таких как Linuxтогда вы можете использовать виртуальные терминальные последовательности .Обратите внимание, что даже в поддерживаемых версиях Windows функциональность VT должна быть явно включена:

// error handling omitted for brevity; see GetLastError
HANDLE hOut = GetStdHandle( STD_OUTPUT_HANDLE );
if( hOut == INVALID_HANDLE_VALUE ) { return; }

DWORD dwMode = 0;
if( !GetConsoleMode( hOut, &dwMode ) ) { return; }
dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
if( !SetConsoleMode( hOut, dwMode ) ) { return; }

std::cout << "\x1b[91mRed\n"
          << "\x1b[92mGreen\n"
          << "\x1b[94mBlue\n"
          << "\x1b[38;5;221mArbitrary RGB color\n"
          << "\x1b[0mReset colors\n";

Если ваше приложение должно работать в более старых версиях Windows, и достаточно стандартной 16-цветовой палитрытогда будет работать нечто подобное следующему (см. SetConsoleTextAttribute и текстовые атрибуты буфера экрана консоли ):

// error handling omitted for brevity; see GetLastError
HANDLE hOut = GetStdHandle( STD_OUTPUT_HANDLE );
if( hOut == INVALID_HANDLE_VALUE ) { return; }

// save current buffer information
CONSOLE_SCREEN_BUFFER_INFO sbInfo{ sizeof CONSOLE_SCREEN_BUFFER_INFO };
GetConsoleScreenBufferInfo( hOut, &sbInfo );

SetConsoleTextAttribute( hOut, FOREGROUND_RED | FOREGROUND_INTENSITY );
std::cout << "Red\n";

SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY );
std::cout << "Green\n";

SetConsoleTextAttribute( hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY );
std::cout << "Blue\n";

SetConsoleTextAttribute( hOut, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN );
std::cout << "Light Gray\n";

SetConsoleTextAttribute( hOut, sbInfo.wAttributes );
std::cout << "Reset colors\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...