屏幕緩衝區是一個在控制檯窗口輸出的二維字符及顏色數組。一個控制檯可以包含多個屏幕緩衝區,當前屏幕緩衝區指的是顯示在屏幕上的那個緩衝區。
系統在創建新控制檯時就會創建一個屏幕緩衝區。調用CreateFile函數指定CONOUT$值便可打開控制檯的當前屏幕緩衝區。程序可以CreateConsoleScreenBuffer 函數爲它的控制檯創建額外的屏幕緩衝區。一個新的屏幕緩衝區用自己的句柄調用SetConsoleActiveScreenBuffer函數便可設置爲當前緩衝區。然而,不管是否是當前緩衝區,都可以被訪問以進行讀取及寫入操作。
每個屏幕緩衝區都有自己的二維字符信息記錄數組。每個字符信息都被存儲在CHAR_INFO結構中,該結構中指定了Unicode或ANSI字符以及顯示字符時的前景及背景顏色。
每個屏幕緩衝區的關聯屬性都可以被單獨設置。這也意味着變更控制檯的當前屏幕緩衝區的效果會很有意思。屏幕緩衝區的關聯屬性包括:
- 屏幕緩衝區大小,按字符行列記。
- 文本屬性(WriteFile或WriteConsole函數用於“顯示”文本所用的前景及背景)。
- 窗口大小及定位(在控制檯窗口中顯示的屏幕緩衝區的矩形區域)。
- 光標位置,外觀及可見度。
- 輸出模式(ENABLE_PROCESSED_OUTPUT及ENABLE_WRAP_AT_EOL_OUTPUT)。關於控制檯輸出模式的更多信息,請參見高級控制檯模式。
屏幕緩衝區創建時,不含任何內容。光標可見,並處在緩衝區的原點(0,0),並且窗口的左上角與緩衝區原點重合。控制檯屏幕緩衝區大小,窗口大小,文本屬性及光標外觀這些都是由系統默認或用戶設置所決定的,要確定當前這些不同的屬性值,可以通過調用GetConsoleScreenBufferInfo、GetConsoleCursorInfo及GetConsoleMode函數來獲取。
要改變任意控制檯屏幕緩衝區屬性的應用程序應該或者創建自己的屏幕緩衝區,或者在開始時保存繼承的屏幕緩衝區狀態並在退出時恢復。
光標外觀及定位
屏幕緩衝區的光標可以是可見的或者隱藏的。可見時,它的外觀可以由填滿整個文本單元格到單元格底部的橫線。要獲取光標的外觀及可見性的有關信息,可以調用GetConsoleCursorInfo函數。通過該函數可以知曉光標是否可見及光標所佔單元格的百分比。而SetConsoleCursorInfo可以用來設置光標的這些信息。
通過高級控制檯I/O函數寫入的字符被輸出到當前的光標位置,然後光標後移。要確定當前光標的位置(按屏幕緩衝區的座標系計),可以調用GetConsoleScreenBufferInfo。當然,你可以通過SetConsoleCursorPosition來設置光標的當前位置,並以此來控制高級I/O寫入或回顯文本的位置。如果移動了光標,新位置的文本將會被重寫(覆蓋)。
各屏幕緩衝區間光標位置、外觀及可見性的設置是無關的。
字符屬性
字符屬性可以分爲兩類:顏色和DBCS,以下屬性在Wincon.h中有定義:
屬性 | 含義 |
---|---|
FOREGROUND_BLUE | 文本顏色包含藍色 |
FOREGROUND_GREEN | 文本顏色包含綠色 |
FOREGROUND_RED | 文本顏色包含紅色 |
FOREGROUND_INTENSITY | 文本顏色加亮 |
BACKGROUND_BLUE | 背景含藍色 |
BACKGROUND_GREEN | 背景含綠色 |
BACKGROUND_RED | 背景含紅色 |
BACKGROUND_INTENSITY | 背景加亮 |
COMMON_LVB_LEADING_BYTE | 首字節 |
COMMON_LVB_TRAILING_BYTE | 末字節 |
COMMON_LVB_GRID_HORIZONTAL | 首行 |
COMMON_LVB_GRID_LVERTICAL | 左列 |
COMMON_LVB_GRID_RVERTICAL | 右列 |
COMMON_LVB_REVERSE_VIDEO | 翻轉前景及背景屬性 |
COMMON_LVB_UNDERSCORE | 下劃線 |
前景屬性指定文本顏色,背景屬性指定單元格背景顏色,其他屬性與DBCS一起使用。
應用程序可以通過設置背景及前景色實現不同的配色方案。例如,如下組合實現藍背景、亮青色文本。
FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_BLUE
如果未指定背景,背景爲黑色,如果不指定前景,文本爲黑色。例如如下組合聲明白背景與黑文本。
BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED
每個屏幕緩衝區字符單元都存儲着背景及所繪文本的顏色屬性。應用程序可以單獨爲每個單元格設置顏色屬性,並存儲在每個單元的CHAR_INFO結構的Attributes成員中。當前屏幕緩衝區的文本屬性是用來爲高級函數輸出或回顯用的。
應用程序通過GetConsoleScreenBufferInfo 確定屏幕緩衝區的當前文本屬性,並調用SetConsoleTextAttribute 函數來設置字符屬性。變更屏幕緩衝區屬性並不影響原來所顯示的字符。這些文本屬性不會影響低級控制檯I/O的輸出(如WriteConsoleOutput,或WriteConsoleOutpubCharacter函數),這些低級函數需要明確指定要輸出到的單元格的屬性,或者保留原屬性。
字體屬性
GetCurrentConsoleFont 獲取當前控制檯的字體,並存儲於CONSOLE_FONT_INFO結構中,其中包括字體中每個字符的高度與寬度信息。
GetConsoleFontSize 獲取指定控制檯緩衝區的字體大小。