C語言實(shí)踐教程課件第4章課件_第1頁
C語言實(shí)踐教程課件第4章課件_第2頁
C語言實(shí)踐教程課件第4章課件_第3頁
C語言實(shí)踐教程課件第4章課件_第4頁
C語言實(shí)踐教程課件第4章課件_第5頁
已閱讀5頁,還剩57頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

4.1圖形狀態(tài)顯示原理

TurboC2.0默任顯示方式為文本方式,這種顯示方式就是我們平時(shí)看到的情況。但是圖形方式和文本方式不同,在圖形方式下我們可以畫圖,它的顯示單位是像素。顯示器顯示的圖形是由一些圓點(diǎn)組成的(其亮度、顏色不同),這些點(diǎn)被稱為像素。滿屏顯示像素多少,則決定了顯示的分辨率高低,可以看出像素越小(或個(gè)數(shù)越多),則顯示的分辨率越高。像素在屏幕上的位置則由其所在的x,y坐標(biāo)值決定。圖形絕對坐標(biāo)系統(tǒng)

定義屏幕的左上角為原點(diǎn),正x軸向右延伸,正y軸向下延伸,即x和y坐標(biāo)值均為非負(fù)整數(shù),但它的最大值則由顯示器的類型和顯示方式來決定,即顯示的像素大小可以通過設(shè)置不同的顯示方式來改變。我們稱這種相對屏幕顯示的坐標(biāo)叫物理坐標(biāo)或絕對坐標(biāo)。還有一種坐標(biāo)叫相對坐標(biāo),它的參照物是圖視窗口。圖視窗口就是指在物理坐標(biāo)區(qū)間又開辟一個(gè)或多個(gè)區(qū)間,在這些區(qū)間又可定義一個(gè)相對坐標(biāo)系統(tǒng),這樣以后畫圖均可在此區(qū)間進(jìn)行,并以相對坐標(biāo)來定義位置。TurboC2.0為用戶提供了一個(gè)功能很強(qiáng)的畫圖軟件庫,它又被稱為Borland圖形接口(BGI),它包括圖形庫文件(graphics.lib),圖形頭文件(graphics.h)和許多圖形顯示器(圖形終端)的驅(qū)動(dòng)程序。還有一些字符集的字體驅(qū)動(dòng)程序。編寫圖形程序時(shí)用到的一些圖形庫函數(shù)均在graphics.lib中,執(zhí)行這些函數(shù)時(shí),所需的有關(guān)信息則包含在graphics.h頭文件中。因此用戶在自己的畫圖源程序中必須包括graphics.h頭文件,在進(jìn)行目標(biāo)程序連接時(shí),要將graphics.lib連接到自己的目標(biāo)程序中去。4.1.1圖形顯示器與適配器計(jì)算機(jī)中顯示的字符和圖形均以數(shù)字形式存儲(chǔ)在存儲(chǔ)器中,而顯示器接收的是模擬信號(hào)。插在PC機(jī)插槽中的圖形卡的作用就是將要顯示的字符和圖形以數(shù)字形式存儲(chǔ)在卡上的視頻存儲(chǔ)器VRAM中,再將其變成視頻模擬信號(hào)送往相應(yīng)適配的顯示器顯示。這表明適配器在計(jì)算機(jī)主機(jī)和顯示器之間起到了信息轉(zhuǎn)換和視頻發(fā)送作用,但是由于顯示器種類不同,因而適配器種類也就不同,同樣不同適配器又可支持不同的分辨率顯示方式、文本顯示方式和顏色設(shè)置。

因此不同的適配器導(dǎo)致了不同的圖形模式,其中常用的適配器是主要下面三種:

1)彩色圖形適配器(CGA)

這是PC/XT等微機(jī)配用的圖形卡,它可以產(chǎn)生單色或彩色字符和圖形。在圖形方式下,TurboC2.0支持兩種分辨率供選擇:一種為高分辨方式(CGAHI),像素?cái)?shù)為640×200,這時(shí)背景色是黑的(當(dāng)然也可重新設(shè)置),前景色可供選擇,但前景色只是同一種,因而圖形只顯示兩色;另一種為中分辨顯示方式,像素?cái)?shù)為320×200,其背景色和前景色均可由用戶選擇,但僅能顯示四種顏色。在該顯示方式下,有四種模式供選擇,即CGAC0,CGACl,CGAC2,CGAC3,它們的區(qū)別是顯示的4種顏色不同。2)增強(qiáng)型圖形適配器〔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),美國標(biāo)準(zhǔn)協(xié)會(huì)為此制定了主要性能標(biāo)準(zhǔn),我們常將屬于這類的顯示適配卡統(tǒng)稱為SVGA。目前我們基本上使用的都是屬于SVGA,它也可以使用VGA卡方式進(jìn)行編程。4.1.2顯示器的兩種工作方式顯示器的兩種工作方式,即文本顯示方式和圖形顯示方式。它們的主要差別是:選擇文本方式時(shí),VRAM存放要顯示字符的ASCII碼值,并用它作為地址,然后取出字符發(fā)生器ROM(固定存儲(chǔ)器)中存放的相應(yīng)字符的圖像(又稱字模),變成視頻信號(hào)在顯示器屏上進(jìn)行顯示。選擇圖形方式時(shí),則要顯示的圖形的圖像直接存在VRAM中,VRAM中某地址單元存放的數(shù)就表示了相應(yīng)屏幕上某行和列上的像素及顏色。4.1.3圖形系統(tǒng)的初始化和關(guān)閉編制圖形程序時(shí),在進(jìn)入圖形方式前,首先要在程序中對使用的圖形系統(tǒng)進(jìn)行初始化,即要選擇采用什么類型的適配器驅(qū)動(dòng)程序,采用什么模式的圖形方式,以及該適配器驅(qū)動(dòng)程序的尋找路徑名。注意所用系統(tǒng)的適配器一定要支持所選用的顯示模式,否則將出錯(cuò)。當(dāng)圖形系統(tǒng)初始化后,我們才可以進(jìn)行畫圖操作。圖形系統(tǒng)初始化函數(shù)

TurboC2.0提供的initgraph函數(shù)可完成圖形系統(tǒng)初始化的功能。其原型是:

voidfarinitgraph(intfar*driver,intfar*mode,charfar*path_for_driver);當(dāng)我們使用的存儲(chǔ)模式為tiny(微型)、small(小型)或medium(中型)時(shí),不需要遠(yuǎn)指針,因而可以將初始化函數(shù)的調(diào)用格式改成如下形式:

initgraph(&driver,&mode,””);其中驅(qū)動(dòng)程序目錄路徑為空字符””時(shí),表示在當(dāng)前目錄下,參數(shù)driver是一個(gè)枚舉變量,它屬于顯示器驅(qū)動(dòng)程序的枚舉類型。當(dāng)我們不知道所用顯示適配器名稱時(shí),可將driver設(shè)成DETECT,它將自動(dòng)檢測所用顯示適配器類型,并將相應(yīng)的驅(qū)動(dòng)程序裝入系統(tǒng),并將其最高顯示模式作為當(dā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檢測所用適配器類型,并將當(dāng)前目錄下相應(yīng)的驅(qū)動(dòng)程序裝入系統(tǒng),并采用最高分辨率顯示模式作為mode的值。

清屏和恢復(fù)顯示方式的函數(shù)清屏函數(shù)的原型是:

voidfarcleardevice(void);該函數(shù)作用范圍為整個(gè)屏幕,如果用函數(shù)setviewport定義一個(gè)圖視窗口,則可采用清除圖視窗口函數(shù),它僅清除圖視窗口區(qū)域內(nèi)的內(nèi)容,該函數(shù)的原型是:

voidfarclearviewport(void);當(dāng)畫圖程序結(jié)束后,系統(tǒng)要回到文本方式,這時(shí)應(yīng)該關(guān)閉圖形系統(tǒng),關(guān)閉圖形系統(tǒng)的函數(shù)原型是:

voidfarclosegraph(void)。由于進(jìn)入TurboC2.0環(huán)境編程時(shí),即已經(jīng)進(jìn)入文本方式,因而為了在畫圖程序結(jié)束后恢復(fù)原來的最初狀況,一般在畫圖程序結(jié)束前調(diào)用該函數(shù),使其恢復(fù)到文本方式。4.2繪圖基本方法4.2.1基本繪圖函數(shù)當(dāng)圖形系統(tǒng)初始化后,要進(jìn)行的畫圖操作均可采用缺省值作為參數(shù)的當(dāng)前值。畫點(diǎn)函數(shù):

voidfarputpixel(intx,inty,intcolor):該函數(shù)表示在指定的x,y處畫一點(diǎn),點(diǎn)的顏色由設(shè)置的color值來決定。

intfargetpixel(intx,inty):該函數(shù)與putpixel()相對應(yīng),它得到在(x,y)點(diǎn)位置上的像素的當(dāng)前顏色值。

有關(guān)坐標(biāo)位置的函數(shù)

voidfarmoveto(intx,inty):

該函數(shù)移動(dòng)畫筆到指定的(x,y)位置;

voidfarmoverel(intdx,intdy):

該函數(shù)從現(xiàn)行位置(x,y)移到一位置增量處(x+dx,y+dx);

intfargetx(void):得到當(dāng)前畫筆的x位置;

intfargety(void):得到當(dāng)前畫筆的y位置;畫線函數(shù)這類函數(shù)提供了用設(shè)定的顏色從一個(gè)點(diǎn)到另一個(gè)點(diǎn)畫一條直線的功能,由于起始點(diǎn)的設(shè)定方法不同,因而有下面不同的畫線函數(shù):voidfarline(intx0,inty0,intx1,inty1):該函數(shù)從(x0,y0)點(diǎn)到(x1,y1)點(diǎn)畫一直線。

voidfarlineto(intx,inty);該函數(shù)從現(xiàn)行畫筆位置到(x,y)點(diǎn)畫一直線。

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è)定。若沒有設(shè)定,則使用缺省模式。

voidfardrawpoly(intnumpoints,intfar*polypoints):

該函數(shù)畫一個(gè)頂點(diǎn)數(shù)為numpoints,各頂點(diǎn)坐標(biāo)由polypoints給出的多邊形。

polypoints整型數(shù)組必須至少有2倍頂點(diǎn)數(shù)個(gè)元素。每一個(gè)頂點(diǎn)的坐標(biāo)都定義為x,

y,并且x在前。值得注意的是當(dāng)畫一個(gè)封閉的多邊形時(shí),numpoints的值取實(shí)際多邊形的頂點(diǎn)數(shù)加一,并且數(shù)組polypoints中第一個(gè)點(diǎn)和最后一個(gè)點(diǎn)的坐標(biāo)相同。例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)為右下角畫一實(shí)形條狀圖,用缺省顏色(白色)填充。

#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軸方向?yàn)?度,當(dāng)半徑從此處逆時(shí)針方向旋轉(zhuǎn)時(shí),則依次是90度、180度、270度,到360度時(shí),則和x軸正向重合,即旋轉(zhuǎn)了一周。如圖所示。

voidellipse(intx,inty,intstangle,

intendangel,intxradius,intyradius):

該函數(shù)將以(x,y)為中心,以xradius和yradius為x軸和y軸半徑,從起始角stangle開始到endangle角結(jié)束,畫一橢圓線。當(dāng)stangle=0,endangle=360時(shí),則畫出的是一個(gè)完整的橢圓,否則畫出的將是橢圓弧。角的概念voidfarcircle(intx,inty,intradius):該函數(shù)將以(x,y)為圓心,radius為半徑畫個(gè)圓。

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è)定,否則以缺省模式進(jìn)行。例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中,像素的顯示顏色,或者說畫點(diǎn)、畫線、填充面的顏色既可采用缺省值,也可用一些函數(shù)來設(shè)置。圖形方式下,像素有前景色和背景色之分,我們一般用如下的兩個(gè)函數(shù)來設(shè)置前景色和背景色:

voidfarsetbkcolor(intcolor):設(shè)置背景色。

voidfarsetcolor(intcolor):設(shè)置前景(作圖)色。其中color為圖形模式下顏色的規(guī)定數(shù)值,對EGA,VGA顯示器的適配器來說。另外,TURBOC2.0還提供了幾個(gè)獲得現(xiàn)行像素顏色設(shè)置情況的函數(shù)。

intfargetbkcolor(void):返回現(xiàn)行背景顏色值。

intfargetcolor(void):返回現(xiàn)行作圖顏色值。

intfargetmaxcolor(void):返回最高可用的顏色值。色值顏色名顏色色值顏色名顏色0BLACK黑8DARKGRAY深灰1BLUE藍(lán)9LIGHTBLUE淡藍(lán)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);/*建立獨(dú)立圖形運(yùn)行程序*/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);當(dāng)線的寬度參數(shù)(thickness)不設(shè)定時(shí),取缺省值,即一個(gè)像素寬,當(dāng)設(shè)定為3時(shí),可取三個(gè)象像寬,取值見表。當(dāng)線型參數(shù)(1inestyle)不設(shè)定時(shí),取缺省值,即實(shí)線;設(shè)定時(shí),可有5種選擇如表所列。

upattern參數(shù)只有在1inestyle取4或USERBIT_LINE時(shí)才有意義,即表示在用戶自定義線型時(shí),該參數(shù)才有用。該參數(shù)若表示成16位二進(jìn)制數(shù),則每位代表一個(gè)象素。是1的位,代表的像素用前景色顯示,是0的位,代表的像素用背景色顯示(實(shí)際沒有顯示)。符號(hào)名

含義

NORM_WIDTH

1

一個(gè)像素寬THICK_WIDTH

3

三個(gè)像素寬

線寬(thickness)符號(hào)名

含義SOLID_LINE

0

實(shí)線DOTTED_LINE

1

點(diǎn)線CENTER_LINE

2

中心線DASHED_LINE

3

點(diǎn)畫線USERBIT_LINE

4

用戶自定義線直線的形狀(linestyle)4.2.5封閉圖形的填色函數(shù)及有關(guān)畫圖函數(shù)填色函數(shù):

voidfarsetfilestyle(intpattern,intcolor);該函數(shù)將用設(shè)定的color顏色和pattern圖模式對后面畫出的輪廓圖進(jìn)行填充,這些圖輪廓是由待定函數(shù)畫出的,color實(shí)際上就是調(diào)色板寄存器索引號(hào),對VGAHI方式為0~l5,即l6色,pattern表示填充模式,可用表中的值或符號(hào)名表示。當(dāng)pattern選用USER_FILL用戶自定義樣式填充時(shí),setfillstyle函數(shù)對填充的模式和顏色不起任何作用,若要選用USER_FILL樣式填充時(shí),可選用下面的函數(shù)。

符號(hào)名值

含義EMPTY_FILL

0

用背景色填充SOLID_FILL

1

用單色實(shí)填充LINE_FILL

2

用“一”線填充LTSLASH_FILL3

用“∥”線填充SLASH_FILL4

用粗“∥”線填充BKSLASH_FILL5

用“\\”線填充LTBKSLASH_FILL6

用粗“\\”線填充HATCH_FILL

7

用方網(wǎng)格線填充XHATCH_FILL

8

用斜網(wǎng)格線填充INTTERLEAVE_FILL9

用間隔點(diǎn)填充WIDE_DOT_FILL10

用稀疏點(diǎn)填充CLOSE_DOT_FILL11

用密集點(diǎn)填充USER_FILL

12

用用戶定義樣式填充填充模式(pattern)的規(guī)定

用戶自定義填充函數(shù):

voidfarsetfillpattern(char*upattefn,

intcolor);該函數(shù)設(shè)置用戶自定義可填充模式,以color指出的顏色對封閉圖形進(jìn)行填充。這里的color實(shí)際上就是調(diào)色板寄存器號(hào),也可用顏色名代替。參數(shù)upattern是一個(gè)指向8個(gè)字節(jié)存儲(chǔ)區(qū)的指針,這8個(gè)字節(jié)表示了一個(gè)8×8象素點(diǎn)陣組成的填充圖模,它是由用戶自定義的,它將用來對封閉圖形填充。8個(gè)字節(jié)的圖模是這樣形成的:每個(gè)字節(jié)代表一行,而每個(gè)字節(jié)的每一個(gè)二進(jìn)制位代表該行的對應(yīng)列上的象素。是1,則用color顯示,是0則不顯示。

與填充函數(shù)有關(guān)的作圖函數(shù)

voidfarbar3d(intx1,inty1,intx2,inty2,

intdepth,inttopflag);該函數(shù)畫三維立體直方圖,當(dāng)topflag非0時(shí),畫出三維頂,否則將不畫出三維頂,depth決定了三維直方圖的長度。

viodfarsector(intx,inty,intstangle,

intendang1e,intxradius,intyradius);該函數(shù)將以(x,y)為圓心,以xradius和yradius為x軸和y軸半徑,從起始角stang1e開始到endang1e角結(jié)束,畫一橢圓扇形圖,并按設(shè)置的填充模式和顏色填充。當(dāng)stang1e為0,endangle為360時(shí),則畫出一完整的橢圓圖。voidfarfillellipse(intx,inty,intxradius,

intyradius);該函數(shù)將以(x,y)為圓心,以xradius和yradius為x軸和y軸半徑,畫一橢圓圖,并以設(shè)定或缺省模式和顏色填充。

voidfarfillpoly(intnumpoints,

intfar*polypoints);該函數(shù)將畫出一個(gè)頂點(diǎn)數(shù)為numpoints,各頂點(diǎn)坐標(biāo)由polypoints給出的多邊形,也即邊數(shù)為polypoints-1,當(dāng)為一封閉圖形時(shí),numpohts應(yīng)為多邊形的頂點(diǎn)數(shù)加1,并且第一個(gè)頂點(diǎn)坐標(biāo)應(yīng)和最后一個(gè)頂點(diǎn)的坐標(biāo)相同。

例:下面程序用bar3d函數(shù)畫出了一個(gè)立方圖,并且畫面用藍(lán)色斜線填充,接著由第二個(gè)bar3d函數(shù)又在相鄰位置畫出一個(gè)沒有頂?shù)娜S圖,畫面用紅色方格填充。該函數(shù)的topflag=0。在屏幕下方,由sector函數(shù)畫出了一個(gè)不完整的橢圓,并用綠色填充,可以看出差120度就是一個(gè)完整的橢圓了。在其相鄰位置則是由fillellipse函數(shù)畫出的一個(gè)橢園,它用談紅色填充,屏幕的右上半是由fillpoly函數(shù)畫出的一個(gè)六邊圖形,被填以洋紅色,由于最初頂點(diǎn)坐標(biāo)和最后一個(gè)頂點(diǎn)坐標(biāo)相同(同為(420,20)),所以是一個(gè)封閉的圖形。#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ù)將對一封閉圖形進(jìn)行填充,其顏色和模式將由設(shè)定的或缺省的圖模與顏色決定。其中參數(shù)(x,y)為封閉圖形中的任一點(diǎn),border是封閉圖形的邊框顏色。編程時(shí)該函數(shù)位于畫圖形的函數(shù)之后,即要填充該圖形。需要注意的是:若(x,y)點(diǎn)位于封閉圖形邊界上,該函數(shù)將不進(jìn)行填充。若對不是封閉的圖形進(jìn)行填充,則會(huì)填到別的地方,即會(huì)溢出。若(x,y)點(diǎn)在封閉圖形之外,將對封閉圖形外進(jìn)行填充。由參數(shù)border指出的顏色必須與封閉圖形的輪廓線的顏色一致,否則會(huì)填到別的地方去。4.2.6圖視窗口操作函數(shù)圖視口設(shè)置函數(shù)

voidfarsetviewport(intxl,inty1,intx2,

inty2,clipflag);

其中(x1,y1)為圖視口的左上角坐標(biāo),(x2,y2)為所設(shè)置的圖視口右下角坐標(biāo),它們都是以原屏幕物理坐標(biāo)為參考的。

clipflag參數(shù)若為非0,則所畫圖形超出圖視口的部分將被切除而不顯示出來。若clipflag為0,則超出圖視口的圖形部分仍將顯示出來。4.2.7圖形方式下的文本輸出函數(shù)在圖形模式下,只能用標(biāo)準(zhǔn)輸出函數(shù),如printf(),puts(),putchar()函數(shù)輸出文本到屏幕。除此之外,其它輸出函數(shù)(如窗口輸出函數(shù))都不能使用,即使是可以輸出的標(biāo)準(zhǔn)函數(shù),也只以前景色為白色,按80列,25行的文本方式輸出。為此C另外提供了一些專門用于在圖形顯示模式下的文本輸出函數(shù):

voidfarouttext(charfar*textstring):該函數(shù)在現(xiàn)行位置輸出字符串指針textstring所指的文本。

voidfarouttextxy(intx,inty,charfar*textstring):該函數(shù)輸出字符串指針textstring所指的文本在規(guī)定的(x,y)位置。其中x和y為像素坐標(biāo)。

有關(guān)文本字體、字型和輸出方式的設(shè)置

voidfarsettextstyle(intfont,intdirection,intcharsize):該函數(shù)用來設(shè)置輸出字符的字形(由font確定)、輸出方向(由direction確定)和字符大小(由charsize確定)等特性。C對該函數(shù)中各個(gè)參數(shù)的規(guī)定見下列各表所示:符號(hào)常數(shù)數(shù)值含義DEFAULT_FONT08*8點(diǎn)陣字(缺省值)TRIPLEX_FONT1三倍筆劃字體SMALL_FONT2小號(hào)筆劃字體SANSSERIF_FONT3無襯線筆劃字體GOTHIC_FONT4黑體筆劃字font的取值符號(hào)常數(shù)數(shù)值含義HORIZ_DIR0從左到右VERT_DIR1從底到頂direction的取值符號(hào)常數(shù)或數(shù)值含義18*8點(diǎn)陣216*16點(diǎn)陣324*24點(diǎn)陣432*32點(diǎn)陣540*40點(diǎn)陣648*48點(diǎn)陣756*56點(diǎn)陣864*64點(diǎn)陣972*72點(diǎn)陣1080*80點(diǎn)陣USER_CHAR_SIZE=0用戶定義的字符大小charsize的取值

用戶對文本字符大小的設(shè)置

voidfarsetusercharsize(intmulx,intdivx,intmuly,intdivy):該函數(shù)用來設(shè)置筆劃型字和放大系數(shù),它只有在settextstyle()函數(shù)中的charsize為0(或USER_CHAR_SIZE)時(shí)才起作用,并且字體為函數(shù)settextstyle()所規(guī)定的字體。調(diào)用函數(shù)setusercharsize()后,每個(gè)顯示在屏幕上的字符都以其缺省大小乘以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動(dòng)畫技術(shù)4.3.1延遲與清屏交錯(cuò)的實(shí)現(xiàn)方法這種方法利用cleardevice()和delay()函數(shù)相互配合,先畫一幅圖形,讓它延遲一段時(shí)間,然后清屏,再畫另一幅,如此反復(fù),就形成動(dòng)態(tài)效果。4.3.2動(dòng)態(tài)開辟圖視窗口的方法我們還可以利用圖視口設(shè)置技術(shù)來實(shí)現(xiàn)圖視口動(dòng)畫效果,具體方法是:在不同圖視口中設(shè)置同樣的圖像,然后讓圖視口沿x軸方向移動(dòng)設(shè)置,這次出現(xiàn)前要清除上次圖視口的內(nèi)容,這樣就會(huì)出現(xiàn)圖像沿x軸移動(dòng)的效果。也就是說,在位置動(dòng)態(tài)變化,但大小不變的圖視口中(用setviewpot()函數(shù)),設(shè)置固定圖形(也可是微小變化的圖像),這樣雖呈現(xiàn)在觀察者面前的是當(dāng)前圖視口位置在動(dòng)態(tài)變化,但視覺上卻象是看到圖像在屏幕上動(dòng)態(tài)變化一樣。4.3.3屏幕圖像存儲(chǔ)再放的方法在圖形方式下,除了清屏函數(shù)cleardevice()外,還有其它的對屏幕圖像操作的函數(shù),其中一類是屏幕圖像存儲(chǔ)和顯示函數(shù):存屏幕圖像到內(nèi)存區(qū):voidfargetimage(intx1,inty1,intx2,

inty2,voidfar*bitmap);該函數(shù)將把屏幕左上角為(x1,y1),右下角為(x2,y2)矩形區(qū)內(nèi)的圖像保存到指針bitmap指向的內(nèi)存區(qū)去。為了能開辟一個(gè)內(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)圖像進(jìn)行op規(guī)定的操作參見表。該函數(shù)進(jìn)行各種圖像的邏輯操作如同二進(jìn)制操作一樣。符號(hào)名

含義

COPY_PUT

0

復(fù)制XOR_PUT

1

進(jìn)行異或操作OR_PUT

2

進(jìn)行或操作

AND_PUT

3

進(jìn)行與操作NOT_PUT

4

進(jìn)行非操作op邏輯操作結(jié)果4.3.4利用頁交替的方法對屏幕圖像操作的函數(shù),還有一類是設(shè)置顯示頁函數(shù)。我們曾在前面提到了顯示適配器的顯示存儲(chǔ)器VRAM,圖形方式下存儲(chǔ)在VRAM中的一滿屏圖像信息稱為一頁。每個(gè)頁一般為64K字節(jié),VRAM可以存儲(chǔ)要顯示的圖像幾個(gè)頁(視VRAM容量而定,最大可達(dá)8頁),TurboC2.0支持頁的功能有限,按在圖形方式下顯示的模式最多支持4頁(EGALO顯示方式),一般為兩頁(注意對CGA,僅有一頁),因存儲(chǔ)圖象的頁顯示時(shí),一次只能顯示一頁,因此必須設(shè)定某頁為當(dāng)前顯示的頁(又稱可視頁),缺省時(shí)定為0頁。

如圖所示。正在由用戶編輯圖形的頁稱為當(dāng)前編輯頁(又稱激活的頁),這個(gè)頁不等于顯示頁,即若用戶不設(shè)定該頁為當(dāng)前顯示頁時(shí),在該頁上編輯的圖形將不會(huì)在屏上顯示出來。缺省時(shí),設(shè)定0頁為當(dāng)前編輯頁,即若不用下述的頁設(shè)置函數(shù)進(jìn)行設(shè)置,就認(rèn)定0頁既是編輯頁,又是當(dāng)前顯示頁。設(shè)置激活頁和顯示頁的函數(shù)如下:voidfarsetactivepage(intpagenum);voidfarsetvisualpage(intpagenum);這兩個(gè)函數(shù)只能用于EGA、VGA等顯示適配器。前者設(shè)置由pagenum指出的頁為激活的頁,后者設(shè)置可顯示的頁。當(dāng)設(shè)定了激活的頁,即編輯頁后,則程序中其后的畫圖操作均在該頁進(jìn)行,若它不定為顯示頁,則其上的圖象信息并不會(huì)在屏上顯示出來。利用頁交替的方法

例:下面的程序演示了設(shè)置顯示頁函數(shù)的應(yīng)用。首先用setactivepage(1)設(shè)置l頁為編輯頁,在上面畫出一個(gè)紅色邊框、用淡綠色填充的圓,此圖并不顯示出來(因缺省時(shí),定義0頁為可視頁)。接著又定義0頁為編輯頁并清屏(即清0頁),也定義0頁為可視頁,并在其上畫出一個(gè)用洋紅色填充的方塊,該方塊將在屏上顯示出來。接著進(jìn)入do循環(huán),設(shè)置l頁為可視頁,因而其上的圓便在屏上顯示出來,方塊的圖象消失,用delay(2000)將圓圖象保持2000毫秒即2秒,當(dāng)不按鍵時(shí),下一次循環(huán)又將0頁設(shè)為可視頁,因而方塊的圖象顯示出來,圓圖象又消失。保持2秒后,又重復(fù)剛開始的過程。這樣我們就會(huì)看到:屏上同一位置洋紅色圓和淡綠色方塊交替出現(xiàn),若將delay時(shí)間變少,將會(huì)出現(xiàn)動(dòng)畫的效果。#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)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論