Организация высокоуровневого консольного ввода-вывода
Функция SetConsoleCursorPosition предназначена для указания позиции, с которой начинается выполнение операций чтения-записи в окно консоли.
B00L SetConsoleCursorPosition(HANDLE hConsoleOutput. COORD dwCursorPosition);
Параметрами этой функции являются стандартный дескриптор вывода hConsoleOutput, полученный функцией GetStdHandle, и указатель на структуру COORD с координатами новой позиции курсора:
COORD struc x dw 0 у dw 0 ends
По умолчанию цветовое оформление окна консоли достаточно унылое – черный фон, белый текст. Внести разнообразие во внешний вид окна консоли поможет функция SetConsoleTextAttribute, с помощью которой можно изменить установки цвета по умолчанию для текста и фона.
B00L SetConsoleTextAttributetHANDLE hConsoleOutput. WORD wAttributes):
Первый параметр – без комментариев, второй определяет цвет текста и фона. Второй параметр формируется как логическое ИЛИ следующих значений:
- FOREGROUND_BLUE=0001h – синий текст;
- FOREGROUND_GREEN=0002h – зеленый текст;
- FOREGROUND_RED=0004h – красный текст;
- FOREGROUND_INTENSITY=0008h – текст повышенной яркости;
- BACKGROUND_BLUE=0010h – голубой фон;
- BACKGROUND_GREEN=0020h – зеленый фон;
- BACKGROUND_RED=0040h – красный фон;
- BACKGROUND_INTENSITY=0080h – фон повышенной яркости.
Для задания белого цвета складываются три компоненты, для задания черного – компоненты не задаются вовсе.
Пример программы ввода-вывода в консоль
Для демонстрации использования функций высокоуровневого ввода-вывода в окно консоли разработаем программу, которая вводит с клавиатуры строку и отображает ее в заголовке окна консоли, а затем выводит эту строку в окне консоли с изменением текущей позиции курсора и цвета текста.
:prg05_11.asm – программа ввода-вывода в консоль с изменением атрибутов выводимого текста ! .data .code start proc near – . точка входа в программу: ………. :получим стандартные дескрипторы ввода-вывода push STD_OUTPUT_HANDLE call GetStdHandle movdOut.eax:dOut-fleCKpnnTop вывода консоли push STD_INPUT_HANDLE call GetStdHandle mov din.eax idln-дескриптор ввода консоли:введем строку .¦установим курсор в позицию (2.6) mov con.хх.2 mov con.yy,6 push con push dOut call SetConsoleCursorPosition cmp eax. 0 jz exit;если неуспех push 0 push offset NumWri количество действительно введенных символов push 80:размер буфера TitleText для ввода push offset TitleText push din call ReadConsoleA cmp eax, 0 jz exit:если неуспех :выведем введенную строку в заголовок окна консоли: push offset TitleText call SetConsoleTitleA проверить успех вывода заголовка test eax.eax jz exit;неудача :выведем строку в окно консоли с различных позиций и с разными цветами установим курсор в позицию (2.5) mov ecx.10;строку выведем 10 раз mov bl.10000001b начальные атрибуты ml: push ecx inc con.xx inc con.yy push con push dOut call SetConsoleCursorPosition cmp eax.O jz exit:если неуспех;определим атрибуты выводимых символов – будем получать их циклически сдвигом – регистр BL хог еах.еах rol b1.1 mov al.bl push eax push dOut call SetConsoleTextAttribute cmp eax.O jz exit;если неуспех:вывести строку push 0 push offset NumWri действительное количество выведенных на экран push NumWri;длина строки для вывода на экран push offset TitleText:адрес строки для вывода на экран push dOut call WriteConsoleA cmp eax.O jz exit:если неуспех pop ecx loop ml exit::выход из приложения