




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
4.1圖形狀態(tài)顯示原理
TurboC2.0默任顯示方式為文本方式,這種顯示方式就是我們平時看到的情況。但是圖形方式和文本方式不同,在圖形方式下我們可以畫圖,它的顯示單位是像素。顯示器顯示的圖形是由一些圓點組成的(其亮度、顏色不同),這些點被稱為像素。滿屏顯示像素多少,則決定了顯示的分辨率高低,可以看出像素越小(或個數(shù)越多),則顯示的分辨率越高。像素在屏幕上的位置則由其所在的x,y坐標值決定。圖形絕對坐標系統(tǒng)
定義屏幕的左上角為原點,正x軸向右延伸,正y軸向下延伸,即x和y坐標值均為非負整數(shù),但它的最大值則由顯示器的類型和顯示方式來決定,即顯示的像素大小可以通過設(shè)置不同的顯示方式來改變。我們稱這種相對屏幕顯示的坐標叫物理坐標或絕對坐標。還有一種坐標叫相對坐標,它的參照物是圖視窗口。圖視窗口就是指在物理坐標區(qū)間又開辟一個或多個區(qū)間,在這些區(qū)間又可定義一個相對坐標系統(tǒng),這樣以后畫圖均可在此區(qū)間進行,并以相對坐標來定義位置。TurboC2.0為用戶提供了一個功能很強的畫圖軟件庫,它又被稱為Borland圖形接口(BGI),它包括圖形庫文件(graphics.lib),圖形頭文件(graphics.h)和許多圖形顯示器(圖形終端)的驅(qū)動程序。還有一些字符集的字體驅(qū)動程序。編寫圖形程序時用到的一些圖形庫函數(shù)均在graphics.lib中,執(zhí)行這些函數(shù)時,所需的有關(guān)信息則包含在graphics.h頭文件中。因此用戶在自己的畫圖源程序中必須包括graphics.h頭文件,在進行目標程序連接時,要將graphics.lib連接到自己的目標程序中去。4.1.1圖形顯示器與適配器計算機中顯示的字符和圖形均以數(shù)字形式存儲在存儲器中,而顯示器接收的是模擬信號。插在PC機插槽中的圖形卡的作用就是將要顯示的字符和圖形以數(shù)字形式存儲在卡上的視頻存儲器VRAM中,再將其變成視頻模擬信號送往相應(yīng)適配的顯示器顯示。這表明適配器在計算機主機和顯示器之間起到了信息轉(zhuǎn)換和視頻發(fā)送作用,但是由于顯示器種類不同,因而適配器種類也就不同,同樣不同適配器又可支持不同的分辨率顯示方式、文本顯示方式和顏色設(shè)置。
因此不同的適配器導致了不同的圖形模式,其中常用的適配器是主要下面三種:
1)彩色圖形適配器(CGA)
這是PC/XT等微機配用的圖形卡,它可以產(chǎn)生單色或彩色字符和圖形。在圖形方式下,TurboC2.0支持兩種分辨率供選擇:一種為高分辨方式(CGAHI),像素數(shù)為640×200,這時背景色是黑的(當然也可重新設(shè)置),前景色可供選擇,但前景色只是同一種,因而圖形只顯示兩色;另一種為中分辨顯示方式,像素數(shù)為320×200,其背景色和前景色均可由用戶選擇,但僅能顯示四種顏色。在該顯示方式下,有四種模式供選擇,即CGAC0,CGACl,CGAC2,CGAC3,它們的區(qū)別是顯示的4種顏色不同。2)增強型圖形適配器〔EGA〕
該適配器除支持CGA的四種顯示模式外,還增加了TurboC2.0稱為EGALO(EGA低分辨顯示方式,分辨率為640×200)的16色顯示方式,和640×350的EGAHI(EGA高分辨顯示方式,分辨率為640×350)的16色顯示方式。
3)視頻圖形陣列適配器(VGA)
它支持CGA和EGA的所有顯示方式,但自己還有640×480的高分辨顯示方式(VGAHI)、640×350的中分辨顯示方式(VGAMED)和640×200的低分辨顯示方式(VGALO),它們均可有16種顯示顏色可供選擇。眾多生產(chǎn)廠家推出了許多性能優(yōu)于VGA但名字各異的圖形顯示系統(tǒng),美國標準協(xié)會為此制定了主要性能標準,我們常將屬于這類的顯示適配卡統(tǒng)稱為SVGA。目前我們基本上使用的都是屬于SVGA,它也可以使用VGA卡方式進行編程。4.1.2顯示器的兩種工作方式顯示器的兩種工作方式,即文本顯示方式和圖形顯示方式。它們的主要差別是:選擇文本方式時,VRAM存放要顯示字符的ASCII碼值,并用它作為地址,然后取出字符發(fā)生器ROM(固定存儲器)中存放的相應(yīng)字符的圖像(又稱字模),變成視頻信號在顯示器屏上進行顯示。選擇圖形方式時,則要顯示的圖形的圖像直接存在VRAM中,VRAM中某地址單元存放的數(shù)就表示了相應(yīng)屏幕上某行和列上的像素及顏色。4.1.3圖形系統(tǒng)的初始化和關(guān)閉編制圖形程序時,在進入圖形方式前,首先要在程序中對使用的圖形系統(tǒng)進行初始化,即要選擇采用什么類型的適配器驅(qū)動程序,采用什么模式的圖形方式,以及該適配器驅(qū)動程序的尋找路徑名。注意所用系統(tǒng)的適配器一定要支持所選用的顯示模式,否則將出錯。當圖形系統(tǒng)初始化后,我們才可以進行畫圖操作。圖形系統(tǒng)初始化函數(shù)
TurboC2.0提供的initgraph函數(shù)可完成圖形系統(tǒng)初始化的功能。其原型是:
voidfarinitgraph(intfar*driver,intfar*mode,charfar*path_for_driver);當我們使用的存儲模式為tiny(微型)、small(小型)或medium(中型)時,不需要遠指針,因而可以將初始化函數(shù)的調(diào)用格式改成如下形式:
initgraph(&driver,&mode,””);其中驅(qū)動程序目錄路徑為空字符””時,表示在當前目錄下,參數(shù)driver是一個枚舉變量,它屬于顯示器驅(qū)動程序的枚舉類型。當我們不知道所用顯示適配器名稱時,可將driver設(shè)成DETECT,它將自動檢測所用顯示適配器類型,并將相應(yīng)的驅(qū)動程序裝入系統(tǒng),并將其最高顯示模式作為當前顯示模式,檢測到的適配器選中的顯示模式CGA4(640×200,2色即CGAHI)EGA1(640×350,16色,即EGAHI)VGA2(640×480,16色,即VGAHI)例:下面是一般畫圖程序的開始部分,它包括對圖形系統(tǒng)的初始化:#include<graphics.h>main(){intdriver=DETECT;intmode;initgraph(&driver,&mode,””);…}
在本例初始化過程中,先由DETECT檢測所用適配器類型,并將當前目錄下相應(yīng)的驅(qū)動程序裝入系統(tǒng),并采用最高分辨率顯示模式作為mode的值。
清屏和恢復顯示方式的函數(shù)清屏函數(shù)的原型是:
voidfarcleardevice(void);該函數(shù)作用范圍為整個屏幕,如果用函數(shù)setviewport定義一個圖視窗口,則可采用清除圖視窗口函數(shù),它僅清除圖視窗口區(qū)域內(nèi)的內(nèi)容,該函數(shù)的原型是:
voidfarclearviewport(void);當畫圖程序結(jié)束后,系統(tǒng)要回到文本方式,這時應(yīng)該關(guān)閉圖形系統(tǒng),關(guān)閉圖形系統(tǒng)的函數(shù)原型是:
voidfarclosegraph(void)。由于進入TurboC2.0環(huán)境編程時,即已經(jīng)進入文本方式,因而為了在畫圖程序結(jié)束后恢復原來的最初狀況,一般在畫圖程序結(jié)束前調(diào)用該函數(shù),使其恢復到文本方式。4.2繪圖基本方法4.2.1基本繪圖函數(shù)當圖形系統(tǒng)初始化后,要進行的畫圖操作均可采用缺省值作為參數(shù)的當前值。畫點函數(shù):
voidfarputpixel(intx,inty,intcolor):該函數(shù)表示在指定的x,y處畫一點,點的顏色由設(shè)置的color值來決定。
intfargetpixel(intx,inty):該函數(shù)與putpixel()相對應(yīng),它得到在(x,y)點位置上的像素的當前顏色值。
有關(guān)坐標位置的函數(shù)
voidfarmoveto(intx,inty):
該函數(shù)移動畫筆到指定的(x,y)位置;
voidfarmoverel(intdx,intdy):
該函數(shù)從現(xiàn)行位置(x,y)移到一位置增量處(x+dx,y+dx);
intfargetx(void):得到當前畫筆的x位置;
intfargety(void):得到當前畫筆的y位置;畫線函數(shù)這類函數(shù)提供了用設(shè)定的顏色從一個點到另一個點畫一條直線的功能,由于起始點的設(shè)定方法不同,因而有下面不同的畫線函數(shù):voidfarline(intx0,inty0,intx1,inty1):該函數(shù)從(x0,y0)點到(x1,y1)點畫一直線。
voidfarlineto(intx,inty);該函數(shù)從現(xiàn)行畫筆位置到(x,y)點畫一直線。
voidfarlinerel(intdx,intdy):
該函數(shù)從現(xiàn)行畫筆位置(x,y)到位置增量處(x+dx,y+dy)畫一直線。
畫矩形和條形圖函數(shù)
voidfarrectangle(intxl,inty1,intx2,inty2):該函數(shù)將以(x1,y1)為左上角,(x2,y2)為右下角畫一矩形框。voidbar(intx1,inty1,intx2,inty2):該函數(shù)將以(xl,y1)為左上角,(x2,y2)為右下角畫一實形條狀圖,沒有邊框,圖的顏色和填充模式可以設(shè)定。若沒有設(shè)定,則使用缺省模式。
voidfardrawpoly(intnumpoints,intfar*polypoints):
該函數(shù)畫一個頂點數(shù)為numpoints,各頂點坐標由polypoints給出的多邊形。
polypoints整型數(shù)組必須至少有2倍頂點數(shù)個元素。每一個頂點的坐標都定義為x,
y,并且x在前。值得注意的是當畫一個封閉的多邊形時,numpoints的值取實際多邊形的頂點數(shù)加一,并且數(shù)組polypoints中第一個點和最后一個點的坐標相同。例4-3:用drawpoly()函數(shù)畫箭頭。#include<graphics.h>#include<conio.h>main(){intgdriver,gmode,i;intarw[16]={200,102,300,102,300,107,330,100,300,93,300,98,200,98,200,102};gdriver=DETECT;initgraph(&gdriver,&gmode,"");setbkcolor(BLUE);cleardevice();setcolor(12);/*設(shè)置作圖顏色*/drawpoly(8,arw);/*畫一箭頭*/getch();closegraph();
}
例4-4:下面的程序?qū)⒂蓃ectangle函數(shù)以(100,20)為左上角,(200,50)為右下角畫一矩形,接著又由bar函數(shù)以(100,80)為左上角,(150,180)為右下角畫一實形條狀圖,用缺省顏色(白色)填充。
#include<graphics.h>main(){intdriver=DETECT;intmode,x;initgraph(&driver,&mode,””);
cleardevice();
rectangle(100,20,200,50);
bar(100,80,150,180);
getch();
closegraph();
}
畫橢圓、圓和扇形圖函數(shù)有關(guān)于角的概念,在TurboC2.0中是這樣規(guī)定的:屏的x軸方向為0度,當半徑從此處逆時針方向旋轉(zhuǎn)時,則依次是90度、180度、270度,到360度時,則和x軸正向重合,即旋轉(zhuǎn)了一周。如圖所示。
voidellipse(intx,inty,intstangle,
intendangel,intxradius,intyradius):
該函數(shù)將以(x,y)為中心,以xradius和yradius為x軸和y軸半徑,從起始角stangle開始到endangle角結(jié)束,畫一橢圓線。當stangle=0,endangle=360時,則畫出的是一個完整的橢圓,否則畫出的將是橢圓弧。角的概念voidfarcircle(intx,inty,intradius):該函數(shù)將以(x,y)為圓心,radius為半徑畫個圓。
voidfararc(intx,inty,intstangle,
intendangle,intradius):
該函數(shù)將以(x,y)為圓心,radius為半徑,從stangle為起始角開始,到endangle為結(jié)束角畫一圓弧。
voidfarpieslice(intx,inty,intstangle,
intendangle,intradius):
該函數(shù)將以(x,y)為圓心,radius為半徑,從stangle為起始角,endangle為結(jié)束角,畫一扇形圖,扇形圖的填充模式和填充顏色可以事先設(shè)定,否則以缺省模式進行。例4-5:該程序?qū)⒂胑11ipse函數(shù)畫橢圓,從中心為(320,100),起始角為0度,終止角為360度,x軸半徑為75,y軸半徑為50畫一橢圓,接著用circle函數(shù)以(320,220)為圓心,以半徑為50畫圓。然后分別用pieslice和ellipse及arc函數(shù)在下方面出了一扇形圖和橢圓弧及圓弧。#include<graphics.h>main(){intdriver=DETECT;intmode,x;initgraph(&driver,&mode,"");cleardevice();ellipse(320,100,0,360,75,50);circle(320,220,50);pieslice(320,340,30,150,50);ellipse(320,400,0,180,100,35);arc(320,400,180,360,50);getch();closegraph();}4.2.2顏色設(shè)置函數(shù)在TurboC2.0中,像素的顯示顏色,或者說畫點、畫線、填充面的顏色既可采用缺省值,也可用一些函數(shù)來設(shè)置。圖形方式下,像素有前景色和背景色之分,我們一般用如下的兩個函數(shù)來設(shè)置前景色和背景色:
voidfarsetbkcolor(intcolor):設(shè)置背景色。
voidfarsetcolor(intcolor):設(shè)置前景(作圖)色。其中color為圖形模式下顏色的規(guī)定數(shù)值,對EGA,VGA顯示器的適配器來說。另外,TURBOC2.0還提供了幾個獲得現(xiàn)行像素顏色設(shè)置情況的函數(shù)。
intfargetbkcolor(void):返回現(xiàn)行背景顏色值。
intfargetcolor(void):返回現(xiàn)行作圖顏色值。
intfargetmaxcolor(void):返回最高可用的顏色值。色值顏色名顏色色值顏色名顏色0BLACK黑8DARKGRAY深灰1BLUE藍9LIGHTBLUE淡藍2GREEN綠10LIGHTGREEN淡綠3CYAN青11LIGHTCYAN淡青4RED紅12LIGHTRED淡紅5MAGENTA洋紅13LIGHTMAGENTA淡洋紅6BROWN棕14YELLOW黃7LIGHTGRAY淺灰15WHITE白例4-6:#include<graphics.h>#include<conio.h>main(){intdriver,mode,i;driver=DETECT;registerbgidriver(EGAVGA_DRIVER);/*建立獨立圖形運行程序*/initgraph(&driver,&mode","");/*圖形初始化*/setbkcolor(0);/*設(shè)置圖形背景*/cleardevice();for(i=0;i<=15;i++){setcolor(i);/*設(shè)置不同作圖色*/circle(320,240,20+i*10);/*畫半徑不同的圓*/delay(1000);/*延遲1000毫秒*/}for(i=0;i<=15;i++){setbkcolor(i);/*設(shè)置不同背景色*/cleardevice();circle(320,240,20+i*10);delay(1000);}closegraph();}4.2.4畫線的線型函數(shù)設(shè)定線型函數(shù)
voidfarsetlinestyle(intlinestyle,
unsignedupattern,intthickness);當線的寬度參數(shù)(thickness)不設(shè)定時,取缺省值,即一個像素寬,當設(shè)定為3時,可取三個象像寬,取值見表。當線型參數(shù)(1inestyle)不設(shè)定時,取缺省值,即實線;設(shè)定時,可有5種選擇如表所列。
upattern參數(shù)只有在1inestyle取4或USERBIT_LINE時才有意義,即表示在用戶自定義線型時,該參數(shù)才有用。該參數(shù)若表示成16位二進制數(shù),則每位代表一個象素。是1的位,代表的像素用前景色顯示,是0的位,代表的像素用背景色顯示(實際沒有顯示)。符號名
值
含義
NORM_WIDTH
1
一個像素寬THICK_WIDTH
3
三個像素寬
線寬(thickness)符號名
值
含義SOLID_LINE
0
實線DOTTED_LINE
1
點線CENTER_LINE
2
中心線DASHED_LINE
3
點畫線USERBIT_LINE
4
用戶自定義線直線的形狀(linestyle)4.2.5封閉圖形的填色函數(shù)及有關(guān)畫圖函數(shù)填色函數(shù):
voidfarsetfilestyle(intpattern,intcolor);該函數(shù)將用設(shè)定的color顏色和pattern圖模式對后面畫出的輪廓圖進行填充,這些圖輪廓是由待定函數(shù)畫出的,color實際上就是調(diào)色板寄存器索引號,對VGAHI方式為0~l5,即l6色,pattern表示填充模式,可用表中的值或符號名表示。當pattern選用USER_FILL用戶自定義樣式填充時,setfillstyle函數(shù)對填充的模式和顏色不起任何作用,若要選用USER_FILL樣式填充時,可選用下面的函數(shù)。
符號名值
含義EMPTY_FILL
0
用背景色填充SOLID_FILL
1
用單色實填充LINE_FILL
2
用“一”線填充LTSLASH_FILL3
用“∥”線填充SLASH_FILL4
用粗“∥”線填充BKSLASH_FILL5
用“\\”線填充LTBKSLASH_FILL6
用粗“\\”線填充HATCH_FILL
7
用方網(wǎng)格線填充XHATCH_FILL
8
用斜網(wǎng)格線填充INTTERLEAVE_FILL9
用間隔點填充WIDE_DOT_FILL10
用稀疏點填充CLOSE_DOT_FILL11
用密集點填充USER_FILL
12
用用戶定義樣式填充填充模式(pattern)的規(guī)定
用戶自定義填充函數(shù):
voidfarsetfillpattern(char*upattefn,
intcolor);該函數(shù)設(shè)置用戶自定義可填充模式,以color指出的顏色對封閉圖形進行填充。這里的color實際上就是調(diào)色板寄存器號,也可用顏色名代替。參數(shù)upattern是一個指向8個字節(jié)存儲區(qū)的指針,這8個字節(jié)表示了一個8×8象素點陣組成的填充圖模,它是由用戶自定義的,它將用來對封閉圖形填充。8個字節(jié)的圖模是這樣形成的:每個字節(jié)代表一行,而每個字節(jié)的每一個二進制位代表該行的對應(yīng)列上的象素。是1,則用color顯示,是0則不顯示。
與填充函數(shù)有關(guān)的作圖函數(shù)
voidfarbar3d(intx1,inty1,intx2,inty2,
intdepth,inttopflag);該函數(shù)畫三維立體直方圖,當topflag非0時,畫出三維頂,否則將不畫出三維頂,depth決定了三維直方圖的長度。
viodfarsector(intx,inty,intstangle,
intendang1e,intxradius,intyradius);該函數(shù)將以(x,y)為圓心,以xradius和yradius為x軸和y軸半徑,從起始角stang1e開始到endang1e角結(jié)束,畫一橢圓扇形圖,并按設(shè)置的填充模式和顏色填充。當stang1e為0,endangle為360時,則畫出一完整的橢圓圖。voidfarfillellipse(intx,inty,intxradius,
intyradius);該函數(shù)將以(x,y)為圓心,以xradius和yradius為x軸和y軸半徑,畫一橢圓圖,并以設(shè)定或缺省模式和顏色填充。
voidfarfillpoly(intnumpoints,
intfar*polypoints);該函數(shù)將畫出一個頂點數(shù)為numpoints,各頂點坐標由polypoints給出的多邊形,也即邊數(shù)為polypoints-1,當為一封閉圖形時,numpohts應(yīng)為多邊形的頂點數(shù)加1,并且第一個頂點坐標應(yīng)和最后一個頂點的坐標相同。
例:下面程序用bar3d函數(shù)畫出了一個立方圖,并且畫面用藍色斜線填充,接著由第二個bar3d函數(shù)又在相鄰位置畫出一個沒有頂?shù)娜S圖,畫面用紅色方格填充。該函數(shù)的topflag=0。在屏幕下方,由sector函數(shù)畫出了一個不完整的橢圓,并用綠色填充,可以看出差120度就是一個完整的橢圓了。在其相鄰位置則是由fillellipse函數(shù)畫出的一個橢園,它用談紅色填充,屏幕的右上半是由fillpoly函數(shù)畫出的一個六邊圖形,被填以洋紅色,由于最初頂點坐標和最后一個頂點坐標相同(同為(420,20)),所以是一個封閉的圖形。#include<graphics.h>main(){intdriver=VGA,mode=VGAHI;structfillsettingstypesave;charsavepattern[8];intd[]={420,20,330,45,330,145,420,120,510,145,510,55,420,20};initgraph(&driver,&mode,"");getfillsettings(&save);setfillstyle(3,BLUE);bar3d(100,50,150,120,30,1);setfillstyle(HATCH_FILL,RED);bar3d(200,50,250,120,30,0);setfillstyle(1,GREEN);sector(200,300,0,250,100,40);setfillstyle(1,LIGHTRED);fillellipse(420,300,100,40);setfillstyle(1,5);fillpoly(7,d);getch();setfillstyle(save.pattern,save.color);closegraph();}
對任意封閉圖形填充的函數(shù)其原型說明為:
voidfarfloodfill(intx,inty,intborder);該函數(shù)將對一封閉圖形進行填充,其顏色和模式將由設(shè)定的或缺省的圖模與顏色決定。其中參數(shù)(x,y)為封閉圖形中的任一點,border是封閉圖形的邊框顏色。編程時該函數(shù)位于畫圖形的函數(shù)之后,即要填充該圖形。需要注意的是:若(x,y)點位于封閉圖形邊界上,該函數(shù)將不進行填充。若對不是封閉的圖形進行填充,則會填到別的地方,即會溢出。若(x,y)點在封閉圖形之外,將對封閉圖形外進行填充。由參數(shù)border指出的顏色必須與封閉圖形的輪廓線的顏色一致,否則會填到別的地方去。4.2.6圖視窗口操作函數(shù)圖視口設(shè)置函數(shù)
voidfarsetviewport(intxl,inty1,intx2,
inty2,clipflag);
其中(x1,y1)為圖視口的左上角坐標,(x2,y2)為所設(shè)置的圖視口右下角坐標,它們都是以原屏幕物理坐標為參考的。
clipflag參數(shù)若為非0,則所畫圖形超出圖視口的部分將被切除而不顯示出來。若clipflag為0,則超出圖視口的圖形部分仍將顯示出來。4.2.7圖形方式下的文本輸出函數(shù)在圖形模式下,只能用標準輸出函數(shù),如printf(),puts(),putchar()函數(shù)輸出文本到屏幕。除此之外,其它輸出函數(shù)(如窗口輸出函數(shù))都不能使用,即使是可以輸出的標準函數(shù),也只以前景色為白色,按80列,25行的文本方式輸出。為此C另外提供了一些專門用于在圖形顯示模式下的文本輸出函數(shù):
voidfarouttext(charfar*textstring):該函數(shù)在現(xiàn)行位置輸出字符串指針textstring所指的文本。
voidfarouttextxy(intx,inty,charfar*textstring):該函數(shù)輸出字符串指針textstring所指的文本在規(guī)定的(x,y)位置。其中x和y為像素坐標。
有關(guān)文本字體、字型和輸出方式的設(shè)置
voidfarsettextstyle(intfont,intdirection,intcharsize):該函數(shù)用來設(shè)置輸出字符的字形(由font確定)、輸出方向(由direction確定)和字符大小(由charsize確定)等特性。C對該函數(shù)中各個參數(shù)的規(guī)定見下列各表所示:符號常數(shù)數(shù)值含義DEFAULT_FONT08*8點陣字(缺省值)TRIPLEX_FONT1三倍筆劃字體SMALL_FONT2小號筆劃字體SANSSERIF_FONT3無襯線筆劃字體GOTHIC_FONT4黑體筆劃字font的取值符號常數(shù)數(shù)值含義HORIZ_DIR0從左到右VERT_DIR1從底到頂direction的取值符號常數(shù)或數(shù)值含義18*8點陣216*16點陣324*24點陣432*32點陣540*40點陣648*48點陣756*56點陣864*64點陣972*72點陣1080*80點陣USER_CHAR_SIZE=0用戶定義的字符大小charsize的取值
用戶對文本字符大小的設(shè)置
voidfarsetusercharsize(intmulx,intdivx,intmuly,intdivy):該函數(shù)用來設(shè)置筆劃型字和放大系數(shù),它只有在settextstyle()函數(shù)中的charsize為0(或USER_CHAR_SIZE)時才起作用,并且字體為函數(shù)settextstyle()所規(guī)定的字體。調(diào)用函數(shù)setusercharsize()后,每個顯示在屏幕上的字符都以其缺省大小乘以mulx/divx為輸出字符寬,乘以muly/divy為輸出字符高。例:#include<graphics.h>main(){intdirver,mode;driver=DETETC;initgraph(&driver,&mode,"");setbkcolor(BLUE);cleardevice();setfillstyle(1,2);/*設(shè)置填充方式*/setcolor(WHITE);/*設(shè)置白色作圖*/rectangle(100,100,330,380);floodfill(50,50,14);/*填充方框以外的區(qū)域*/setcolor(12);/*作圖色為淡紅*/settextstyle(1,0,8);/*三重筆劃字體,放大8倍*/outtextxy(120,120,"VeryGood");setusercharsize(2,1,4,1);/*水平放大2倍,垂直放大4倍*/setcolor(15);settextstyle(3,0,5);/*無襯字筆劃,放大5倍*/outtextxy(220,220,"VeryGood");setusercharsize(4,1,1,1);settextstyle(3,0,0);outtextxy(180,320,"Good");getch();closegraph();}4.3動畫技術(shù)4.3.1延遲與清屏交錯的實現(xiàn)方法這種方法利用cleardevice()和delay()函數(shù)相互配合,先畫一幅圖形,讓它延遲一段時間,然后清屏,再畫另一幅,如此反復,就形成動態(tài)效果。4.3.2動態(tài)開辟圖視窗口的方法我們還可以利用圖視口設(shè)置技術(shù)來實現(xiàn)圖視口動畫效果,具體方法是:在不同圖視口中設(shè)置同樣的圖像,然后讓圖視口沿x軸方向移動設(shè)置,這次出現(xiàn)前要清除上次圖視口的內(nèi)容,這樣就會出現(xiàn)圖像沿x軸移動的效果。也就是說,在位置動態(tài)變化,但大小不變的圖視口中(用setviewpot()函數(shù)),設(shè)置固定圖形(也可是微小變化的圖像),這樣雖呈現(xiàn)在觀察者面前的是當前圖視口位置在動態(tài)變化,但視覺上卻象是看到圖像在屏幕上動態(tài)變化一樣。4.3.3屏幕圖像存儲再放的方法在圖形方式下,除了清屏函數(shù)cleardevice()外,還有其它的對屏幕圖像操作的函數(shù),其中一類是屏幕圖像存儲和顯示函數(shù):存屏幕圖像到內(nèi)存區(qū):voidfargetimage(intx1,inty1,intx2,
inty2,voidfar*bitmap);該函數(shù)將把屏幕左上角為(x1,y1),右下角為(x2,y2)矩形區(qū)內(nèi)的圖像保存到指針bitmap指向的內(nèi)存區(qū)去。為了能開辟一個內(nèi)存緩沖區(qū),使它恰能存下所指矩形區(qū)中的圖像,則必須首先要知道所存圖像占多少字節(jié),則內(nèi)存緩沖區(qū)也可設(shè)這樣多的字節(jié),這可用下面的函數(shù)。
測定圖像所占字節(jié)數(shù)的函數(shù)unsignedfarimagesize(intx1,inty1,intx2,inty2);該函數(shù)將得到屏幕上左上角為(x1,y1),右下角為(x2,y2)矩形區(qū)內(nèi)圖像所占的字節(jié)數(shù)。
將所存圖像顯示的函數(shù)
voidfarputimage(intx1,inty1,
voidfar*bitmap,intop);
該函數(shù)將把指針bitmap指向的內(nèi)存區(qū)中所裝圖像,與屏上現(xiàn)有左上角為(xl,y1)的矩形區(qū)內(nèi)圖像進行op規(guī)定的操作參見表。該函數(shù)進行各種圖像的邏輯操作如同二進制操作一樣。符號名
值
含義
COPY_PUT
0
復制XOR_PUT
1
進行異或操作OR_PUT
2
進行或操作
AND_PUT
3
進行與操作NOT_PUT
4
進行非操作op邏輯操作結(jié)果4.3.4利用頁交替的方法對屏幕圖像操作的函數(shù),還有一類是設(shè)置顯示頁函數(shù)。我們曾在前面提到了顯示適配器的顯示存儲器VRAM,圖形方式下存儲在VRAM中的一滿屏圖像信息稱為一頁。每個頁一般為64K字節(jié),VRAM可以存儲要顯示的圖像幾個頁(視VRAM容量而定,最大可達8頁),TurboC2.0支持頁的功能有限,按在圖形方式下顯示的模式最多支持4頁(EGALO顯示方式),一般為兩頁(注意對CGA,僅有一頁),因存儲圖象的頁顯示時,一次只能顯示一頁,因此必須設(shè)定某頁為當前顯示的頁(又稱可視頁),缺省時定為0頁。
如圖所示。正在由用戶編輯圖形的頁稱為當前編輯頁(又稱激活的頁),這個頁不等于顯示頁,即若用戶不設(shè)定該頁為當前顯示頁時,在該頁上編輯的圖形將不會在屏上顯示出來。缺省時,設(shè)定0頁為當前編輯頁,即若不用下述的頁設(shè)置函數(shù)進行設(shè)置,就認定0頁既是編輯頁,又是當前顯示頁。設(shè)置激活頁和顯示頁的函數(shù)如下:voidfarsetactivepage(intpagenum);voidfarsetvisualpage(intpagenum);這兩個函數(shù)只能用于EGA、VGA等顯示適配器。前者設(shè)置由pagenum指出的頁為激活的頁,后者設(shè)置可顯示的頁。當設(shè)定了激活的頁,即編輯頁后,則程序中其后的畫圖操作均在該頁進行,若它不定為顯示頁,則其上的圖象信息并不會在屏上顯示出來。利用頁交替的方法
例:下面的程序演示了設(shè)置顯示頁函數(shù)的應(yīng)用。首先用setactivepage(1)設(shè)置l頁為編輯頁,在上面畫出一個紅色邊框、用淡綠色填充的圓,此圖并不顯示出來(因缺省時,定義0頁為可視頁)。接著又定義0頁為編輯頁并清屏(即清0頁),也定義0頁為可視頁,并在其上畫出一個用洋紅色填充的方塊,該方塊將在屏上顯示出來。接著進入do循環(huán),設(shè)置l頁為可視頁,因而其上的圓便在屏上顯示出來,方塊的圖象消失,用delay(2000)將圓圖象保持2000毫秒即2秒,當不按鍵時,下一次循環(huán)又將0頁設(shè)為可視頁,因而方塊的圖象顯示出來,圓圖象又消失。保持2秒后,又重復剛開始的過程。這樣我們就會看到:屏上同一位置洋紅色圓和淡綠色方塊交替出現(xiàn),若將delay時間變少,將會出現(xiàn)動畫的效果。#include<graphics.h>#include<dos.h>main(){inti,graphdriver,graphmode,size,page;graphdriver=DETECT;initgraph(&graphdriver,&graphmode,"");cleardevice();setactivepage(1);/*設(shè)置l頁為編輯頁*/setbkcolor(BLUE);setcolor(RED);setfillstyle(1,10);circle(130,270,30);
/*
畫圓*/
floodfill(130,270,4);/*用淡綠色填充圓*/setactivepage(0);/*設(shè)置0頁為編輯頁*/cleardevice();/*清0頁*/setfillstyle(1,5);bar(100,210,160,270);
/*畫方塊并填充洋紅色*/setvisualpage(0);/*設(shè)置0頁為可視頁*/page=1;do{setvisualpage(page);
/*
顯示設(shè)定頁的圖像*/delay(2000);
/*
延遲2000ms
*/page=1;if(page<0)page=1;}while(!kbhit());getch();closegr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 上門維修包月合同協(xié)議
- 廢舊定子銷售合同協(xié)議
- 三方合同就業(yè)協(xié)議
- 香港租房代理合同協(xié)議
- 工程款抵房屋合同協(xié)議
- 廢鐵銅鋁銷售合同協(xié)議
- 工程建設(shè)造價合同協(xié)議
- 高考日語合作合同協(xié)議
- 店面及設(shè)備轉(zhuǎn)租合同協(xié)議
- 合唱隊培訓合同協(xié)議
- 前庭大腺囊腫護理查房課件
- 高考數(shù)學刷題:全國一模套卷(12套含答案)
- 井下停送電安全工作規(guī)程
- 水利工程污水管道施工監(jiān)理實施細則
- (完整word版)Word信紙(A4橫條直接打印版)模板
- DB32/T 4443-2023 罐區(qū)內(nèi)在役危險化學品(常低壓)儲罐管理規(guī)范
- 雪球特別版:段永平投資問答錄(投資邏輯篇)
- 民航服務(wù)心理學-民航旅客的態(tài)度-課件
- 衛(wèi)輝市陳召北井煤礦礦產(chǎn)資源開采與生態(tài)修復方案
- 工程管理筆試題
- 模板支架搭拆安全風險告知卡
評論
0/150
提交評論