Выстроиться в очередь в консоли Windows

#c #winapi #iostream

#c #winapi #iostream

Вопрос:

Кажется, что вы можете вернуться на один символ из текущей строки в консоли, используя b . Однако консоль, похоже, не может перейти на одну строку вверх.

Я хочу отметить недопустимый пользовательский ввод красным. После ввода ввода пользователь нажимаетEnter, что выводит в консоль новую строку, которую невозможно удалить.

Мой план состоял в том, чтобы сделать следующее:

  1. Проверьте input правильность.
  2. Если это неверно, input.length() 1 время печати b
  3. Покрасить консоль в красный цвет
  4. Распечатать input , распечатать n

Но, b не будет возвращаться к строке, в которой находится пользовательский ввод. Итак, у меня есть план B:

  1. Запомните длину строки, которая была до ввода пользователем ( query_string )
  2. Проверьте input правильность.
  3. Если это неверно, перейдите к построению (где был введен ввод)
  4. Перейти к query_string.length() символу
  5. Покрасить консоль в красный цвет
  6. Распечатать input , распечатать n

Однако я не знаю, как это сделать, используя консольный API.

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

1. SetConsoleCursorPosition . Пока я этим занимаюсь, SetConsoleTextAttribute

Ответ №1:

Это можно сделать по крайней мере двумя способами.

Один из способов, как подразумевал @chris в комментарии, — сохранить положение курсора в том месте, где пользователь начал печатать. Когда вы обнаружите неверный ввод, вы возвращаете курсор в это положение и изменяете атрибут текста введенных им символов.

Вероятно, вы не хотите прокручивать окно на одну строку вверх. Если вы это сделаете, тогда появится окно «прыгать», когда пользователь допустит ошибку. Это действительно неприятный пользовательский интерфейс. Но если вы хотите попробовать, вы можете вызвать ScrollConsoleScreenBuffer .

Другой способ сделать это — изменить режим консоли, чтобы он автоматически не отображал символы, когда пользователь их вводит. Вместо этого вы читаете каждый символ по отдельности, добавляете его в свой входной буфер и, когда пользователь нажимает Enter, вы подтверждаете. Если входные данные действительны, вы вводите новую строку для перехода к следующей строке. В противном случае вы создаете резервную копию и выделяете ошибочный ввод. Это звучит как намного больше работы, но это не так сложно, и это приводит к гораздо лучшему интерфейсу.