BOOL ScrollConsoleScreenBuffer(
HANDLE hConsoleOutput, // 螢幕緩衝區控制代碼
const SMALL_RECT *lpScrollRectangle, // 捲動區域
const SMALL_RECT *lpClipRectangle, // 裁剪區域(NULL=整個緩衝區)
COORD dwDestinationOrigin, // 目標左上角座標
const CHAR_INFO *lpFill // 填充字符屬性
);
基礎場景:控制台輸出 4 行文字(0~3 行),捲動區域為第 1~2 行(索引 1~2),向下移動 5 行(目標原點 Y=5)。
第 1~2 行移至第 6~7 行,原位置填充空白。第 0 行與第 3 行被覆蓋(因在裁剪區內)。
僅第 1~2 行內容移動,第 0 行與第 3 行完全保持原樣。移動後第 1~2 行原位置填充空白。
第 1 行覆蓋第 2 行,第 2 行移至第 3 行(但在裁剪區外?不),實際觀察:捲動區域內容整體下移 1 行,頂行填充空白。
所有行整體下移,頂行填充空白,底行捨棄。
第 1 行下移至第 2 行(但第 2 行不在裁剪區內),結果:第 1 行內容消失,第 2 行不變,第 1 行填充空白。
| 區域類型 | 被移入內容覆蓋 | 移出後填充 | 備註 |
|---|---|---|---|
| 裁剪區域外 | 否 | 否 | 完全凍結,彷彿捲動不存在 |
| 裁剪區域內 | 是 | 是 | 完全受捲動影響 |
#include <stdio.h>
#include <windows.h>
int main() {
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbi;
SMALL_RECT scrollRect = {1, 1, 10, 2}; // 第1-2行, 第1-10列
COORD dest = {0, 5}; // 移至第5行
CHAR_INFO fill = {' ', 0}; // 空白填充
GetConsoleScreenBufferInfo(hOut, &csbi);
fill.Attributes = csbi.wAttributes; // 保持原屬性
// 輸出測試文字
printf("0000000000\n");
printf("1111111111\n");
printf("2222222222\n");
printf("3333333333\n");
ScrollConsoleScreenBuffer(hOut, &scrollRect, NULL, dest, &fill);
return 0;
}
`ScrollConsoleScreenBuffer` 的關鍵在於理解裁剪區域的邊界隔離作用。善用此特性,可在控制台實現類 GUI 的區域捲動效果,是文字模式介面開發的核心技術之一。