Как ESC[2J и CLS отличаются программно, и как я могу использовать Windows API для его реализации на C?

#c #windows #windows-console #ansi-escape

#c #Windows #windows-консоль #ansi-escape

Вопрос:

Поскольку Windows 10 теперь поддерживает escape-последовательности VT100, я заметил, что последовательности ESC[2J и CLS функционально одинаковы, но CLS немного мерцает, а ESC[2J — нет. Вот 2 пакетных файла в качестве простого примера:

Для ESC[2J

 @ECHO OFF
FOR /F %%A in ('ECHO prompt $E^| cmd') DO SET "ESC=%%A"
FOR /L %%Q in () DO (
    ECHO %ESC%[2J%ESC%[1;1HHi
)
  

Для CLS

 @ECHO OFF
FOR /F %%A in ('ECHO prompt $E^| cmd') DO SET "ESC=%%A"
FOR /L %%Q in () DO (
    CLS
    ECHO %ESC%[1;1HHi
)
  

CLS один мерцает значительно больше. Почему это так? Есть ли разница в том, как они реализованы функционально? Причина, по которой я спрашиваю, заключается в том, что я использую Windows Console API на C для создания небольшой игры. Я использую эту функцию для очистки текста в каждом цикле:

 void clearScreen(HANDLE handle, enum ClearType type) {
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    if (!GetConsoleScreenBufferInfo(handle, amp;csbi)) {
        printf("Unable to read Console Buffer Info!");
        exit(0);
    }
    DWORD charwritten;
    FillConsoleOutputCharacter(handle, ' ', csbi.dwSize.X * csbi.dwSize.Y, (COORD) {0, 0}, amp;charwritten);
}
  

Но в цикле результат тот же, что и при использовании CLS: много мерцания. Мой вопрос в том, есть ли другой способ очистить экран, аналогичный ESC[2J (без мерцания)? Какую другую консольную функцию я могу использовать?

Заранее спасибо,

LardPies

Комментарии:

1. В пакетных файлах я ожидаю, что разница связана с тем, что CLS, за которым следует ECHO, требует анализа и выполнения двух разных команд. Вы могли бы проверить эту теорию, разделив ECHO в первом пакетном файле на две строки, т. Е. ECHO %ESC%[2J За которыми следует ECHO %ESC%[1;1HHi

2. @user3386109 Вау, ты прав. Но даже в этом случае, как бы я сделал то же самое на C, используя консольные API? Как и в том же эффекте, что и в первом пакетном файле?

3. Я бы создал строку, подобную char clearMessage[] = { 27, '[', '2', 'J', 27, '[', '1', ';', '1', 'H', '' }; . Затем создайте большой буфер, например char buffer[1000] . Используйте strcpy для копирования строки в буфер и strcat любого текста, который вы хотите, в конец этой строки. Тогда это просто вопрос записи строки в консоль.

4. @user3386109 Это то, о чем я думал изначально, но потом, если бы я попытался использовать несколько цветов. Итак, я должен поместить SetConsoleAttributes между каждым символом. Есть ли лучший способ для этого? Спасибо