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

Turbo C 圖形函數進階(二):填充模式、任意區域填充、視窗操作與文字輸出

     編輯:關於C語言

前言

承接基礎繪圖,本文深入講解 Turbo C 圖形庫的填充風格設定、用戶自定義填充圖樣、任意封閉區域填充、視窗/頁面管理、圖像緩衝區操作,以及圖形模式下的文字輸出與字體控制。

一、填充風格與圖樣完整指南

1. 預定義填充風格 setfillstyle

void far setfillstyle(int pattern, int color);

符號常數值效果
EMPTY_FILL0背景色填充(實心挖空)
SOLID_FILL1實心填充
LINE_FILL2直線填充
LTSLASH_FILL3細斜線 (陰影)
SLASH_FILL4粗斜線
BKSLASH_FILL5粗反斜線
LTBKSLASH_FILL6細反斜線
HATCH_FILL7直角網格
XHATCH_FILL8斜向網格
INTERLEAVE_FILL9間隔點
WIDE_DOT_FILL10稀疏點
CLOSE_DOT_FILL11密集點
USER_FILL12用戶自定義 (配合 setfillpattern)

注意:選用 USER_FILL 時,setfillstyle 不改變當前填充圖樣與顏色,僅用於查詢狀態。

2. 用戶自定義 8×8 填充圖樣 setfillpattern

void far setfillpattern(char far *upattern, int color);

  • upattern 指向 8 字節緩衝區,每字節 8 位對應橫向 8 像素,共 8 行構成 8×8 點陣。
  • 該圖樣作為磚塊重複鋪滿填充區域。

3. 狀態查詢函數

  • getfillpattern(char far *upattern):取得當前用戶填充圖樣。
  • getfillsettings(struct fillsettingstype far *fillinfo):取得當前填充模式與顏色。結構定義:{ int pattern; int color; }。

4. 綜合範例:12 種風格輪播 + 用戶圖樣

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

二、任意封閉區域填充 floodfill

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

  • (x,y):區域內任意種子點。
  • border:邊界線顏色(必須與實際繪圖顏色完全一致)。
  • 以當前填充風格/顏色從種子點向四周擴散,遇邊界色停止。

四大陷阱:

  1. 種子點在邊界上 → 不填充。
  2. 圖形未封閉 → 色彩外溢污染螢幕。
  3. 種子點在圖形外 → 填充背景而非目標區域。
  4. 填充色可任意,但邊界色必須精確匹配。

範例:補充 bar3d 未填充的兩個側面,及矩形填充。

三、視窗與頁面管理

1. 圖形視窗 setviewport

void 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}。

特性:視窗背景色與全螢幕共享;可建立多視窗但同一時刻僅有一個作用中視窗。

2. 多頁雙緩衝動畫 setactivepage/setvisualpage

僅支援 EGA/VGA/Hercule 適配器。
setactivepage(p) 選擇繪圖目標頁(不一定可見),
setvisualpage(p) 切換顯示頁。
交替繪製/顯示可實現無閃爍動畫。

3. 圖像緩衝區操作

  • 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_PUT0直接覆蓋
XOR_PUT1與螢幕異或(可刪除軌跡)
OR_PUT2與螢幕或運算
AND_PUT3與螢幕與運算
NOT_PUT4繪製反相圖像

動畫範例:雙球碰撞模擬,利用 getimage 捕捉球體,putimage(COPY_PUT) 移動繪製。

四、圖形模式文字輸出系統

1. 基礎輸出函數

  • outtext(char far *str):當前圖形游標位置輸出。
  • outtextxy(int x, int y, char far *str):指定像素座標輸出。
  • 數值需先用 sprintf(buf, fmt, ...) 格式化為字串再輸出。

2. 文字對齊 settextjustify

控制字串矩形相對 (x,y) 的錨點位置(9 種組合)。

3. 字體風格 settextstyle

void far settextstyle(int font, int direction, int charsize);

常數值方向
LEFT_TEXT0水平
CENTER_TEXT1水平/垂直
RIGHT_TEXT2水平
BOTTOM_TEXT0垂直
TOP_TEXT2垂直
參數常數範例說明
fontDEFAULT_FONT(0) 8×8 點陣、TRIPLEX_FONT(1) 三倍筆劃、SMALL_FONT(2)、SANSSERIF_FONT(3)、GOTHIC_FONT(4)字體類型
directionHORIZ_DIR(0) 左→右、VERT_DIR(1) 底→頂輸出方向
charsize1~10 對應 8×8 ~ 80×80 點陣放大倍數,USER_CHAR_SIZE(0) 配合 setusercharsize字符大小

4. 用戶自定義字符縱橫比 setusercharsize

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

  • 僅在 charsize=USER_CHAR_SIZE(0) 且為筆劃字體時生效。
  • 實際寬度 = 默認寬 × mulx/divx,高度 = 默認高 × muly/divy。
  • 可實現文字扁平化、拉長等非等比縮放。

5. 綜合範例

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 構建具備專業視覺效果的圖形應用(選單、儀表板、簡易遊戲、教學演示等)。

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