Как использовать последовательности ESC для установки цветов переднего плана? - PullRequest
0 голосов
/ 02 апреля 2019

Я пишу динамическую цветовую палитру для консольного терминала. Дело в том, чтобы заставить последовательности ANSI ESC работать в терминале wincon по умолчанию, достаточно установить эти флаги для дескрипторов консоли:

    DWORD dwRequestedOutModes = ENABLE_VIRTUAL_TERMINAL_PROCESSING | DISABLE_NEWLINE_AUTO_RETURN;
    DWORD dwRequestedInModes = ENABLE_VIRTUAL_TERMINAL_INPUT;

но их использование - другое дело. Прямо сейчас мой консольный движок выводит экранный буфер, созданный с CHAR_INFO с WriteConsoleOutputW(), но сам CHAR_INFO поддерживает только 16 цветов схемы по умолчанию.

Использование CONSOLE_SCREEN_BUFFER_INFOEX снова ограничено 16 цветами, но на этот раз на заказ.

Хорошим моментом является использование консольных ESC-последовательностей, но проблема в том, что я нашел только примеры использования printf(). Для моего проекта printf слишком медленный и ненадежный, есть ли другой способ назначить последовательность ESC каждому символу в буфере.

Вот пример моего кода:

WriteConsoleOutputW(this->m_hConsole, this->localFrame, (COORD){ (short)this->m_nScreenWidth, (short)this->m_nScreenHeight }, (COORD){ 0,0 }, &this->m_rectWindow);

Процедура рисования: localFrame - это указатель CHAR_INFO

void PrintFrameW(void* self, int x, int y, wchar_t character, short color)
{
    struct c_class* this = self;
    if (x >= 0 && x < this->nFrameLength&&y >= 0 && y < this->nFrameHeight)
    {
        this->localFrame[y*this->nFrameLength + x].Char.UnicodeChar = character;
        this->localFrame[y*this->nFrameLength + x].Attributes = color;
    }
}

Это похоже на код C ++, но это мой собственный C с классами, так что это подведение итогов ANSI-C для образовательных целей.

Вопрос в следующем: Как раскрасить вывод консоли с помощью Escape-последовательностей и где их разместить, чтобы можно было напечатать что-то вроде этого:

enter image description here* * 1030

используя '' char (пробел) и устанавливая цвет фона на ESC [48; 2; р ; г ; б или ESC [48; 5; s

1 Ответ

0 голосов
/ 03 апреля 2019

Оказывается, что низкоуровневая функция может быть сделана для записи чего-либо в консоли без каких-либо проверок. Для этого требуется только две вещи: буфер буфера и WriteFile ().

char lfbuf[5120U] = { '\x1b','[','3','8',';','2',';','1','0','0',';','0',';','0','m','w','\0' };



        DWORD const lfbuf_length = (DWORD)(17);

        DWORD written;
        WriteFile(hOut, lfbuf, lfbuf_length, &written, NULL);

где hOut - дескриптор консоли. Оказывается, этот процесс обрабатывается терминалом и работает быстро, поскольку он длится всего пару тысяч тиков. Мне пришлось полностью изменить printf (), чтобы выяснить это. Может быть, есть что-то быстрее, но WriteFile необратим, он останавливает выполнение, когда я обращаюсь к сборке.

...