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

Turbo C 2.0 圖形與文本模式編程全攻略

     編輯:關於C語言

引言

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 結尾。

二、文本窗口與色彩

2.1 窗口定義

void window(int left, int top, int right, int bottom);

座標以螢幕左上角 (1,1) 為原點,預設全螢幕 80×25。可多次呼叫切換當前窗口。

2.2 色彩設置

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)。

2.3 輸入輸出函數

  • cprintf、cputs、putch:受窗口邊界限制,自動換行/捲動。
  • getche:回顯輸入字符。

2.4 螢幕操作

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 為拷貝非移動。

三、圖形模式初始化

3.1 驅動與模式

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:各驅動下不同解析度與色深組合(見原文大表)。

3.2 自動偵測與獨立執行檔

int gdriver = DETECT, gmode;
initgraph(&gdriver, &gmode, "c:\\tc\\bgi");

獨立執行檔製作步驟:

  1. BGIOBJ EGAVGA 生成 .OBJ。
  2. TLIB GRAPHICS.LIB + EGAVGA 併入庫。
  3. 代碼中 registerbgidriver(EGAVGA_driver) 後再 initgraph。

3.3 色彩與清屏

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 交錯陣列,閉合需首尾相同

4.1 線型設置

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 對應像素開關。

4.2 寫入模式

void far setwritemode(int mode); // 0=COPY_PUT(覆蓋) 1=XOR_PUT(異或)

五、封閉圖形填充

5.1 直接繪製並填充

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);    // 橢圓扇形

5.2 填充樣式

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 點陣)。

5.3 任意封閉區域填充

void far floodfill(int x, int y, int border);

從內部點 (x,y) 向四周擴散,遇 border 色停止。注意:點在邊界/外部/非封閉區會導致溢出或錯誤填充。

六、圖形視口與頁面切換

6.1 視口

void far setviewport(x1,y1,x2,y2,clipflag); // clipflag=1 限制繪圖於視口內
void far clearviewport(void);
struct viewporttype { int left,top,right,bottom,cliplag; };

視口座標為螢幕絕對座標,原點映射至 (0,0)。

6.2 頁面動畫

void far setactivepage(int pagenum); // 繪圖目標頁
void far setvisualpage(int pagenum); // 顯示頁

僅 EGA/VGA/HERCULES 支援多頁,利用雙緩衝實現無閃爍動畫。

6.3 圖像拷貝

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。

七、圖形模式文本輸出

7.1 輸出函數

void far outtext(char far *str);
void far outtextxy(int x, int y, char far *str);

數值輸出需配合 sprintf 轉字串。

7.2 字體與對齊

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。

7.3 用戶自定義字符大小

void far setusercharsize(int mulx, int divx, int muly, int divy);

僅對筆劃字體且 charsize==0 生效,寬度乘 mulx/divx,高度乘 muly/divy。

八、經典範例精選

8.1 多窗口色彩演示

for(i=1;i<8;i++) {
    window(10+i*5,5+i,30+i*5,15+i);
    textbackground(i); clrscr();
}

8.2 3D 長方體與動態圓

bar3d(100,100,300,250,50,1);
for(i=0;i<=15;i++) { setcolor(i); circle(320,240,20+i*10); delay(100); }

8.3 箭頭多邊形

int arw[16]={200,102,300,102,300,107,330,100,300,93,300,98,200,98,200,102};
drawpoly(8, arw);

8.4 雙球碰撞動畫

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)中均有對應映射。研讀經典代碼,有助於建立從像素操作到渲染管線的完整認知鏈路。

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