雖然 Turbo C 年代久遠,但其 BGI 圖形庫(graphics.h)仍是許多教學與舊專案維護的必修課。本文系統整理 Turbo C 3.0 下的字體設置、調色板操作、文本/圖形模式顏色控制,並給出中文顯示的兩條可行路徑。
Turbo C 僅在圖形模式支援字體切換,文本模式固定 8x8 點陣字體。
| 常數 | 索引 | 說明 |
|---|---|---|
| DEFAULT_FONT | 0 | 8x8 點陣字體 |
| TRIPLEX_FONT | 1 | 筆畫三倍字體 |
| SMALL_FONT | 2 | 筆畫小字體 |
| SANS_SERIF_FONT | 3 | 無襯線筆畫字體 |
| GOTHIC_FONT | 4 | 哥德筆畫字體 |
void settextstyle(int font, int direction, int charsize);
// font: 字體常數
// direction: HORIZ_DIR(0) 橫向 / VERT_DIR(1) 縱向
// charsize: 放大倍數(1~10),0 為預設 8x8
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
int main() {
int gd = DETECT, gm, err;
initgraph(&gd, &gm, "C:\\TC\\BGI"); // 路徑視安裝目錄調整
if ((err = graphresult()) != grOk) {
printf("Error: %s\n", grapherrormsg(err));
return 1;
}
char *names[] = {"Default", "Triplex", "Small", "Sans Serif", "Gothic"};
int midx = getmaxx() / 2, midy = getmaxy() / 2;
settextjustify(CENTER_TEXT, CENTER_TEXT);
for (int f = DEFAULT_FONT; f <= GOTHIC_FONT; f++) {
cleardevice();
int sz = (f == TRIPLEX_FONT) ? 4 : 1;
settextstyle(f, HORIZ_DIR, sz);
outtextxy(midx, midy, names[f]);
getch();
}
closegraph();
return 0;
}
BGI 內建字體不含中文,若需顯示漢字,必須自行繪製點陣或調用外部字庫:
int 10h 實現漢字顯示,C 代碼只需普通 printf。缺點:強依賴 DOS 實模式環境,現代系統無法直接運行。putpixel 繪製。靈活但需自行實現字庫解析、編碼轉換、逐點繪製,效率較低。推薦參考:《C 語言最新編程技巧 200 例》(魯沐浴編,電子工業出版社)中的漢字顯示專章。
每個字元佔 1 字節屬性:Bit7=閃爍, Bit6-4=背景色, Bit3-0=前景色。
textattr(attr):一次性設置完整屬性字節。textcolor(c) / textbackground(c):分別設置前景/背景(僅影響對應位)。cprintf 輸出,printf 繞過屬性設置直接寫視頻緩衝區,顏色不生效。setcolor(color):設置繪圖前景色(線條、文字)。setbkcolor(color):設置背景色。getmaxcolor():返回當前模式最大顏色索引。outtextxy。0: 黑 1: 藍 2: 綠 3: 青
4: 紅 5: 洋紅 6: 棕 7: 淺灰
8: 深灰 9: 亮藍 10: 亮綠 11: 亮青
12: 亮紅 13: 亮洋紅 14: 黃 15: 白
grok → grOk(圖形初始化成功常數)。initgraph(&gdriver, &gmode, "") 路徑需指向 EGAVGA.BGI 所在目錄。graphics.h、conio.h、dos.h 頭文件。Turbo C 圖形編程雖屬歷史,但其「模式切換 → 設置屬性 → 繪製/輸出 → 還原」的框架思想貫穿現代圖形 API(OpenGL、DirectX、SDL)。理解 BGI 的字體索引、屬性字節、調色板機制,有助於建立底層圖形系統的心智模型。若需現代跨平台圖形開發,請轉向 SDL2、Raylib 或 OpenGL。