承接基礎繪圖,本文深入講解 Turbo C 圖形庫的填充風格設定、用戶自定義填充圖樣、任意封閉區域填充、視窗/頁面管理、圖像緩衝區操作,以及圖形模式下的文字輸出與字體控制。
setfillstylevoid far setfillstyle(int pattern, int color);
| 符號常數 | 值 | 效果 |
|---|---|---|
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) |
注意:選用 USER_FILL 時,setfillstyle 不改變當前填充圖樣與顏色,僅用於查詢狀態。
setfillpatternvoid far setfillpattern(char far *upattern, int color);
upattern 指向 8 字節緩衝區,每字節 8 位對應橫向 8 像素,共 8 行構成 8×8 點陣。getfillpattern(char far *upattern):取得當前用戶填充圖樣。getfillsettings(struct fillsettingstype far *fillinfo):取得當前填充模式與顏色。結構定義:{ int pattern; int color; }。char usr[8] = {10,20,30,40,50,60,70,80};
for(i=0;i<13;i++) {
setcolor(i+3);
setfillstyle(i, 2+i);
bar(100,150,200,50);
bar3d(300,100,500,200,70,1);
pieslice(200,300,90,180,90);
sector(500,300,180,270,200,100);
delay(1000);
}
setfillpattern(usr, RED); // 切換用戶圖樣
// 再次繪製上述圖形...
getfillsettings(&save);
printf("Pattern=%d, Color=%d", save.pattern, save.color);
floodfillvoid far floodfill(int x, int y, int border);
(x,y):區域內任意種子點。border:邊界線顏色(必須與實際繪圖顏色完全一致)。四大陷阱:
範例:補充 bar3d 未填充的兩個側面,及矩形填充。
setviewportvoid far setviewport(int x1,int y1,int x2,int y2,int clipflag);
(x1,y1)、(x2,y2) 為對角的裁剪視窗,原點映射至視窗左上角。clipflag!=0:視窗外不可繪製;=0:允許繪製至視窗外。clearviewport() 僅清除視窗內容。getviewsettings 取得 viewporttype {left,top,right,bottom,cliplag}。特性:視窗背景色與全螢幕共享;可建立多視窗但同一時刻僅有一個作用中視窗。
setactivepage/setvisualpage僅支援 EGA/VGA/Hercule 適配器。
setactivepage(p) 選擇繪圖目標頁(不一定可見),
setvisualpage(p) 切換顯示頁。
交替繪製/顯示可實現無閃爍動畫。
imagesize(x1,y1,x2,y2):計算區域所需位元組數(<64KB,否則回傳 -1)。getimage(x1,y1,x2,y2, void far *buf):將螢幕區域複製到記憶體緩衝區。putimage(x,y, void *buf, int op):將緩衝區繪製到 (x,y),op 決定混合模式:| 常數 | 值 | 效果 |
|---|---|---|
COPY_PUT | 0 | 直接覆蓋 |
XOR_PUT | 1 | 與螢幕異或(可刪除軌跡) |
OR_PUT | 2 | 與螢幕或運算 |
AND_PUT | 3 | 與螢幕與運算 |
NOT_PUT | 4 | 繪製反相圖像 |
動畫範例:雙球碰撞模擬,利用 getimage 捕捉球體,putimage(COPY_PUT) 移動繪製。
outtext(char far *str):當前圖形游標位置輸出。outtextxy(int x, int y, char far *str):指定像素座標輸出。sprintf(buf, fmt, ...) 格式化為字串再輸出。settextjustify控制字串矩形相對 (x,y) 的錨點位置(9 種組合)。
| 常數 | 值 | 方向 |
|---|---|---|
LEFT_TEXT | 0 | 水平 |
CENTER_TEXT | 1 | 水平/垂直 |
RIGHT_TEXT | 2 | 水平 |
BOTTOM_TEXT | 0 | 垂直 |
TOP_TEXT | 2 | 垂直 |
| 參數 | 常數範例 | 說明 |
|---|---|---|
| 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 點陣放大倍數,USER_CHAR_SIZE(0) 配合 setusercharsize | 字符大小 |
setusercharsizevoid far setusercharsize(int mulx, int divx, int muly, int divy);
charsize=USER_CHAR_SIZE(0) 且為筆劃字體時生效。mulx/divx,高度 = 默認高 × muly/divy。setviewport(100,100,540,380,1);
setfillstyle(1,2); setcolor(YELLOW);
rectangle(0,0,439,279); floodfill(50,50,14);
settextstyle(1,0,8); outtextxy(20,20,"Good Better");
settextstyle(3,0,5); outtextxy(120,120,"Good Better");
sprintf(s,"Your score is %d",620);
settextstyle(2,0,8); outtextxy(30,200,s);
settextstyle(4,0,3); outtextxy(70,240,s);
掌握填充風格、任意區域填充、視窗裁剪、多頁雙緩衝、圖像緩衝區與豐富的文字輸出控制,即可在 Turbo C 構建具備專業視覺效果的圖形應用(選單、儀表板、簡易遊戲、教學演示等)。