控制文本的移動是控制台窗口界面編程的一個很重要的功能,有了這個功能我們可以實現界面的滾動。下面我們介紹一個控制文本移動的函數,如下:
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,裁減區域以內的區域會被移動過來的區域覆蓋。
總的歸納來說也就是完全受文本移動的影響,移動過來就被覆蓋,被移走就由設定的字符來填充