Как я могу перезаписать ту же часть консоли в собственном консольном приложении Windows C++ без использования сторонней библиотеки?

StackOverflow https://stackoverflow.com/questions/45286

  •  09-06-2019
  •  | 
  •  

Вопрос

У меня есть консольное приложение, которое должно отображать состояние элементов, но вместо того, чтобы прокручивать текст как сумасшедший, я бы предпочел, чтобы текущий статус продолжал отображаться в тех же строках.Ради примера:

Running... nn% complete
Buffer size: bbbb bytes

должен быть выводом, где «nn» — текущий процент завершения, а «bbbb» — размер буфера, периодически обновляемый в одних и тех же строках консоли.

Первый подход, который я использовал, просто выводил на консоль правильное количество пробелов перед печатью нового состояния, но это вызывает неприятное мерцание, от которого я хочу избавиться.Я также хочу придерживаться либо стандартной библиотеки, либо функциональности, предоставляемой MS (VC 8), чтобы не вводить еще одну зависимость для этой простой необходимости.

Это было полезно?

Решение

Вы можете использовать SetConsoleCursorPosition.Вам нужно будет позвонить GetStdHandle чтобы получить дескриптор выходного буфера.

Другие советы

Джозеф, JP и CodingTheWheel оказали ценную помощь.

В моем простом случае наиболее простой подход, по-видимому, основывался на КодированиеОтвет TheWheel:

// before entering update loop
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO bufferInfo;
GetConsoleScreenBufferInfo(h, &bufferInfo);

// update loop
while (updating)
{
  // reset the cursor position to where it was each time
  SetConsoleCursorPosition(h, bufferInfo.dwCursorPosition);

  //...
  // insert combinations of sprintf, printf, etc. here
  //...
}

Для более сложных задач полный консольный API как предусмотрено Ответ JP, в соответствии с примерами, предоставленными через связь от Ответ Джозефа может оказаться полезным, но я нашел работу, необходимую для использования CHAR_INFO слишком утомительно для такого простого приложения.

Если вы печатаете с помощью и не используете функцию, которая генерирует новую строку или добавляет в конец, курсор вернется к началу строки и просто напечатает следующее, что вы поместите.Создание полной строки перед печатью также может уменьшить мерцание.

ОБНОВЛЯТЬ:Вопрос был изменен на 2 строки вывода вместо 1, что делает мой ответ неполным.Вероятно, необходим более сложный подход.У JP правильная идея с Консольный API.Я считаю, что на следующем сайте подробно описано многое из того, что вам понадобится для достижения вашей цели.На сайте также упоминается, что ключом к уменьшению мерцания является визуализация всего за кадром перед его отображением.Это справедливо всякий раз, когда вы отображаете что-либо на экране, будь то текст или графика (2D или 3D).

http://www.benryves.com/tutorials/?t=winconsole

Если предложение Джозефа не дает вам достаточной гибкости, взгляните на API консоли: http://msdn.microsoft.com/en-us/library/ms682073(VS.85).aspx.

В Linux это можно сделать, напечатав \b и/или в stderr.Возможно, вам придется поэкспериментировать, чтобы найти правильную комбинацию вещей в Windows.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top