Turbo C 2.0 作為經典 DOS 時代編譯器,其 conio.h 與 graphics.h 庫提供了豐富的文本窗口控制、色彩設置、圖形繪製與動畫實現功能。雖屬歷史產物,但其 API 設計思想對理解現代圖形管線、雙緩衝、視口裁剪等概念極具啟發價值。本文系統整理主函數參數、文本窗口、圖形模式初始化、基本繪圖、填充、視口、圖像拷貝、字體輸出等核心知識點,並附完整範例代碼。
main(int argc, char *argv[], char *env[])
argc:命令行參數個數(含程式名)。argv:參數字串陣列,argv[0] 為完整路徑(DOS 3.x+),argv[argc] == NULL。env:環境變量陣列,格式 NAME=VALUE,以 NULL 結尾。void window(int left, int top, int right, int bottom);
座標以螢幕左上角 (1,1) 為原點,預設全螢幕 80×25。可多次呼叫切換當前窗口。
void textbackground(int color); // 背景 0-7
void textcolor(int color); // 前景 0-15 + BLINK(128)
void textattr(int attr); // 合成:attr = 前景 + (背景<<4) + BLINK?
色彩常數表: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)。
cprintf、cputs、putch:受窗口邊界限制,自動換行/捲動。getche:回顯輸入字符。void clrscr(void); // 清當前窗口,光標歸 (1,1)
void clreol(void); // 清光標至行尾
void gotoxy(int x, int y); // 窗口相對座標
int gettext(int x1,int y1,int x2,int y2,void *buf);
int puttext(int x1,int y1,int x2,int y2,void *buf);
int movetext(int x1,int y1,int x2,int y2,int x3,int y3);
座標均為螢幕絕對座標;movetext 為拷貝非移動。
void far initgraph(int far *gdriver, int far *gmode, char *path);
gdriver:CGA(1) MCGA(2) EGA(3) EGA64(4) EGAMON(5) IBM8514(6) HERC(7) ATT400(8) VGA(9) PC3270(10) DETECT(0 自動偵測)。
gmode:各驅動下不同解析度與色深組合(見原文大表)。
int gdriver = DETECT, gmode;
initgraph(&gdriver, &gmode, "c:\\tc\\bgi");
獨立執行檔製作步驟:
BGIOBJ EGAVGA 生成 .OBJ。TLIB GRAPHICS.LIB + EGAVGA 併入庫。registerbgidriver(EGAVGA_driver) 後再 initgraph。void far setbkcolor(int color); // 背景 0-15
void far setcolor(int color); // 前景 0-15
void far cleardevice(void); // 清圖形螢幕
| 函數 | 說明 |
|---|---|
putpixel(x,y,color) | 畫點 |
line(x0,y0,x1,y1) | 直線 |
lineto(x,y) | 從當前游標畫線至 (x,y) |
circle(x,y,r) | 圓 |
arc(x,y,st,end,r) | 圓弧,角度 0° 為 +X 軸,逆時針 |
ellipse(x,y,st,end,xr,yr) | 橢圓弧 |
rectangle(x1,y1,x2,y2) | 矩形框 |
drawpoly(n, pts) | 多邊形,pts 為 x,y 交錯陣列,閉合需首尾相同 |
void far setlinestyle(int style, unsigned upattern, int thickness);
style:SOLID_LINE(0) DOTTED_LINE(1) CENTER_LINE(2) DASHED_LINE(3) USERBIT_LINE(4)。thickness:NORM_WIDTH(1) THIC_WIDTH(3)。upattern:僅 USERBIT_LINE 有效,16 bits 對應像素開關。void far setwritemode(int mode); // 0=COPY_PUT(覆蓋) 1=XOR_PUT(異或)
void far bar(x1,y1,x2,y2); // 實心矩形
void far bar3d(x1,y1,x2,y2,depth,top); // 3D 長方體
void far pieslice(x,y,st,end,r); // 扇形
void far sector(x,y,st,end,xr,yr); // 橢圓扇形
void far setfillstyle(int pattern, int color);
pattern:EMPTY_FILL(0) SOLID_FILL(1) LINE_FILL(2) LTSLASH_FILL(3) SLASH_FILL(4) BKSLASH_FILL(5) LTBKSLASH_FILL(6) HATCH_FILL(7) XHATCH_FILL(8) INTERLEAVE_FILL(9) WIDE_DOT_FILL(10) CLOSE_DOT_FILL(11) USER_FILL(12)。
自定義樣式:setfillpattern(char *upattern, int color),upattern 指向 8 bytes(8×8 點陣)。
void far floodfill(int x, int y, int border);
從內部點 (x,y) 向四周擴散,遇 border 色停止。注意:點在邊界/外部/非封閉區會導致溢出或錯誤填充。
void far setviewport(x1,y1,x2,y2,clipflag); // clipflag=1 限制繪圖於視口內
void far clearviewport(void);
struct viewporttype { int left,top,right,bottom,cliplag; };
視口座標為螢幕絕對座標,原點映射至 (0,0)。
void far setactivepage(int pagenum); // 繪圖目標頁
void far setvisualpage(int pagenum); // 顯示頁
僅 EGA/VGA/HERCULES 支援多頁,利用雙緩衝實現無閃爍動畫。
unsigned far imagesize(x1,y1,x2,y2); // 所需 bytes
void far getimage(x1,y1,x2,y2,void far *buf);
void far putimage(x,y,void *buf, int op); // op: COPY_PUT/XOR_PUT/OR_PUT/AND_PUT/NOT_PUT
單次拷貝限 64KB,超過返回 -1。
void far outtext(char far *str);
void far outtextxy(int x, int y, char far *str);
數值輸出需配合 sprintf 轉字串。
void far settextjustify(int horiz, int vert); // LEFT_TEXT(0) CENTER_TEXT(1) RIGHT_TEXT(2) / BOTTOM_TEXT(0) CENTER_TEXT(1) TOP_TEXT(2)
void far settextstyle(int font, int direction, int charsize);
font:DEFAULT_FONT(0, 8×8 點陣) TRIPLEX_FONT(1) SMALL_FONT(2) SANSSERIF_FONT(3) GOTHIC_FONT(4)。
direction:HORIZ_DIR(0) VERT_DIR(1)。
charsize:1~10 對應 8×8 到 80×80,0=USER_CHAR_SIZE 需配合 setusercharsize。
void far setusercharsize(int mulx, int divx, int muly, int divy);
僅對筆劃字體且 charsize==0 生效,寬度乘 mulx/divx,高度乘 muly/divy。
for(i=1;i<8;i++) {
window(10+i*5,5+i,30+i*5,15+i);
textbackground(i); clrscr();
}
bar3d(100,100,300,250,50,1);
for(i=0;i<=15;i++) { setcolor(i); circle(320,240,20+i*10); delay(100); }
int arw[16]={200,102,300,102,300,107,330,100,300,93,300,98,200,98,200,102};
drawpoly(8, arw);
getimage(69,169,131,231,buf);
for(i=0;i<185;i++) { putimage(70+i,170,buf,COPY_PUT); putimage(500-i,170,buf,COPY_PUT); }
for(i=0;i<185;i++) { putimage(255-i,170,buf,COPY_PUT); putimage(315+i,170,buf,COPY_PUT); }
Turbo C 2.0 的圖形庫雖已退出歷史舞台,但其「視口-窗口」、「雙緩衝頁面」、「點陣/筆劃字體」、「填充樣式」等設計思想在現代圖形 API(OpenGL, DirectX, Canvas, SVG)中均有對應映射。研讀經典代碼,有助於建立從像素操作到渲染管線的完整認知鏈路。