首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Turbo C 字符屏幕函數詳解:窗口定義、顏色設置、輸入輸出與屏幕操作

     編輯:關於C語言

文本窗口系統概述

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:

常數值顏色適用
BLACK0黑前景/背景
BLUE1藍前景/背景
GREEN2綠前景/背景
CYAN3青前景/背景
RED4紅前景/背景
MAGENTA5洋紅前景/背景
BROWN6棕前景/背景
LIGHTGRAY7淡灰前景/背景
DARKGRAY8深灰僅前景
LIGHTBLUE9淡藍僅前景
LIGHTGREEN10淡綠僅前景
LIGHTCYAN11淡青僅前景
LIGHTRED12淡紅僅前景
LIGHTMAGENTA13淡洋紅僅前景
YELLOW14黃僅前景
WHITE15白僅前景
BLINK128閃爍屬性僅前景 (與顏色或運算)

背景色僅 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/gotoxyncurses (newwin/wclear/wmove) / ANSI 轉義序列
textbackground/textcolor/textattrANSI SGR (\033[38;5;...m / \033[48;5;...m)
cprintf/cputs/putch/getcheprintf/puts/putchar/getchar + ncurses 輸入
gettext/puttext/movetextncurses 窗口內容拷貝 / 終端緩衝區操作

總結

Turbo C 字符屏幕函數構建了文本模式下的窗口化 UI 框架,支援窗口劃分、屬性設置、邊界約束輸出、屏幕內存拷貝。雖屬 DOS 時代產物,其「窗口-屬性-輸出」三層抽象思想仍是現代終端 UI 庫(ncurses、FTXUI、Ratatui)的核心設計模式。理解這套機制有助於掌握終端圖形編程本質。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved