Turbo C 2.0 提供完整的文本模式窗口管理功能。默認窗口佔滿整屏(80列×25行或 40列×25行),每個字符單元包含字符碼與屬性字節(前景色、背景色、閃爍)。可通過 window() 定義任意矩形區域為活動窗口,後續輸入輸出自動限制在窗口內,支援多窗口切換(單任務下僅一個活動窗口)。
window()
#include
void window(int left, int top, int right, int bottom);
// 參數為屏幕絕對座標 (1,1) 為左上角,(80,25) 為右下角。
// 超出屏幕範圍不報錯但無效果。
// 例:左上(20,5),寬30列高15行 → window(20, 5, 50, 20);
textbackground() / textcolor()
void textbackground(int color); // 背景色 0-7
void textcolor(int color); // 前景色 0-15 + BLINK(128)
符號常數定義於 conio.h:
| 常數 | 值 | 顏色 | 適用 |
|---|---|---|---|
| BLACK | 0 | 黑 | 前景/背景 |
| BLUE | 1 | 藍 | 前景/背景 |
| GREEN | 2 | 綠 | 前景/背景 |
| CYAN | 3 | 青 | 前景/背景 |
| RED | 4 | 紅 | 前景/背景 |
| MAGENTA | 5 | 洋紅 | 前景/背景 |
| BROWN | 6 | 棕 | 前景/背景 |
| LIGHTGRAY | 7 | 淡灰 | 前景/背景 |
| DARKGRAY | 8 | 深灰 | 僅前景 |
| LIGHTBLUE | 9 | 淡藍 | 僅前景 |
| LIGHTGREEN | 10 | 淡綠 | 僅前景 |
| LIGHTCYAN | 11 | 淡青 | 僅前景 |
| LIGHTRED | 12 | 淡紅 | 僅前景 |
| LIGHTMAGENTA | 13 | 淡洋紅 | 僅前景 |
| YELLOW | 14 | 黃 | 僅前景 |
| WHITE | 15 | 白 | 僅前景 |
| BLINK | 128 | 閃爍屬性 | 僅前景 (與顏色或運算) |
背景色僅 0-7 八種,8-15 映射回 0-7。textcolor(YELLOW + BLINK) 實現閃爍黃字。
textattr()
void textattr(int attr);
// attr 位構成:Bit7=閃爍, Bit6-4=背景色(0-7), Bit3-0=前景色(0-15)
// 例:藍底黃字閃爍 → textattr(BLINK + YELLOW + (BLUE << 4));
clrscr() 觸發顏色生效clrscr() 清除窗口,整個窗口背景/前景才會更新為新顏色。| 函數 | 功能 | 對應標準函數 | 特性 |
|---|---|---|---|
cprintf(fmt, ...) | 格式化輸出到窗口 | printf | 受窗口邊界限制,自動換行/滾動 |
cputs(str) | 輸出字符串到窗口 | puts | 同上 |
putch(ch) | 輸出單字符到窗口 | putchar | 同上 |
getche() | 帶回顯讀字符 | getchar | 超出右邊界自動換行 |
clrscr():清當前窗口,光標歸 (1,1)。clreol():清光標至行尾,光標不動。gotoxy(x, y):移動光標到窗口相對座標 (x,y)。超出窗口無效。wherex() / wherey():返回光標窗口相對座標。gettext / puttext / movetext
int gettext(int x1, int y1, int x2, int y2, void *buffer);
int puttext(int x1, int y1, int x2, int y2, void *buffer);
int movetext(int x1, int y1, int x2, int y2, int x3, int y3);
buffer 大小 = (y2-y1+1) * (x2-x1+1) * 2 字節(每單元 2 字節:字符+屬性)。gettext:屏幕區域 → 內存。puttext:內存 → 屏幕區域。movetext:屏幕區域 → 另一屏幕區域(拷貝而非移動,源區域內容保留)。highvideo():高亮前景。lowvideo():低亮前景。normvideo():恢復程序啟動時的視頻屬性。
#include
int main() {
int i;
char *colors[] = {"BLACK","BLUE","GREEN","CYAN","RED","MAGENTA","BROWN","LIGHTGRAY"};
textbackground(BLACK); clrscr(); // 全屏黑底
for (i = 1; i < 8; i++) {
window(10+i*5, 5+i, 30+i*5, 15+i); // 級聯窗口
textbackground(i); clrscr(); // 不同背景色
cprintf("Window %d: %s", i, colors[i]);
}
getch();
return 0;
}
| Turbo C 函數 | 現代跨平台替代 |
|---|---|
| window/clrscr/gotoxy | ncurses (newwin/wclear/wmove) / ANSI 轉義序列 |
| textbackground/textcolor/textattr | ANSI SGR (\033[38;5;...m / \033[48;5;...m) |
| cprintf/cputs/putch/getche | printf/puts/putchar/getchar + ncurses 輸入 |
| gettext/puttext/movetext | ncurses 窗口內容拷貝 / 終端緩衝區操作 |
Turbo C 字符屏幕函數構建了文本模式下的窗口化 UI 框架,支援窗口劃分、屬性設置、邊界約束輸出、屏幕內存拷貝。雖屬 DOS 時代產物,其「窗口-屬性-輸出」三層抽象思想仍是現代終端 UI 庫(ncurses、FTXUI、Ratatui)的核心設計模式。理解這套機制有助於掌握終端圖形編程本質。