Низькорівневі функції виводу
Низькорівневі функції виводу консолі надають прямий доступ до символьних комірок буфера екрану. Одні функції читають або записують до послідовних комірок екранного буфера, починаючи із будь-якої позиції. Інші функції читають або записують до прямокутних блоків комірок.
Наступні функції читають або записують до вказаної послідовності символьних комірок в буфері екрану, починаючи із вказаної.
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 | dwMousePosition | dwButtonState | dwControlKeyState | dwEventFlags | ||
wX | wY | |||||
KEY EVENT | KEY_EVENT_RECORD | |||||
KEY_EVENT | bKeyDown | wRepeatCount | wVirtualKeyCode | wVirtualScanCode | uChar | dwControlKeyState |
Записи у вхідному буфері консолі містять поля, які відображають стан кнопок миші (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,
Додаток