Как переписать ту же часть консоли в собственном консольном приложении C ++ для Windows, не используя стороннюю библиотеку? - PullRequest
13 голосов
/ 05 сентября 2008

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

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

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

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

Ответы [ 5 ]

8 голосов
/ 05 сентября 2008

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

7 голосов
/ 08 сентября 2008

Джозеф, JP и CodingTheWheel предоставили ценную помощь.

В моем простом случае наиболее простой подход, похоже, основан на ответе CodingTheWheel :

// 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-ответом , в соответствии с примерами, предоставленными по ссылке от Joseph's ответ может оказаться полезным, но я нашел работу, необходимую для использования CHAR_INFO слишком утомительной для такого простого приложения.

5 голосов
/ 05 сентября 2008

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

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

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

3 голосов
/ 05 сентября 2008

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

0 голосов
/ 05 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...