Функции API для работы с консолью

Создание Windows-приложений / Функции API для работы с консолью

Для начала работы с консолью необходимо получить ее дескриптор.

Функция получения дескриптора стандартного устройства ввода, вывода или ошибки в зависимости от переданного константного параметра:
HANDLE WINAPI GetStdHandle(__in DWORD nStdHandle);

nStdHandle может принимать значения

  • STD_INPUT_HANDLE = -10;  // устройство ввода
  • STD_OUTPUT_HANDLE = -11;  // устройство вывода
  • STD_ERROR_HANDLE = -12;  // ошибка
Использование русского языка в консоли с помощью API

Для указания кодовой страницы используются функции

  • Кодовая страница консоли вывода
    BOOL WINAPI SetConsoleOutputCP(UINT wCodePageID);
  • Кодовая страница консоли ввода
    BOOL WINAPI SetConsoleCP(UINT wCodePageID);

где wCodePageID - номер кодовой страницы.
Для перекодировки на русский язык используется кодовая страница wCodePageID=1251.

Для перекодировки русского текста, введенного в Win-коде также может использоваться функция
BOOL WINAPI CharToOem(LPCTSTR lpszSrc, LPSTR lpszDst)

  • lpszSrc – указатель на строку-источник;
  • lpszDst/strong> – указатель на строку-приемник

Возвращаемое значение 1 в случае успешной перекодировки.

Чтение/запись данных в консоль/файл

Для чтения и записи данных в консоль используются функции

  • Чтение данных 

    BOOL WINAPI ReadFile(
    _In_   HANDLE hFile,
    _Out_   LPVOID lpBuffer,
    _In_   DWORD nNumberOfBytesToRead,
    _Out_   LPDWORD lpNumberOfBytesRead,
    _Inout_ LPOVERLAPPED lpOverlapped);
  • Запись данных 

    BOOL WINAPI WriteFile(
    _In_   HANDLE hFile,
    _In_   LPCVOID lpBuffer,
    _In_   DWORD nNumberOfBytesToWrite,
    _Out_   LPDWORD lpNumberOfBytesWritten,
    _Inout_ LPOVERLAPPED lpOverlapped);

В случае успешного завершения функции возвращают ненулевое значение.
Аргументы функций

  • hFile -дескриптор файла/консоли. Файл/консоль должен иметь доступ для чтения для функции ReadFile() и доступ для записи для функции WriteFile().
  • lpBuffer - указатель на буфер (строку) для чтения/записи данных.
  • nNumberOfBytesToWrite - число байтов, которые будут записаны в файл.
  • lpNumberOfBytesWritten - указатель на переменную, которая получает число считанных/записанных байтов.
  • lpOverlapped - указатель на структуру OVERLAPPED, которая используется в операциях асинхронного ввода-вывода (например, получение данных по интерфейсу связи). Для синхронного ввода-вывода данный указатель имеет значение NULL.
Установка заголовка окна консоли

Функция установки заголовка окна консоли
BOOL WINAPI SetConsoleTitle(__in LPCTSTR lpConsoleTitle);
lpConsoleTitle – указатель на строку имени консоли с завершающим нуль-символом

Установка цвета символов и фона в консоли

Цвет символов и фона задается с помощью констант, определяющих тетрады символов.
Цвет символов

  • FOREGROUND_BLUE = 0x01
  • FOREGROUND_GREEN  = 0x02
  • FOREGROUND_RED = 0x04
  • FOREGROUND_INTENSITY = 0x08

Фон символов

  • BACKGROUND_BLUE = 0x10
  • BACKGROUND_GREEN  = 0x20
  • BACKGROUND_RED = 0x40
  • BACKGROUND_INTENSITY = 0x80

Каждая тетрада, определяющая цвет символов или фона, представляет собой значение от 0 до 15, задаваемая логической суммой соответствующих констант:

Цвета в консоли

Например, цвет символов с кодом 13 задается как

FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY.

Функция определения атрибутов вводимых символов в окне консоли
BOOL WINAPI SetConsoleTextAttribute(
__in HANDLE hConsoleOutput,
__in WORD wAttributes);

  • hConsoleOutput – дескриптор буфера консоли вывода;
  • wAttributes – цвет букв и фона, получаемый путем комбинации констант

Функция, задающая цвет фона консоли(путем закрашивания фона отдельных символов)
BOOL WINAPI FillConsoleOutputAttribute(
__in HANDLE hConsoleOutput,
__in WORD wAttribute,
__in DWORD nLength,
__in COORD dwWriteCoord,
__out LPDWORD lpNumberOfAttrsWritten);

  • hConsoleOutput – дескриптор буфера вывода консоли;
    wAttribute – атрибут цвета фона символа в консоли;
  • nLength – количество ячеек символов, фон которых устанавливается заданным цветом;
  • dwWriteCoord – координаты первой закрашиваемой ячейки;
  • lpNumberOfAttrsWritten – указатель на идентификатор, в который записывается количество реально закрашенных ячеек.

Для того чтобы изменить цвет всего окна консоли необходимо задать цвет символов, количество которых определяется размером окна консоли. Размер стандартного окна консоли 80x25 = 2000 символов.

Установка позиции курсора

Функция установки позиции курсора в окне консоли

BOOL WINAPI SetConsoleCursorPosition(
__in HANDLE hConsoleOutput,
__in COORD dwCursorPosition);

hConsoleOutput – дескриптор буфера вывода консоли;
dwCursorPosition – структура координат COORD, определяющая позицию курсора.
Структура координат представляет собой

struct COORD {
  short X;
  short Y;
};

Пример

#include <windows.h>
int main() {
  DWORD l;
  COORD point;
  point.X = 0; point.Y = 0;
  HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
  HANDLE hin = GetStdHandle(STD_INPUT_HANDLE);
  char title[] = "Консольная программа";
  CharToOem(title, title);
  SetConsoleTitle(title);
  SetConsoleOutputCP(1251);
  SetConsoleTextAttribute(hout, FOREGROUND_RED |
FOREGROUND_INTENSITY);
  FillConsoleOutputAttribute(hout, 0, 2000, point, &l); // очистка экрана
  for (int y = 0; y < 16; y++) {
    point.Y = y;
    FillConsoleOutputAttribute(hout, y << 4, 80, point, &l);
    SetConsoleCursorPosition(hout, point);
  }
  char c;
  ReadFile(hin, &c, 1, &l, NULL);
  return 0;
}

Результат выполнения
Цветная консоль

Примечание: для корректной компиляции программы необходимо изменить тип кодировки проекта на многобайтовую.

Назад

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *