控制台窗口界面的编程控制(四)
2008-03-08 22:03:22 来源:WEB开发网核心提示:七、滚动和移动ScrollConsoleScreenBuffer是实现文本区滚动和移动的API函数,它可以将指定的一块文本区域移动到另一个区域,控制台窗口界面的编程控制(四),被移空的那块区域由指定字符填充,函数的原型如下:BOOL ScrollConsoleScreenBuffer(HANDLE hConsoleOu
七、滚动和移动
ScrollConsoleScreenBuffer是实现文本区滚动和移动的API函数。它可以将指定的一块文本区域移动到另一个区域,被移空的那块区域由指定字符填充。函数的原型如下:
BOOL ScrollConsoleScreenBuffer(
HANDLE hConsoleOutput, // 句柄
CONST SMALL_RECT* lpScrollRectangle, // 要滚动或移动的区域
CONST SMALL_RECT* lpClipRectangle, // 裁剪区域
COORD dwDestinationOrigin, // 新的位置
CONST CHAR_INFO* lpFill // 填充字符
);
利用这个API函数还可以实现删除指定行的操作。下面来举一个例子,程序如下:
#include
#include
#include
HANDLE hOut;
void DeleteLine(int row); // 删除一行
void MoveText(int x, int y, SMALL_RECT rc); // 移动文本块区域
void ClearScreen(void); // 清屏
void main()
{
hOut = GetStdHandle(STD_OUTPUT_HANDLE); // 获取标准输出设备句柄
Word att = FOREGROUND_RED FOREGROUND_GREEN FOREGROUND_INTENSITY
BACKGROUND_BLUE ;
// 背景是蓝色,文本颜色是黄色
SetConsoleTextAttribute(hOut, att);
ClearScreen();
PRintf("\n\nThe soul selects her own society,\n");
printf("Then shuts the door;\n");
printf("On her devine majority;\n");
printf("OBTrude no more.\n\n");
CONSOLE_SCREEN_BUFFER_INFO bInfo;
GetConsoleScreenBufferInfo( hOut, &bInfo );
COORD endPos = {0, bInfo.dwSize.Y - 1};
SetConsoleCursorPosition(hOut, endPos); // 设置光标位置
SMALL_RECT rc = {0, 2, 40, 5};
_getch();
MoveText(10, 5, rc);
_getch();
DeleteLine(5);
CloseHandle(hOut); // 关闭标准输出设备句柄
}
void DeleteLine(int row)
{
SMALL_RECT rcScroll, rcClip;
COORD crDest = {0, row - 1};
CHAR_INFO chFill;
CONSOLE_SCREEN_BUFFER_INFO bInfo;
GetConsoleScreenBufferInfo( hOut, &bInfo );
rcScroll.Left = 0;
rcScroll.Top = row;
rcScroll.Right = bInfo.dwSize.X - 1;
rcScroll.Bottom = bInfo.dwSize.Y - 1;
rcClip = rcScroll;
chFill.Attributes = bInfo.wAttributes;
chFill.Char.AsciiChar = ' ';
ScrollConsoleScreenBuffer(hOut, &rcScroll, &rcClip, crDest, &chFill);
}
void MoveText(int x, int y, SMALL_RECT rc)
{
COORD crDest = {x, y};
CHAR_INFO chFill;
CONSOLE_SCREEN_BUFFER_INFO bInfo;
GetConsoleScreenBufferInfo( hOut, &bInfo );
chFill.Attributes = bInfo.wAttributes;
chFill.Char.AsciiChar = ' ';
ScrollConsoleScreenBuffer(hOut, &rc, NULL, crDest, &chFill);
}
void ClearScreen(void)
{
CONSOLE_SCREEN_BUFFER_INFO bInfo;
GetConsoleScreenBufferInfo( hOut, &bInfo );
COORD home = {0, 0};
WORD att = bInfo.wAttributes;
unsigned long size = bInfo.dwSize.X * bInfo.dwSize.Y;
FillConsoleOutputAttribute(hOut, att, size, home, NULL);
FillConsoleOutputCharacter(hOut, ' ', size, home, NULL);
}
程序中,实现删除行的操作DeleteLine的基本原理是:首先将裁剪区域和移动区域都设置成指定行row(包括该行)以下的控制台窗口区域,然后将移动的位置指定为(0, row-1)。
这样,超出裁剪区域的内容被裁剪掉,从而达到删除行的目的。
需要说明的是,若裁剪区域参数为NULL,则裁剪区域为整个控制台窗口。
更多精彩
赞助商链接