#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 между каждым символом. Есть ли лучший способ для этого? Спасибо