Функция ReadConsoleOutput копирует прямоугольный блок символьных и цветных атрибутов данных из экранного буфера консоли в буфер назначения. Функция рассматривает буфер назначения как двухмерный массив структур CHAR_INFO. Точно так же функция WriteConsoleOutput копирует прямоугольный блок символьных и цветных атрибутов данных из исходного буфера в экранный буфер консоли. Для получения дополнительной информации о чтении или записи в прямоугольных блоках ячеек экранного буфера, см. статью Методы ввода и вывода данных.
Нижеследующий пример использует функцию CreateConsoleScreenBuffer, чтобы создать новый экранный буфер. После того, как функция SetConsoleActiveScreenBuffer сделает этот экранный буфер активным, во временный буфер скопируется блок символов и атрибутов цвета верхних двух строк SDTOUT экранного буфера. Данные далее копируются из временного буфера в новый активный экранный буфер. Когда приложение завершает работу, используя новый экранный буфер, оно вызывает SetConsoleActiveScreenBuffer, чтобы восстановить исходный STDOUT экранный буфер.
|
Обратите внимание! на то, что MyErrorExit - групповой символ - заместитель для определяемой программой функции, которая показывает на экране и обрабатывает аварийные ситуации. |
#include <windows.h>
VOID main(void)
{
HANDLE hStdout, hNewScreenBuffer;
SMALL_RECT srctReadRect;
SMALL_RECT srctWriteRect;
CHAR_INFO chiBuffer[160]; // [2][80];
COORD coordBufSize;
COORD coordBufCoord;
BOOL fSuccess;
// Получим дескриптор STDOUT экранного буфера из которого будем копировать и создадим
// новый экранный буфер, в который будем копировать.
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
hNewScreenBuffer = CreateConsoleScreenBuffer(
GENERIC_READ | // доступ к чтению/записи
GENERIC_WRITE,
0, // совместно не используется
NULL, // атрибутов защиты нет
CONSOLE_TEXTMODE_BUFFER, // должен быть TEXTMODE
NULL); // зарезервирован, должен быть NULL
if (hStdout == INVALID_HANDLE_VALUE ||
hNewScreenBuffer == INVALID_HANDLE_VALUE)
{
MyErrorExit("CreateConsoleScreenBuffer");
}
// Сделаем новый экранный буфер активным экранным буфером.
if (! SetConsoleActiveScreenBuffer(hNewScreenBuffer) )
MyErrorExit("SetConsoleActiveScreenBuffer");
// Установим прямоугольник источника.
srctReadRect.Top = 0; // верхний левый: строчка 0, колонка 0
srctReadRect.Left = 0;
srctReadRect.Bottom = 1; // нижний правый: строчка 1, колонка 79
srctReadRect.Right = 79;
// Размер временного буфера равен 2 строчки x 80 колонок.
coordBufSize.Y = 2;
coordBufSize.X = 80;
// Верхняя левая ячейка назначения временного буфера равна строка 0, колонка 0.
coordBufCoord.X = 0;
coordBufCoord.Y = 0;
// Скопируем блок из экранного буфера во временный буфер.
fSuccess = ReadConsoleOutput(
hStdout, // экранный буфер, из которого читаем
chiBuffer, // буфер, в который копируем
coordBufSize, // размер колонки/строки chiBuffer
coordBufCoord, // верхняя левая ячейка назначения в chiBuffer
&srctReadRect); // источниковый прямоугольник экранного буфера
if (! fSuccess)
MyErrorExit("ReadConsoleOutput");
// Установим прямоугольник назначения.
srctWriteRect.Top = 10; // верхний левый: строка 10, колонка 0
srctWriteRect.Left = 0;
srctWriteRect.Bottom = 11; // нижний правый: строка 11, колонка 79
srctWriteRect.Right = 79;
// Копируем из временного буфера в новый экранный буфер.
fSuccess = WriteConsoleOutput(
hNewScreenBuffer, // экранный буфер, в который будем записывать
chiBuffer, // буфер, из которого копируем
coordBufSize, // размер колонки/строки chiBuffer
coordBufCoord, // верхняя левая ячейка источника в chiBuffer
&srctWriteRect); // прямоугольник назначения экранного буфера
if (! fSuccess)
MyErrorExit("WriteConsoleOutput");
Sleep(10000);
// Восстановление исходного активного экранного буфера.
if (! SetConsoleActiveScreenBuffer(hStdout))
MyErrorExit("SetConsoleActiveScreenBuffer");
}
|