Низькорівневі функції виводу

Низькорівневі функції виводу консолі надають прямий доступ до символьних комірок буфера екрану. Одні функції читають або записують до послідовних комірок екранного буфера, починаючи із будь-якої позиції. Інші функції читають або записують до прямокутних блоків комірок.

Наступні функції читають або записують до вказаної послідовності символьних комірок в буфері екрану, починаючи із вказаної.

ReadConsoleOutputCharacter Копіює рядок символів Unicode або ANSI із буфера екрану.
WriteConsoleOutputCharacter Записує рядок символів Unicode або ANSI до буфера екрану.
ReadConsoleOutputAttribute Копіює атрибути кольору рядка тексту і фону з буфера екрану.
WriteConsoleOutputAttribute Записує атрибути кольору рядка тексту і фону до буферу екрану.
FillConsoleOutputCharacter Записує єдиний Unicode або символ ANSI до вказаної кількості послідовних комірок в буфері екрану.
FillConsoleOutputAttribute Записує атрибути кольору рядка тексту і фону до вказаної кількості послідовних комірок в буфері екрану.

Низькорівневі функції вимагають писати більше коду і вибирати серед більшого діапазону функцій, проте він також надає програмі більшої гнучкості.

Для роботи із вхідним буфером консолі за допомогою низькорівневих функцій слід ознайомитися із структурою запису у вхідному буфері. Кожний запис у вхідному буфері складається із типу події (WORD EventType) і запису про подію. Тип події приймає наступні значення: KEY_EVENT, MOUSE_EVENT, WINDOW_BUFFER_SIZE_EVENT, MENU_EVENT, FOCUS_EVENT (подія клавіатури, миші, зміни розміру буфера, меню, фокусу).

Розглянемо для прикладу структуру записів про подію від клавіатури і миші. Вони мають такі прототипи:

Подія клавіатури Подія миші
typedef struct _KEY_EVENT_RECORD { BOOL bKeyDown; WORD wRepeatCount; WORD wVirtualKeyCode; WORD wVirtualScanCode; union { WCHAR UnicodeChar; CHAR AsciiChar; } uChar; DWORD dwControlKeyState; } KEY_EVENT_RECORD; typedef struct _MOUSE_EVENT_RECORD { COORD dwMousePosition; DWORD dwButtonState; DWORD dwControlKeyState; DWORD dwEventFlags; } MOUSE_EVENT_RECORD;

Повний запис у вхідному буфері для подій клавіатури і миші має такий вигляд:

EventType Event
MOUSE EVENT MOUSE_EVENT_RECORD
MOUSE_­EVENT dwMouse­Position dwButtonState dwControlKeyState dwEventFlags
wX wY
KEY EVENT KEY_EVENT_RECORD
KEY_EVENT bKey­Down wRepeat­Count wVirtual­KeyCode wVirtual­ScanCode uChar dwControl­KeyState

Записи у вхідному буфері консолі містять поля, які відображають стан кнопок миші (dwButtonState), стан керуючих клавіш клавіатури (dwControlKeyState) та тип події миші (dwEventFlags). Ці поля можуть приймати наступні значення.

dwButtonState: FROM_LEFT_1ST_BUTTON_PRESSED RIGHTMOST_BUTTON_PRESSED FROM_LEFT_2ND_BUTTON_PRESSED FROM_LEFT_3RD_BUTTON_PRESSED FROM_LEFT_4TH_BUTTON_PRESSED dwControlKeyState: RIGHT_ALT_PRESSED LEFT_ALT_PRESSED RIGHT_CTRL_PRESSED LEFT_CTRL_PRESSED SHIFT_PRESSED NUMLOCK_ON SCROLLLOCK_ON CAPSLOCK_ON ENHANCED_KEY
dwEventFlags: DOUBLE_CLICK MOUSE_MOVED MOUSE_WHEELED

Розглянемо приклади низькорівневих функцій:

Функція читання запису із вхідного буфера консолі:

BOOL ReadConsoleInput(

HANDLE hConsoleInput, // дескриптор вхідного буфера консолі

PINPUT_RECORD lpBuffer, // адреса буфера для читання даних

DWORD nLength, // кількість записів, які слід прочитати

LPDWORD lpNumberOfEventsRead // адреса числа прочитаних записів

);

Функція запису в екранний буфер консолі:

BOOL WriteConsoleOutputCharacter(

HANDLE hConsoleOutput, // дескриптор екранного буфера консолі

LPCTSTR lpCharacter, // вказівник на буфер, із якого виводять

DWORD nLength, // кількість комірок для запису

COORD dwWriteCoord, // координати першої комірки

LPDWORD lpNumberOfCharsWritten // вказівник на число записаних комірок

);

Функція установки координат курсору:

BOOL SetConsoleCursorPosition(

HANDLE hConsoleOutput, // дескриптор екранного буфера консолі

COORD dwCursorPosition // нові координати курсору

);

Завдання для виконання роботи

1. Написати програму для одержання відомостей про систему. Для написання програми використати необхідні функції Win32 API: GetComputerName, GetUserName, GetSystemInfo, GetSystemMetrics, GetVersionEx, GetKeyboardType, GetWindowsDirectory, GetSystemDirectory, GetSysColor.

2. Для виведення результатів використати функції wsprintf, WriteConsole.

3. Написати програму для читання записів про події клавіатури або миші із вхідного буфера консолі. Для виведення результатів використати функції SetConsoleCursorPosition, wsprintf,WriteConsole,

Додаток

Наши рекомендации