控制文本的移动是控制台窗口界面编程的一个很重要的功能,有了这个功能我们可以实现界面的滚动。下面我们介绍一个控制文本移动的函数,如下:
BOOL ScrollConsoleScreenBuffer( //文本移动函数 HANDLE hConsoleOutput, //句柄 const SMALL_RECT *lpScrollRectangle, //移动区域 const SMALL_RECT *lpClipRectangle, //裁剪区域,如果为NULL,那么将代表整个屏幕缓冲区 COORD dwDestinationOrigin, //移动到的位置,这个点将成为移动区域的左上顶点 const CHAR_INFO *lpFill //空出区域的填充字符 );
下面来看一个移动文本的样例程序,如下:
#include <stdio.h> #include <conio.h> #include <Windows.h> #include <stdlib.h> int main() { HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE); //获得标准输出设备句柄 CONSOLE_SCREEN_BUFFER_INFO csbi; //定义窗口缓冲区信息结构体 SMALL_RECT scroll; //定义移动区域 COORD pos = {0, 5}; //移动位置 CHAR_INFO chFill; //定义填充字符 GetConsoleScreenBufferInfo(handle_out, &csbi); //获得窗口缓冲区信息 //定义填充字符的各个参数及属性 chFill.Char.AsciiChar = ' '; chFill.Attributes = csbi.wAttributes; //输出文本 printf("00000000000000000000000000000\n"); printf("11111111111111111111111111111\n"); printf("22222222222222222222222222222\n"); printf("33333333333333333333333333333\n"); //确定区域 scroll.Left = 1; scroll.Top = 1; scroll.Right = 10; scroll.Bottom = 2; ScrollConsoleScreenBuffer(handle_out, &scroll, NULL, pos, &chFill); //移动文本 return 0; }
在上面的样例程序中,裁剪区域是整个控制台窗口的屏幕缓冲区,现在如果我们把裁剪区域设定为与移动区域一样,也就是说ScrollConsoleScreenBuffer函数的第三个参数也改成&scroll,那么结果会怎么样呢?
为什么会发生这种现象呢?很明显示因为裁剪区域的设定问题,现在我们把裁剪区域依旧设定成移动区域,但是我们只把移动区域下移一行而不是移动在别的位置,看看会有什么现象发生?
现在我们应该可以猜想出结论了,别急,再做一个实验,现在我们将裁减区域又重新改为整个屏幕缓冲区,看看会有什么样的现象发生?
再来最后一个实验,我们将裁减区域减小为移动区域的上半部分,继续执行下移一行的操作,看看最终结果会怎么样?
好了,现在我们通过归纳可以得出几个结论了,那就是
一,裁减区域以外的区域不会受文本移动的影响。具体是:
1,裁减区域以外的区域不会被移动过来的区域覆盖,
2,裁减区域以外的区域被移动到他处之后原区域不发生变化,因此不需要填充字符。
总的归纳来说也就是原来是什么样子,文本移动后还是什么样子,不会改变。
二,裁减区域以内的区域受文本移动的影响。具体是:
1,当裁减区域以内的区域被移动到他处造成该区域为空时会被设定的字符填充,
2,裁减区域以内的区域会被移动过来的区域覆盖。
总的归纳来说也就是完全受文本移动的影响,移动过来就被覆盖,被移走就由设定的字符来填充。