Вывод разноцветного текста в консоли
Вывод разноцветного текста в консоли
Давно не обращался к теме консольных приложений, надо бы восполнить этот недостаток. С обычным консольным вводом-выводом вопросов возникнуть не должно, тут ничего сложного нет. А вот какие-нибудь необычные действия с консолью, надеюсь, будут интересными. В оконных приложениях можно менять цвета отдельных элементов, что-то похожее можно делать и в консоли.
В отличие от оконных приложений, где вы можете использовать всю полноту цветовой палитры системы, в консоли так порезвиться не получится. Параметры цвета задаются всего одним байтом, где младшие 4 бита отвечают за цвет текста, а старшие 4 бита - за цвет фона. Соответственно, нам доступны комбинации из 16 цветов фона и 16 цветов текста (CGA-цвета). Для того, чтобы установить цвет для текста в консоли, перед выводом текста используем функцию SetConsoleTextAttribute.
Code (Assembler) : Убрать нумерацию
- ...
- ; Задать цвет и фон текста
- ; 4-7 бит - цвет фона
- ; 0-3 бит - цвет текста
- ; остальные биты не используются
- mov eax,9Eh
- ; Установить цвет и фон текста консоли
- invoke SetConsoleTextAttribute,[stdout],eax
- ; Вывести на консоль цветной текст
- invoke lstrlen,output_string
- invoke WriteConsole,[stdout],output_string,eax,tmp,NULL
- ...
Ну а раз уж мы затронули тему консоли, то можно попутно рассмотреть еще несколько полезных функций. А именно установку заголовка консольного окна, перемещение курсора по экрану и обработку нажатия клавиш.
По умолчанию в заголовке консольного окна отображается путь до консольного приложения. Эту надпись можно заменить на свою при помощи функции SetConsoleTitle. Измененный заголовок будет сохраняться, пока консольное окно не будет закрыто. Например, если при выполнении нескольких консольных команд в пакетном файле, одна из них поменяет заголовок окна, то он останется до конца выполнения пакетного файла.
Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- ...
- szTitle db 'Hello, world!',0
- ...
- ; Сегмент кода
- section '.code' code readable executable
- ...
- ; Установить заголовок консоли
- invoke SetConsoleTitle,szTitle
Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- ...
- struct COORD
- X dw ?
- Y dw ?
- ends
- pos COORD ; Структура для установки координат в консоли
- ...
- ; Сегмент кода
- section '.code' code readable executable
- ...
- ; Установка координат через структуру COORD
- mov [pos.X],5
- mov [pos.Y],1
- invoke SetConsoleCursorPosition,[stdout],[pos]
- ; Установка координат напрямую через регистр
- ; (Y shl 16) or X
- mov eax, (1 shl 16) or 5
- invoke SetConsoleCursorPosition,[stdout],eax
Code (Assembler) : Убрать нумерацию
- ; Получить хэндл стандартного ввода stdin
- invoke GetStdHandle,STD_INPUT_HANDLE
- mov ebx,eax
- ; Установить режим консоли
- invoke SetConsoleMode,ebx,NULL
- ; Дождаться нажатия любой клавиши
- invoke ReadConsole,ebx,buff,1,tmp,0
- ; Первый байт [buff] содержит код нажатой клавиши на тот случай, если
- ; надо анализировать выбор пользователя, например, "Choose [Y]es or [N]o"
Просмотров: 14774 | Комментариев: 10
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(27.02.2021 в 00:12):
Ну есть же запуск с преднастройками консоли
Алексей
(27.02.2021 в 00:09):
Шрифт бы еще в неё загружать свой :)
ManHunter
(29.01.2015 в 11:18):
Это не так. 4 цвета для графики и 16 для текста.
Пруф: https://ru.wikipedia.org/wiki/CGA
Пруф: https://ru.wikipedia.org/wiki/CGA
Kiry
(29.01.2015 в 11:14):
У меня был CGA монитор, там было не более 4 цветов в текстовом режиме. 16 цветов - это VGA
user
(26.11.2013 в 01:13):
Я о том и говорю, что ReadConsoleInput позволяет обрабатывать только Ctrl+C и Ctrl+Break, ну и Shift/Alt/Ctrl статусы. Тестовая программка как раз об этом.
ManHunter
(26.11.2013 в 00:11):
На самом деле есть замечательные функции FlushConsoleInputBuffer и ReadConsoleInput, при помощи которых, совершенно не напрягаясь, можно перехватить и служебные кнопки.
user
(25.11.2013 в 23:59):
Из служебных символов в консоли можно обрабатывать только Ctrl+C и Ctrl+Break, насколько я разобрался. Надыбалась тестовая программка для косольного ввода:
http://rghost.ru/50450092
http://rghost.ru/50450092
user
(25.11.2013 в 23:45):
Некоторые программы, использующие консоль, пользуются библиотекой PDCURSES.
Там хотя и понятно всё и медленно, зато организована мультиплатформенная поддержка.
Пример такой программы - симпатичный редактор XEDIT-типа - "THE".
Там хотя и понятно всё и медленно, зато организована мультиплатформенная поддержка.
Пример такой программы - симпатичный редактор XEDIT-типа - "THE".
==DJ==[ZLO]
(25.11.2013 в 19:35):
Зашибись посхалка ))))
Grey
(25.11.2013 в 08:31):
Шутник...)))) Цифры больно быстро бегут...
Добавить комментарий
Заполните форму для добавления комментария