說明:本節(jié)教程的繪圖技術(shù)為Turboc編譯器,非VC6,請注意,Turboc編譯器下載地址見:?TC2.0
5.1 C語言圖形函數(shù)及其用法
TurboC 2.0具有70多個圖形庫函數(shù),其圖形功能極為豐富,而且用TurboC 2.0編寫和通過的程序,可以不作修改或只做很少的修改,便可以在TurboC ++或Borland C++的環(huán)境下編譯運行,所以TurboC 是一種很好的圖形設(shè)計語言。在這一節(jié)只介紹其中最常用的一部分,其余的圖形函數(shù)及用法簡介可參閱其它參考書。所有這些圖形函數(shù)均在頭文件“graphics.h”中定義,所以,凡是在程序中要調(diào)用這些圖形函數(shù),都必須在程序文件的開頭寫上文件包含命令:
#include<graphics.h>
5.2圖形系統(tǒng)管理
在一般缺省情況下,屏幕為80列、25行的文本方式。在文本方式下,所有的圖形函數(shù)均不能操作,因此在使用圖形函數(shù)繪圖之前,必須將屏幕顯示適配器設(shè)置為一種圖形模式,這就是通常所說的“圖形方式初始化”。在繪圖工作完畢之后,又要使屏幕回到文本方式,以便進行程序文件等的編輯工作。TurboC 2.0提供了14個函數(shù),來進行對圖形系統(tǒng)的控制和管理工作。
5.2.1圖形方式初始化
圖形方式初始化是通過函數(shù)initgraph來完成的。其調(diào)用格式為:
initgraph(*gdriver,*gmode,*path);
函數(shù)initgraph的功能是通過從磁盤上裝入一個圖形驅(qū)動程序來初始化圖形系統(tǒng),并將
系統(tǒng)設(shè)置為圖形方式。調(diào)用該函數(shù)須用三個參數(shù),其含義為:
①gdriver:是一個整型值,用來指定要裝入的圖形驅(qū)動程序,該值在頭文件graphics.h
中定義,見表5.1。
表5.1圖形驅(qū)動程序
??? 符號常量 | ??? 數(shù)值 |
??? DETECT
CGA MCGA EGA EGA64 EGAMONO IBM8514 HERCMONO ATT 400 VGA PC 3270 |
??? 0
1 2 3 4 5 6 7 8 9 10 |
除DETECT外,表中每一個量均對應(yīng)于一種圖形驅(qū)動程序。如果使用DETECT,則由系統(tǒng)自動檢測圖形適配器的最高分辨率模式,并裝入相應(yīng)的圖形驅(qū)動程序。
②gmode:是一個整型值,用來設(shè)置圖形顯示模式。不同的圖形驅(qū)動程序有不同的圖形顯示模式,即使是在同一個圖形驅(qū)動程序下,也可能會有幾種圖形顯示模式。圖形顯示模式?jīng)Q定了顯示的分辨率、可同時顯示的顏色的多少、調(diào)色板的設(shè)置方式以及存儲圖形的頁數(shù)。幾種不同的圖形顯示模式見表5.2。
表5.2圖形顯示模式
圖形驅(qū)動程序(gdriver) | 圖形顯示模式(gmode) | 值 | ? 分辨率 | ? 顏色數(shù) | 頁 |
???? CGA
? |
??? CGAC0
CGACl CGAC2 CGAC3 CGAHI |
0
1 2 3 4 |
? 320×200
320×200 320×200 320×200 640×200 |
??? 4
4 4 4 2 |
1
1 1 1 1 |
???? MCGA
? |
??? MCGAC0
MCGACl MCGAC2 MCGAC3 MCGAMED MCGAHI |
0
1 2 3 4 5 |
? 320×200
320×200 320×200 320×200 640×200 640×480 |
??? 4
4 4 4 2 2 |
1
1 1 1 1 1 |
???? EGA
? |
??? EGALO
EGAHI |
0
1 |
? 640×200
640×350 |
??? 16
16 |
1
2 |
???? EGA64
? |
??? EGA64LO
EGA64HI |
0
1 |
? 640×200
640×350 |
??? 16
16 |
1
1 |
???? EGAMONO | ??? EGAMONOHI | 0 | ? 640×350 | ??? 2 | 1(2) |
???? HERCMONO | ??? HERCMONOHI | 0 | ? 720×348 | ??? 2 | 2 |
???? ATT400
? |
??? ATT400C0
ATT400C1 ATT400C2 ATT400C3 ATT400MED ATT400HI |
0
1 2 3 4 5 |
? 320×200
320×200 320×200 320×200 640×200 640×400 |
??? 4
4 4 4 2 2 |
1
1 1 1 1 1 |
???? VGA
? |
??? VGALO
VGAMED VGAHI |
0
1 2 |
? 640×200
640×350 640×480 |
??? 16
16 16 |
2
2 1 |
???? PC3270 | ??? PC3270HI | 0 | ? 720×350 | ??? 2 | 1 |
???? IBM8514
? |
??? IBM8514LO
IBM8514HI |
0
1 |
? 640×480
1024×768 |
??? 256
256 |
? |
③path:是一個字符串,用來指明圖形驅(qū)動程序所在的路徑。如果驅(qū)動程序就在用戶當(dāng)前目錄下,則該參數(shù)可以為空字符串,否則應(yīng)給出具體的路徑名。一般情況下,TurboC安裝在C盤的TC目錄中,則該路徑為:C:\TC,如果寫在參數(shù)中則為:”C:\\tc”。
以上介紹了initgraph函數(shù)中的三個參數(shù)的含義。注意,前兩個參數(shù)實際上是整型指針,調(diào)用時應(yīng)加上地址運算符“&”。下面舉例說明:
假設(shè)我們在例子中使用VGA圖形驅(qū)動程序,圖形顯示模式為VGAHI,即VGA高分辯率圖形模式,分辨率為640×480。則initgraph函數(shù)的調(diào)用方式如下:
int gdriver,gmode;
gdriver=VGA;
gmode=VGAHI;
initgraph(&gdriver,&gmode,“C:\\tc”);
也可以用整型常數(shù)代替符號常數(shù),如:
int gdriver=9,gmode=2;
initgraph(&gdriver,&gmode,”C:\\tc”);
這兩種方式是等效的。
另外,還可以使用DETECT模式,由系統(tǒng)自動對硬件進行檢測,并把圖形顯示模式設(shè)
置為檢測到的驅(qū)動程序的最高分辨率。如:
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,“C:\\tc”);
5.2.2關(guān)閉圖形方式
在運行圖形程序繪圖結(jié)束后,又要回到文本方式,以進行其他工作,這時應(yīng)關(guān)閉圖形方式。關(guān)閉圖形方式要用函數(shù)closegraph。其調(diào)用格式為:
closegraph();
函數(shù)closegraph的作用是:釋放所有圖形系統(tǒng)分配的存儲區(qū),恢復(fù)到調(diào)用initgraph之前的狀態(tài)。函數(shù)closegraph不需參數(shù)。
5.3屏幕管理
TurboC 2.0提供了11個函數(shù),用于對屏幕和視圖區(qū)等進行控制管理。
5.3.1設(shè)置視圖區(qū)
在圖形模式下,可以用函數(shù)setviewport在屏幕上定義一個視圖區(qū)。視圖區(qū)相當(dāng)于一個
用于繪圖的窗口。視圖區(qū)的位置用屏幕絕對坐標(biāo)定義,并且可以把視圖區(qū)設(shè)置為裁剪和不裁剪兩種狀態(tài)。
函數(shù)setviewport的調(diào)用格式為:
setviewport(x1,y1,x2,y2,c);
函數(shù)調(diào)用中的五個參數(shù)均為整型,其中:
x1,y1:為視圖區(qū)的左上角坐標(biāo)。
x2,y2:為視圖區(qū)的右下角坐標(biāo)。
c:為裁剪狀態(tài)參數(shù)。當(dāng)c=1時,則超出視圖區(qū)的圖形部分被自動裁剪掉;當(dāng)c=0時,則對超出視圖區(qū)的圖形不作裁剪處理。
應(yīng)注意:視圖區(qū)建立以后,所有的圖形輸出坐標(biāo)都是相對于當(dāng)前視圖區(qū)的,即視圖區(qū)左上角點為坐標(biāo)(0,0)點,而與圖形在屏幕上的位置無關(guān)。
5.3.2清除視圖區(qū)
清除視圖區(qū)用函數(shù)clearviewport。它的作用是清除掉當(dāng)前的視圖區(qū),將當(dāng)前點(cp:current point)位置設(shè)置于屏幕左上角(0,0)點。所以執(zhí)行后,原先設(shè)置的視圖區(qū)將不復(fù)存在。函數(shù)的調(diào)用格式為:
clearviewport();
5.3.3清屏
清除屏幕使用函數(shù)cleardevice。它的作用是立即清除全屏幕。并將當(dāng)前點位置設(shè)置為原點(0,0)。但是其他的圖形系統(tǒng)設(shè)置將保持不變,如線型、充填模式、文本格式和模式等;如果設(shè)置了視圖區(qū),則視圖區(qū)的設(shè)置不變,包括當(dāng)前點位置設(shè)置在視圖區(qū)的左上角。
清屏函數(shù)的調(diào)用格式為:
cleardevice();
5.4繪圖函數(shù)
繪圖函數(shù)是編寫繪圖程序的基礎(chǔ),也是任何一種圖形軟件的核心內(nèi)容。從理論上來說,
用象素點幾乎可以畫出任何圖形,但畢竟是效率太低。為此,Turbo C的BGI(Borland
Graphics Interface)提供了大量的基本繪圖函數(shù),以方便圖形設(shè)計。
在用繪圖函數(shù)作圖時,要隨時注意畫圖的“當(dāng)前點位置”,它是繪圖的起始位置。也就是說,圖形總是從當(dāng)前點開始畫。畫完一個圖形后,有時當(dāng)前點的位置不變,仍在原來的位置;而有時則要把當(dāng)前點移到新的位置。此外,為了從指定位置開始作圖,有時需要先移動當(dāng)前點位置,然后再作圖。這些,在調(diào)用繪圖函數(shù)的時候要注意。
5.4.1直線類函數(shù)
用直線類函數(shù)繪制直線圖形,可以用兩種坐標(biāo):一種是絕對坐標(biāo);另一種是相對坐標(biāo)。
①line函數(shù)
用line函數(shù)可以在指定的兩點之間畫一條直線段。其調(diào)用格式為:
1ine(x1,y1,x2,y2);
參數(shù)x1,y1,x2,y2均為整型,使用絕對坐標(biāo)。其中(x1,y1)和(x2,y2)分別為直線的兩個端點坐標(biāo)。
用line函數(shù)畫線時,其當(dāng)前點的位置不變。
例如,下面的調(diào)用可在屏幕上(VGA)畫出一條對角線,
line(0,0,639,479);
如果已知三角形的三個頂點坐標(biāo)分別為:(x1,y1)、(x2,y2)和(x3,y3),則用下面的語句可以把該三點連成一個三角形:
line(x1,y1,x2,y2);
line(x2,y2,x3,y3);
line(x3,y3,x1,y1);
② lineto函數(shù)
lineto函數(shù)用于從當(dāng)前點位置到指定位置之間畫一條直線,并改變當(dāng)前點的位置。所以
執(zhí)行的結(jié)果是,在畫線到指定點的同時也把當(dāng)前點的位置移到了指定點(即直線的終點)。其調(diào)用格式為:
lineto(x,y);
參數(shù)x,y為指定點坐標(biāo),均為整型。
③ moveto函數(shù)
函數(shù)moveto用于移動當(dāng)前點位置,并不畫線。其調(diào)用格式為:
moveto(x,y);
參數(shù)x,y用于指定新的當(dāng)前點位置坐標(biāo),用整型,使用絕對坐標(biāo)。調(diào)用的結(jié)果是將當(dāng)前點位置移到點(x,y)處。例如:
moveto(40,100);
結(jié)果是將當(dāng)前點位置移到了(40,100)處。
moveto函數(shù)和lineto函數(shù)配合使用,可以在兩點之間畫直線。例如:
moveto(40,100);
lineto(200,300);
上面的語句是先把當(dāng)前點移到(40,100)處,然后從該點畫線到(200,300)處。畫線結(jié)束后,當(dāng)前點位置在(200,300)處。
用moveto函數(shù)和lineto函數(shù)結(jié)合,改寫畫上面提到的三角形的語句是這樣的:
moveto(x1,y1);
lineto(x2,y2);
lineto(x3,y3);
lineto(xl,y1);
畫圖結(jié)束,當(dāng)前點又回到點(x1,y1)處。
④linerel函數(shù)
linerel函數(shù)用相對坐標(biāo)畫線。其功能是從當(dāng)前點位置開始畫線到指定點位置,該指定點位置的坐標(biāo)不是以絕對坐標(biāo)的形式給出,而是以其相對于當(dāng)前點(即直線起點)位置的坐標(biāo)增量給出的。其調(diào)用格式為:
linerel(dx,dy);
參數(shù)dx,dy用整型,是相對于直線起點的坐標(biāo)增量。linerel函數(shù)改變當(dāng)前點位置到指定點處。
假設(shè)當(dāng)前點位置坐標(biāo)是(x,y),則
linerel(dx,dy);? 等效于
lineto(x十dx,y十dy);
⑤moverel函數(shù)
moverel函數(shù)的功能與moveto函數(shù)相似,但它使用的是相對坐標(biāo),它使當(dāng)前點位置在x和y方向上分別移動一個增量。其調(diào)用格式為:
moverel(dx,dy);
參數(shù)dx,dy為整型,是相對于當(dāng)前點位置的增量。
下面舉幾個實際的繪圖例子,來說明上面這些函數(shù)在使用上的差別:
設(shè)要過四點(160,120),(480,120),(480,360)和(160,360)畫一個矩形,用不同的函數(shù)其繪圖程序可以是:
[例程序5.1](用1ine函數(shù)畫)
#include<graphics.h>
main()
{
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,“c:\\tc”);
cleardevice();
line(160,120,480,120);
line(480,120,480,360);
line(480,360,160,360);
line(160,360,160,120);
getch();
closegraph();
}
[例程序5.2](用1ineto函數(shù)畫)
#include<graphics.h>
main()
{
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,“c:\\tc”);
cleardevice();
moveto(160,120);
lineto(480,120);
lineto(480,360);
lineto(160,360);
lineto(160,120);
getch();
closegraph();
}
[例程序5.3](用linerel函數(shù)畫)
#include<graphics.h>
main()
{
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,“c:\\tc”);
cleardevice();
moveto(160,120);
linerel(320,0);
linerel(0,240);
lincrel(-320,0);
linerel(0, -240);
getch():
closegraph();
}
以上程序中均調(diào)用了函數(shù)getch。函數(shù)getch的功能是從鍵盤無回顯地取一個字符。所
以可以從以上三個程序的進程中看出,當(dāng)程序繪圖結(jié)束后,即要執(zhí)行語句“getch();”。它等待從鍵盤輸入—個字符(即敲任意鍵),在敲任意鍵之前,圖形—直保持在屏幕上。如敲—下任意鍵,則馬上關(guān)閉圖形方式(即執(zhí)行語句closegraph();),回到文本方式。
5.4.2圓弧類函數(shù)
①circle函數(shù)
函數(shù)circle,用于以指定圓心和半徑的方式畫圓。其調(diào)用格式為:
circle(x,y,r);
參數(shù)x,y,r均為整型。其中(x,y)為指定的圓心坐標(biāo);r為圓的半徑。例如:
circle(320,240,100);
的調(diào)用結(jié)果是:以點(320,240)為圓心,以100為半徑畫—個整圓。
②arc函數(shù)
arc函數(shù)用于畫圓弧。其調(diào)用格式為:
arc(x,y,angs,ange,r);
函數(shù)調(diào)用時所需的五個參數(shù)均為整型。其中:
x,y:為圓弧所在圓的圓心坐標(biāo)。
angs、ange:分別為圓弧的起始角和終止角,單位為“度”。
r:為圓弧的半徑。
例如以下的調(diào)用:
arc(320,240,90,180,100);
的結(jié)果是以點(320,240)為圓心,100為半徑,從90度到180度畫了四分之一個圓的圓弧。
當(dāng)圓弧的起始角angs=0,終止角ange=360時,則可以畫出一個整圓。
②ellipse函數(shù)
函數(shù)ellipse用于畫橢圓弧或橢圓。其調(diào)用格式為:
ellipse(x,y,angs,ange,xr,yr);
函數(shù)的參數(shù)均為整型。其中:
x,y:為橢圓的中心坐標(biāo)。
angs,ange:分別為橢圓弧的起始角和終止角,單位為“度”。
xr,yr:分別為橢圓的水平軸半軸和垂直軸半軸。
如果angs=0,ange=360,則可以畫出一個完整的橢圓。
另外:
xr>yr:則畫出長軸為水平方向的橢圓或橢圓弧;
xr<yr:則畫出長軸為垂直方向的橢圓或橢圓弧;
xr=y(tǒng)r:則可以畫出圓或圓弧。
下面的一個例子是調(diào)用ellipse函數(shù)畫出一個橢圓群。
[例程序5.4]
#include<graphics.h>
main()
{
int a=150,b;
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,“c:\\tc”);
cleardevice();? ‘
for(b=10;b<=140;b十=10)
ellipse(320,240,0,360,a—b,b);
getch();
closegraph();
}
5.4.3多邊形
①rectangle函數(shù)
函數(shù)rectangle用于繪制矩形。其調(diào)用格式為:
rectangle(x1,y1,x2,y2);
參數(shù)x1,y1,x2,y2均為整型。
函數(shù)的功能是以點(x1,y1)為矩形的左上角點,以點(x2,y2)為矩形的右下角頂點,畫
一個正方的矩形。
上面例程序5.1中畫的矩形,可以用函數(shù)rectangle的一次調(diào)用完成:
rectangle(160,120,480,360);
②drawpoly函數(shù)
函數(shù)drawpoly可用于畫一條多邊折線。其調(diào)用格式為:
drawpoly(nps,*pxy);
它有兩個參數(shù)。第一個參數(shù)nps是一個整型數(shù)據(jù),它表示所畫多邊折線的頂點數(shù);第二個參數(shù)pxy是一個整型數(shù)組的數(shù)組名,該數(shù)組中存放了nps個頂點的坐標(biāo)值序列。
例如,有一個名為xy的數(shù)組中存放了4個頂點的坐標(biāo)為[x1,y1,x2,y2,x3,y3,x4,
y4],則調(diào)用方式為:
drawpoly(4,xy);
如果最后一個點的坐標(biāo)與第一個點的坐標(biāo)相同,則利用drawpoly函數(shù)便可以畫出一個
封閉的多邊形。此時,坐標(biāo)點的數(shù)目應(yīng)該是多邊形的頂點數(shù)加1,即讓最后一個頂點和第一個點重合。
5.5圖形屬性控制
圖形的屬性控制包括控制顏色和線型。顏色又有背景色和前景色之分。背景色指的是
屏幕的顏色,即繪圖時的底色;前景色指的是繪圖時圖形線條所用的顏色。
任何繪圖函數(shù)都是在當(dāng)前的顏色(包括背景色和前景色)和線型的狀態(tài)下進行繪圖的。
在前面所舉的四個例程序中沒有提當(dāng)前的顏色和線型,那是因為用了系統(tǒng)的缺省值。系統(tǒng)的缺省值是:背景色為黑色,前景色為白色,線型為實線。
如果繪圖時要用系統(tǒng)缺省值以外的顏色和線型,則可以利用圖形屬性控制函數(shù)另行設(shè)置。
5.5.1 setbkcolor函數(shù)
函數(shù)setbkcolor用于設(shè)置繪圖時的背景顏色。其調(diào)用格式為:
setbkcolor(color);
參數(shù)color為一個整型數(shù)據(jù),代表所取的顏色,可以用整型常數(shù),也可以用符號常數(shù),見表5.3。
表5.3
符號名 | 數(shù)值 | 顏? 色 |
BLACK
BLUE GREEN CYAN RED MAGENTA BROWN LIGHTGRAY DARKGRAY LIGHTBLUE LIGHTGREEN LIGHTCYAN LIGHTRED LIGHTMAGENTA YELLOW WHITE |
0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
黑色
藍色 綠色 青色 紅色 紫紅色 棕色 淺灰色 深灰色 淺藍色 淺綠色 淡青色 淺紅色 淡紫紅 黃色 白色 |
例如,要把背景色設(shè)置成淺藍,可以如下調(diào)用:
setbkcolor(LIGHTBLUE);
或:setbkcolor(9);
兩種調(diào)用方式,效果相同。
5.5.2 setcolor函數(shù)
函數(shù)setcolor用于設(shè)置前景顏色,即繪圖用的顏色。調(diào)用格式為:
setcolor(color);
參數(shù)color的含義和用法見setbkcolor函數(shù)。
下面的例程序可以演示16種顏色。
[例程序5.5]
#include<graphics.h>
main()
{
int cb,cf;
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,“c:\\tc”);
cleardevice();
for(cb=0;cb<=15;cb十十)
{setbkcolor(cb);
for(cf=0;cf<=15;cf十十)
{setcolor(cf);
circle(100十cf*25,240,100);}
getch();}
getch();
closegraph();}
5.5.3 setlinestyle函數(shù)
函數(shù)setlinestyle用于設(shè)置當(dāng)前繪圖所用的線型和寬度,這些設(shè)置限于對直線類圖形有
效。其調(diào)用格式如下:
setlinestyle(sty,pat,b);
該函數(shù)所用的三個參數(shù)含義如下:
·sty:為整型值,用來定義所畫直線的類型。見表5.4所示。
表中前四種為系統(tǒng)預(yù)定義的類型,第五種留給用戶自定義用。
·pat:為無符號整型數(shù)。該參數(shù)在需要用戶自定義線型時使用。如果是使用前四種系
統(tǒng)預(yù)定義的線型,則該參數(shù)可取0值。
·b:為整型數(shù),指定所畫直線的粗細,以象素為單位。見表5.5所示。
表5.4
符號名 | 數(shù)值 | 含? 義 |
SOLID_LINE
DOTTED_LINE CENTER_LINE DASHED_LINE USERBIT_LINE |
0
1 2 3 4 |
實線(缺省)
點線 中心線 虛線 用戶自定義類型 |
表5.5
??? 符號名 | 數(shù)值 | 含? 義 |
???? NORM_WIDTH
THICK_ WIDTH |
1
3 |
1個象素寬(缺省)
3個象素寬 |
當(dāng)函數(shù)setlinestyle的第—個參數(shù)為USERBIT_LINE(或4)時,可以由用戶自己定義
直線類型。此時,第三個參數(shù)的意義同前。直線的類型在第二個參數(shù)中定義,該參數(shù)是一個16位二進制碼,每一位(bit)表示一個象素,某一位置l時表示直線上相應(yīng)位置有顯示,置0時為空白。例如:
1111111111111111
16位全置l,因此是畫一條實線。而
1010101010101010
隔位置1,因此是畫一條點線。
在實際編寫程序時,一般把16位二進制數(shù)轉(zhuǎn)換為4位十六進制數(shù),每4位二進制數(shù)轉(zhuǎn)
換為1位十六進制數(shù)。故上面的兩個例子轉(zhuǎn)換為十六進制數(shù)為:FFFF和AAAA。
函數(shù)調(diào)用方法為:
setlinestyle(4,OxAAAA,1);
用這種方法,可以根據(jù)需要定義各種線型。
下面所舉的例子程序,演示了系統(tǒng)預(yù)定義的四種線型。
[例程序5.6]
#include<graphics.h>
main()
{
int i,j,c,x=50,y=50,k=1;
int gdriver=DETECT,gmode;
printf(“input color number.\n”);
scanf(“%d”,&c);
initgraph(&gdriver,&gmode,“c:\\tc”);
cleardevice();
setbkcolor(11);
setcolor(c);
for(j=1;j<=2;j十十)
{
for(i=0;i<4;i十十)
{
setlinestyle(i,0,k);
rectangle(x,y,X十210,y十80);
x=x十110;y=y(tǒng)十40;
}
k=3;
x=50;y=250;
}
getch();
closegraph();
}
5.6充填
5.6.1 setfillstyle函數(shù)
函數(shù)setfillstyle用來設(shè)置當(dāng)前充填模式和充填顏色,以便用于充填一個指定的封閉
域。其調(diào)用格式為:
setfillstyle(pattern,color);
參數(shù)pattern用于指定充填的模式。系統(tǒng)有11種預(yù)定義的模式,見表5.6所示。
表5.6
??? 符號名 | ? 數(shù)值 | ??? 含? 義 |
???? EMPTY_FILL
SOLID_FILL LINE_FILL LTSLASH_FILL SLASH_FILL BKSLASH_FILL LTBKSLASH_FILL HATCH_FILL XHATCH_FILL INTERLEAVE_FILL WINDEDOT_FILL CLOSEDOT_FILL USER_FILL |
??? 0
1 2 3 4 5 6 7 8 9 10 11 12 |
??? 用背景色充填
用指定顏色充填 用線“一”充填 用斜線充填 用粗斜線充填 用粗反斜線充填 用反斜線充填 用網(wǎng)格線充填 用斜交叉線充填 用間隔線充填 用稀疏點充填 用密集點充填 用戶自定義模式 |
第二個參數(shù)color指定充填用顏色
5.6.2 floodfill函數(shù)
函數(shù)floodfill實施對一指定區(qū)域進行充填操作,其充填模式和顏色已由setfillstyle函
數(shù)指定。其調(diào)用格式為:
floodfill(x,y,bcolor);
參數(shù)(x,y)指位于充填區(qū)域內(nèi)任意一點的坐標(biāo),該點作為充填的起始點。bcolor為充填
區(qū)域的邊界顏色。例:
setcolor(RED);
circle(320,240,150);
setfillstyle(SOLID_FILL,GREEN);
floodfill(320,240,RED);
該段程序的作用是,用紅顏色畫了一個圓,然后用綠色色塊充填該圓。
下面的例程序演示充填情況。
[例程序5.7]
#include<graphics.h>
main()
{
int i,c,x=5,y=6;
int gdriver=DETECT,gmode;
printf(“input color number.\n”);
scanf(“%d”,&c);
initgraph(&gdriver,&gmode,”c:\\tc”);
cleardevice();
setbkcolor(9);
for(i=c;i<c十8;i十十)
{
setcolor(i);
rectangle(x,y,x十140,y十104);
x=x十70;y=y(tǒng)十52;
setfillstyle(1,i);
floodfill(x,y,i);}
getch();
closegraph();
}
5.6.3其它充填函數(shù)
以下所列的幾個充填函數(shù),均須事先由函數(shù)setfillstyle指定當(dāng)前的充填模式和顏色。
① fillellipse函數(shù)
函數(shù)fillellipse用于畫一個充填的實橢圓,用當(dāng)前顏色畫出邊線。其調(diào)用格式為:
fillellipse(x,y,rx,ry);
四個參數(shù)均為整型,其中:
x,y:為橢圓的中心坐標(biāo)。
rx,ry:分別為橢圓的水平和垂直半軸長。
②sector函數(shù)
函數(shù)sector用于畫一個充填的橢圓扇區(qū),用當(dāng)前顏色畫出邊線。其調(diào)用格式為:
sector(x,y,angs,ange,rx,ry);
參數(shù)使用說明參閱函數(shù)ellipse。
③fillpoly函數(shù)
函數(shù)fillpoly用于畫并充填一個多邊形(必須利用首末兩點重合以確保多邊形封閉),邊
線用當(dāng)前顏色畫出。其調(diào)用格式為:
fillpoly(nps,*pxy);
函數(shù)的參數(shù)說明參閱前面的drawpoly函數(shù)。
5.7圖形方式下的文本
5.7.1 BGI字體
在圖形方式下,BGI提供了兩種輸出文本的方式:一種是位映象字符(或稱點陣字符);
另一種是筆劃字體(或稱矢量字符)。其中位映象字符為缺省方式,即在一般情況下輸出文本時,都是以位映象字符顯示的。
筆劃字體不是以位模式表示的,每個字符被定義成一系列的線段或筆劃的組合。筆劃字體可以靈活地改變其大小,而且不會降低其分辨率。系統(tǒng)提供了4種不同的筆劃字體,即:小號字體、三倍字體、無襯線字體和黑體(哥特字體)。每種筆劃字體都存放在獨立的字體文件中,文件擴展名為.chr,在一般情況下,安裝在bgi目錄下。為了使用筆劃字體,必須裝入相應(yīng)的字體文件。
5.7.2文本輸出
①settextstyle函數(shù)
函數(shù)settextstyle用于在使用筆劃字體之前裝入字體文件。其調(diào)用格式為:
settextstyle(font,direction,csize);
函數(shù)所需的三個參數(shù),其含義如下:
.font:是一個整型數(shù),用來指定所使用的字體,其取值見表5.7。
表5.7
符號名 | 數(shù)值 | 含? 義 |
DEFAULT_ FONT
TRIPLEX_FONT SMALL_FONT SANSSERIF_FONT GOTHIC_FONT |
0
1 2 3 4 |
8×8位圖字體(缺省)
三重矢量字體 小號矢量字體 無襯線矢量字體 哥特矢量字體 |
.direction:? 是一個整型數(shù)。用來指定文本的輸出方向,取值見表5.8。
表5.8
符號名 | 數(shù)值 | 含? 義 |
HORIZ _DIR
VERT_DIR |
0
1 |
從左到右輸出(缺省)
從上到下輸出 |
·csize:是一個整型數(shù),表示字符的大小。該參數(shù)實際上是—個放大系數(shù),它表示對8×8點陣的放大倍數(shù),其取值的范圍是1一10,它既影響點陣字符,也影響筆劃字體。
調(diào)用settextstyle函數(shù)后,設(shè)置了輸出字符的字體、輸出方向及大小,這些設(shè)置將影響下
面的outtext和outtextxy所產(chǎn)生的文本輸出。
C語言研究中心(www.sztianhecheng.cn)