Для организации высокоуровневого ввода-вывода приложение может использовать функции консольного ввода-вывода ReadConsole и WriteConsole. Эти функции обеспечивают доступ к входному и экранным буферам консоли.
Для своей работы эти и некоторые другие консольные функции требуют получения стандартных дескрипторов ввода-вывода.
Дескриптор - это 32-разрядное число, которое уникально идентифицирует объект, представляющий собой входное или выходное устройство.
По умолчанию стандартный дескриптор ввода связан с клавиатурой, стандартный дескриптор вывода — с экраном.
ReadConsole
Получает входные символы из буфера ввода консоли и сохраняет их в указанном буфере (то есть в переменной).
Формат вызова функции:
invoke ReadConsole, hConsoleInput, lpBuffer, nNumberOfCharsToRead, lpNumberOfCharsRead, lpReserved
Здесь после названия функции ReadConsole з аписывают используемые этой функцией параметры:
hConsoleInput - дескриптор ввода консоли (идентифицирует клавиатуру);
lpBuffer - указатель на переменную, в которую будет записана вводимая строка символов;
nNumberOfCharsToRead - размер буфера, указанного в lpBuffer;
lpNumberOfCharsRead – указатель на переменную, которая будет содержать количество действительно введенных символов;
lpReserved - этот параметр не используется, поэтому должен задаваться как NULL.
При использовании данной и последующих функций под термином “указатель” на переменную будем иметь в виду смещение данной перемееной относительно начала сегмента данных, которое можно получить с помощью оператора OFFSET.
Например,
invoke ReadConsole,dIn,offset TitleText,80,offset NumWri,NULL
где в секции данных описаны следующие переменные:
dIn dd 0;дескриптор ввода консоли
NumWri dd 0;количество действительно введенных-выведенных символов
|
TitleText db 80 dup (0),0
WriteConsole
Извлекает символы из указанного буфера и записывает их в экранный буфер, начиная с текущей позиции курсора и продвигая ее по мере записи символов.
Формат вызова функции:
invoke WriteConsole, hConsoleOutput, lpBuffer, nNumberOfCharsToWrite, lpNumberOfCharsWritten, lpReserved
где:
hConsoIeOutput — дескриптор выходного потока консоли;
lpBuffer — указатель на переменную, содержащую выводимую строку;
nNumberOfCharsToWrite — размер выводимой строки (размер lpBuffer);
lpNumberOfCharsWritten — указатель на перменную, которая будет содержать количество действительно выведенных символов;
lpReserved — этот параметр не используется, поэтому должен задаваться как NULL.
При использовании функций ReadConsole и WriteConsole в качестве параметров hConsolelnput и hConsoleOutput должны использоваться стандартные дескрипторы ввода-вывода. Получить стандартные дескрипторы ввода-вывода можно с помощью функции GetStdHandle. Формат вызова этой функции:
iInvoke GetStdHandle,nStdHandle
На вход функции GetStdHandle должно быть подано одно из следующих значений:
-10 = STD_INPUT_HANDLE – для получения дескриптора стандартного входного потока;
-11 = STD_OUTPUT_HANDLE – для получения дескриптора стандартного выходного потока.
В качестве параметра можно указать конкретное число (-10 или –11), но обычно используют стандартные константы (STD_INPUT_HANDLE и STD_OUTPUT_HANDLE), которым присвены соответствующие значения и которые описаны в подключаемом файле WINDOWS.INC в следующем виде:
STD_INPUT_HANDLE equ -10
STD_OUTPUT_HANDLE equ -11
Используя функции высокоуровневого ввода-вывода, приложение может управлять расположением, цветами текста и фона, которыми должны отображаться символы, записываемые в экранный буфер.
|
Рассмотрим применение некоторых из этих функций.
Функция SetConsoleCursorPosition предназначена для указания позиции, с которой начинается выполнение операций чтения-записи в окне консоли:
Формат вызова:
invoke SetConsoleCursorPosition, hConsoleOutput, dwCursorPosition
где:
hConsoIeOutput – дескриптор выходного потока консоли (предварительно полученный функцией GetStdHandle);
dwCursorPosition – 32-разрядная переменная, содержащая координаты, в которых будет установлен курсор консоли. Младшие 16 разрядов содержат координату X, а старшие 16 разрядов – координату Y. Для описания координат удобнее использовать струтуру.
По умолчанию цветовое оформление окна консоли довольно унылое — черный фон, белый текст. Внести разнообразие во внешний вид окна консоли поможет функция SetConsoleTextAttribute, с помощью которой можно изменить цвета, установленные по умолчанию для текста и фона. Формат вызова:
invoke SetConsoleTextAttribute, hConsoleOutput, dwAttributes
где:
hConsoleOutput - дескриптор выходного потока консоли (предварительно полученный функцией GetStdHandle);
dwAttributes – 32-разрядное число, определяющее цвета для текста и фона.
Параметр dwAttributes определяет цвет текста и фона. Он формируется через операцию логического ИЛИ следующих значений:
FOREGROUND_BLUE = 000lh - синий текст;
FOREGROUND_GREEN = 0002h - зеленый текст;
FOREGROUND_RED = 0004h - красный текст;
FOREGROUNDJNTENSITY = 0008h - текст повышенной яркости;
BACKGROUND_BLUE = 0010h - голубой фон;
BACKGROUND_GREEN = 0020h - зеленый фон;
BACKGROUND_RED = 0040h - красный фон;
BACKGROUND_INTENSITY = 0080h- фон повышенной яркости.
Для задания белого цвета складываются три цветовых компонента, для задания черного компоненты не задаются вовсе.
Для самостоятельной работы:
Разработать программу с использование API-функций высокоуровневого консольного ввода-вывода, позволяющую ввести с клавиатуры строку из 30 символов, а затем вывести эту строку в качестве заголовка консольного окна и в качестве содержимого экранного буфера консоли. При выводе строки в экранный буфер предусмотреть вариант повторного вывода строки с изменением позиции курсора и цветового оформления текста (Решение в папке win_02).