ReadConsoleOutput功能将字符和颜色属性数据的矩形块从控制台屏幕缓冲区复制到目标缓冲区。该函数将目标缓冲区视为CHAR_INFO结构的二维数组。类似地,WriteConsoleOutput函数将字符和颜色属性数据的矩形块从源缓冲区复制到控制台屏幕缓冲区。有关从屏幕缓冲区单元的矩形块读取或写入更多信息,请参阅输入和输出方法.
以下示例使用CreateConsoleScreenBuffer功能创建新的屏幕缓冲区。在SetConsoleActiveScreenBuffer功能使此函数成为活动屏幕缓冲区之后,会将一块字符和颜色属性从SDTOUT屏幕缓冲区的前两行复制到临时缓冲区中。然后将数据从临时缓冲区复制到新的活动屏幕缓冲区。当应用程序使用新的屏幕缓冲区完成时,它调用SetConsoleActiveScreenBuffer恢复原来的STDOUT屏幕缓冲区。
#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); /* reserved; must be NULL */
if (hStdout == INVALID_HANDLE_VALUE ||
hNewScreenBuffer == INVALID_HANDLE_VALUE)
MyErrorExit("CreateConsoleScreenBuffer");
/ *使新屏幕缓冲区成为活动屏幕缓冲区。*/
if(!SetConsoleActiveScreenBuffer(hNewScreenBuffer))
MyErrorExit("SetConsoleActiveScreenBuffer");
/ *设置源矩形。*/
srctReadRect.Top = 0; /* top left: row 0, col 0 */
srctReadRect.Left = 0;
srctReadRect.Bottom = 1; /* bot. right: row 1, col 79 */
srctReadRect.Right = 79;
/ *临时缓冲区大小为2行×80列。*/
coordBufSize.Y = 2;
coordBufSize.X = 80;
/*
*临时缓冲区的左上角目的单元格是
*行0,col 0。
*/
coordBufCoord.X = 0;
coordBufCoord.Y = 0;
/ *将块从屏幕缓冲区复制到temp。缓冲。*/
fSuccess = ReadConsoleOutput(
hStdout,/ *屏幕缓冲区从* /
chiBuffer,/ *缓冲区复制到* /
coordBufSize,/ * col-row大小的chiBuffer * /
coordBufCoord,/ *顶部左手。单元格在chiBuffer * /
&srctReadRect); /* screen buffer source rectangle */
如果(!fSuccess)
MyErrorExit("ReadConsoleOutput");
/ *设置目标矩形。*/
srctWriteRect.Top = 10; /* top lt: row 10, col 0 */
srctWriteRect.Left = 0;
srctWriteRect.Bottom = 11; /* bot. rt: row 11, col 79 */
srctWriteRect.Right = 79;
/ *从临时缓冲区复制到新的屏幕缓冲区。*/
fSuccess = WriteConsoleOutput(
hNewScreenBuffer,/ *屏幕缓冲区写入* /
chiBuffer,/ *从* /
coordBufSize,/ * col-row大小的chiBuffer * /
coordBufCoord,/ *顶部的src单元格在chiBuffer * /
&srctWriteRect); /* dest. screen buffer rectangle */
如果(!fSuccess)
MyErrorExit("WriteConsoleOutput");
Sleep(10000);
/ *恢复原始的活动屏幕缓冲区。*/
if(!SetConsoleActiveScreenBuffer(hStdout))
MyErrorExit("SetConsoleActiveScreenBuffer");
}