8.1.3大型趣味程序設(shè)計基礎(chǔ) - 高級編程技術(shù)的實現(xiàn)-教學(xué)課件_第1頁
8.1.3大型趣味程序設(shè)計基礎(chǔ) - 高級編程技術(shù)的實現(xiàn)-教學(xué)課件_第2頁
8.1.3大型趣味程序設(shè)計基礎(chǔ) - 高級編程技術(shù)的實現(xiàn)-教學(xué)課件_第3頁
8.1.3大型趣味程序設(shè)計基礎(chǔ) - 高級編程技術(shù)的實現(xiàn)-教學(xué)課件_第4頁
8.1.3大型趣味程序設(shè)計基礎(chǔ) - 高級編程技術(shù)的實現(xiàn)-教學(xué)課件_第5頁
已閱讀5頁,還剩146頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第八章大型趣味程序設(shè)計第1節(jié)大型趣味程序設(shè)計基礎(chǔ)高級編程技術(shù)的實現(xiàn)主要內(nèi)容操作手段顯示方式圖形繪制技術(shù)圖像技術(shù)動畫技術(shù)發(fā)聲技術(shù)漢字顯示技術(shù)精確的時間控制技術(shù)高級編程技術(shù)的實現(xiàn)操作手段:鍵盤在鍵盤內(nèi)有一個微處理器,用來掃描和檢測每個鍵的按下和抬起狀態(tài),然后以程序中斷(INT9H)的方式與主機通信,向主機傳送一個字節(jié)的按鍵掃描碼。接著ROM中BIOS內(nèi)的鍵盤中斷處理程序,將按鍵掃描碼翻譯成對應(yīng)的ASCII碼或擴充的ASCII碼,存放在AX寄存器中。

它不是ASCII碼;其0~6位標(biāo)識了每個鍵在鍵盤上的位置,最高位為0對應(yīng)該鍵是被按下;1對應(yīng)松開;它并不能區(qū)別大小寫字母,而且一些特殊鍵不產(chǎn)生掃描碼直接引起中斷調(diào)用鍵名AHAL字符鍵ASCII碼ASCII碼功能鍵/組合鍵擴充碼的ASCII碼0——原理高級編程技術(shù)的實現(xiàn)操作手段:鍵盤——方法方法一:直接使用聲明在bios.h中的庫函數(shù)bioskey();方法二:通過庫函數(shù)int86(),調(diào)用BIOS的INT16H、功能號為0的中斷。它將按鍵的掃描碼存放在AH寄存器中;方法三:簡單地利用聲明在conio.h中的庫函數(shù)kbhit()。高級編程技術(shù)的實現(xiàn)操作手段:鍵盤——方法一int

bioskey(int

cmd);/*參數(shù)cmd用來確定函數(shù)如何操作*/cmd=0bioskey()返回按健的鍵值,該值是2個字節(jié)的整型數(shù)。若沒有鍵按下,則該函數(shù)一直等待,直到有鍵按下。當(dāng)按下時,若返回值的低8位為非零,則表示為普通鍵,其值代表該鍵的ASCII碼。若返回值的低8位為0,則高8位表示為擴展的ASCII碼,表示按下的是特殊功能鍵高級編程技術(shù)的實現(xiàn)操作手段:鍵盤——方法一int

bioskey(int

cmd);/*參數(shù)cmd用來確定函數(shù)如何操作*/cmd=1bioskey()查詢是否有鍵按下。若返回非0值,則表示有鍵按下,若為0表示沒鍵按下。高級編程技術(shù)的實現(xiàn)操作手段:鍵盤——方法一int

bioskey(int

cmd);/*參數(shù)cmd用來確定函數(shù)如何操作*/cmd=2bioskey()將返回一些控制鍵是否被按過,按過的狀態(tài)由該函數(shù)返回的低8位的各位值來表示:字節(jié)位 對應(yīng)的16進制數(shù) 含義0 0x01 右邊的shift鍵被按下1 0x02 左邊的shift鍵被按下2 0x04 Ctrl鍵被按下3 0x08 Alt鍵被按下4 0x10 ScrollLock已打開5 0x20 NumLock已打開6 0x40 CapsLock已打開7 0x80 Insert已打開高級編程技術(shù)的實現(xiàn)操作手段:鍵盤——方法二/*讀鍵函數(shù),返回掃描碼*/int

getKeySCode(){ unionREGSrg;

rg.h.ah=0; int86(0x16,&rg,&rg); returnrg.h.ah;}

高級編程技術(shù)的實現(xiàn)操作手段:鍵盤——方法三int

kbhit(void);

若按了鍵盤,該函數(shù)返回值1,否則返回值0。

高級編程技術(shù)的實現(xiàn)操作手段:鼠標(biāo)DOS操作系統(tǒng)和TurboC2.0并不支持鼠標(biāo)器的操作。要操縱鼠標(biāo)器,首先必須安裝相應(yīng)的鼠標(biāo)驅(qū)動程序。鼠標(biāo)驅(qū)動程序由生產(chǎn)鼠標(biāo)的廠家提供,它提供了許多鼠標(biāo)操作的功能。這些功能可以通過INT33H鼠標(biāo)中斷調(diào)用來使用?!砀呒壘幊碳夹g(shù)的實現(xiàn)操作手段:鼠標(biāo)——常用功能/* 顯示鼠標(biāo)器光標(biāo) */voidcursorOn() {unionREGSr;

structSREGSs;r.x.ax=1; /*1號鼠標(biāo)器功能:顯示鼠標(biāo)光標(biāo)

*/

msvisible=TRUE;int86x(0x33,&r,&r,&s);}高級編程技術(shù)的實現(xiàn)/* 關(guān)閉鼠標(biāo)器光標(biāo) */voidcursorOff() {unionREGSr;

structSREGSs;r.x.ax=2;/*2號鼠標(biāo)器功能 :不顯示鼠標(biāo)光標(biāo)*/

msvisible=FALSE;int86x(0x33,&r,&r,&s);}

操作手段:鼠標(biāo)——常用功能高級編程技術(shù)的實現(xiàn)/*設(shè)定鼠標(biāo)光標(biāo)的初始位置*/voidcursorXY(unsigned

intx,unsignedinty){unionREGSr;

structSREGs;r.x.ax=4; /*4號鼠標(biāo)器功能:設(shè)置鼠標(biāo)光標(biāo)位置

*/

r.x.cx=x;/*設(shè)定光標(biāo)x坐標(biāo)*/

r.x.dx=y;/*設(shè)定光標(biāo)y坐標(biāo)*/

int86x(0x33,&r,&r,&s);

mousex=x;mousey=y;}

操作手段:鼠標(biāo)——常用功能高級編程技術(shù)的實現(xiàn)/*報告鼠標(biāo)器當(dāng)前光標(biāo)位置和當(dāng)前按鍵狀態(tài)*/voidmouseRead() {unionREGSrl,r2;

structSREGSs;r1.x.ax=3;/*3號鼠標(biāo)器功能:取按鈕狀態(tài)和鼠標(biāo)位置

*/int86x(0x33,&r1,&r2,&s);

mousex=r2.x.cx; /* 鼠標(biāo)器光標(biāo)x方向坐標(biāo) */mousey=r2.x.dx; /* 鼠標(biāo)器光標(biāo)y方向坐標(biāo) */

mousekey=r2.x.bx; /* 鼠標(biāo)器按健狀態(tài) */}

操作手段:鼠標(biāo)——常用功能高級編程技術(shù)的實現(xiàn)/*等待鼠標(biāo)器的某種狀態(tài)*/voidwait(inti){do{

mouseread();}while(mousekey==i);}

操作手段:鼠標(biāo)——常用功能高級編程技術(shù)的實現(xiàn)主要內(nèi)容操作手段顯示方式圖形繪制技術(shù)圖像技術(shù)動畫技術(shù)發(fā)聲技術(shù)漢字顯示技術(shù)精確的時間控制技術(shù)高級編程技術(shù)的實現(xiàn)顯示方式:顯示系統(tǒng)顯卡在計算機主機和顯示器之間起到了信息轉(zhuǎn)換和視頻發(fā)送作用,必須與顯示器配套。不同種類的顯卡支持的顯示模式種類不同,而且同一顯卡一般可以支持多種顯示模式。一種顯示模式指定了相應(yīng)顯示器的工作方式、分辨率和顏色數(shù)目。

顯卡高級編程技術(shù)的實現(xiàn)顯示方式:顯示系統(tǒng)——常見顯卡及其模式高級編程技術(shù)的實現(xiàn)顯示方式:顯示系統(tǒng)——顯示器工作方式顯示器有兩種工作方式,即文本顯示方式和圖形顯示方式,它們的主要差別是顯示存儲器(VRAM)中存的信息不同。文本方式時,VRAM存放要顯示字符的ASCII碼,用它作為地址,取出字符發(fā)生器ROM中存放的相應(yīng)字符的圖像變成視頻信號在顯示器屏幕上進行顯示。圖形方式時,則要顯示的圖形的圖像直接存在VRAM中,VRAM中某地址單元存放的數(shù)就表示了相應(yīng)屏幕上某行和列上的像素及顏色。

高級編程技術(shù)的實現(xiàn)顯示方式:也稱作字符顯示方式,是TurboC確省的顯示方式。文本方式屏幕的最大分辨單位是單個字符,字符顯示的位置用行和列坐標(biāo)來表示。文本方式高級編程技術(shù)的實現(xiàn)顯示方式:文本方式——方式設(shè)定TurboC支持的幾種文本顯示方式可以用下面的函數(shù)來設(shè)置:voidtextmode(int

newmode);。

第3章高級編程技術(shù)的實現(xiàn)顯示方式:文本方式——顏色設(shè)置voidtextbackground(intcolor);/*設(shè)置字符背景顏色*/voidtextcolor(intcolor);/*設(shè)置字符顏色*/voidtextattr(int

attr);/*可同時設(shè)置文本的字符和背景顏色*/顏色函數(shù)高級編程技術(shù)的實現(xiàn)顯示方式:文本方式——窗口設(shè)置TurboC確省定義的文本窗口為整個屏幕。用戶可以通過函數(shù):voidwindow(intleft,inttop,intright,intbottom);定義屏幕上的一個矩形域作為窗口。參數(shù)(left,top)是窗口左上角所在的屏幕坐標(biāo),(right,bottom)是窗口的右下角所在的屏幕坐標(biāo)。窗口定義之后,用有關(guān)窗口的輸入輸出函數(shù)就可以只在此窗口內(nèi)進行操作而不超出窗口的邊界。另外,一個屏幕可以定義多個窗口,但現(xiàn)行窗口只能有一個。高級編程技術(shù)的實現(xiàn)顯示方式:文本方式——窗口操作窗口內(nèi)文本輸出函數(shù):

int

cprintf(char*format,表達式表);

int

cputs(char*str);

int

putch(int

ch);/*這三個函數(shù)受窗口的控制,窗口內(nèi)顯示光標(biāo)的位置就是它們開始輸出的位置。當(dāng)輸出行超過窗口右邊界或輸出到窗口底部邊界時,會自動轉(zhuǎn)到窗口內(nèi)的下一行輸出或自動上卷窗口內(nèi)的內(nèi)容繼續(xù)輸出*/光標(biāo)操作函數(shù):voidgotoxy(intx,inty);/*把光標(biāo)移到窗口(x,y)處*/高級編程技術(shù)的實現(xiàn)顯示方式:文本方式——屏幕操作

清屏函數(shù):

voidclrscr(void);/*清除窗口文本,光標(biāo)移到(1,1)*/voidclreol(void);/*清除窗口從光標(biāo)位置開始到本行結(jié)尾的所有字符,但光標(biāo)不變*/

voiddelline(void);/*刪除當(dāng)前窗口的當(dāng)前行*/高級編程技術(shù)的實現(xiàn)顯示方式:文本方式——屏幕操作

屏幕文本移動函數(shù):

voidmovetext(intx1,inty1,intx2,inty2,intx3,inty3);屏幕文本存取函數(shù)voidgettext(intx1,inty1,intx2,inty2,void*buffer);voidputtext(intx1,inty1,intx2,inty2,void*buffer);

高級編程技術(shù)的實現(xiàn)顯示方式:文本方式編制一個程序,將屏幕垂直平分成兩個窗口,左邊窗口為藍(lán)色背景,白色前景,右邊窗口為綠色背景,紅色前景。兩個窗口都設(shè)計為文本輸入,即在窗口中可以輸入文字,在窗口屏幕中顯示出來。使用tab鍵在左右兩個窗口中切換,每個窗口都有光標(biāo),活動窗口光標(biāo)進行閃爍。

應(yīng)用實例問題描述高級編程技術(shù)的實現(xiàn)顯示方式:文本方式首先用文本窗口函數(shù)window(intx1,inty1,intx2,inty2)畫出兩個窗口,用textcolor(int

color),textbackground(int

color),clrscr(void)等進行窗口屬性的設(shè)置。用tab鍵進行兩個窗口間的循環(huán)切換,在每次切換前先調(diào)用gettext(intleft,inttop,intright,intbottom,void*buf)函數(shù)把當(dāng)前矩形窗口上的字符拷貝到由buf所指向的內(nèi)存中,在切換到另一個窗口后調(diào)用puttext(intleft,inttop,intright,intbottom,void*buf)把先前存儲在該窗口buf所指向的內(nèi)存中的字符拷貝到當(dāng)前窗口中,并用gotoxy(intx,inty)把光標(biāo)移到原先所在位置,因此可以接著先前的文本繼續(xù)編輯。

應(yīng)用實例設(shè)計思想高級編程技術(shù)的實現(xiàn)顯示方式:文本方式應(yīng)用實例程序運行截圖高級編程技術(shù)的實現(xiàn)顯示方式:圖形方式圖形顯示方式可以滿足在屏幕上作圖的要求。在此方式下,屏幕顯示的單位是像素。屏幕顯示的像素大小(分辨率)可以通過設(shè)置不同的顯示方式來改變。像素在屏幕上的位置可由其所在的x,y坐標(biāo)來決定。此時,屏幕的坐標(biāo)系統(tǒng)就象一個倒置的直角坐標(biāo)系。高級編程技術(shù)的實現(xiàn)顯示方式:圖形方式——方式設(shè)定圖形系統(tǒng)的初始化:用什么類型的顯卡的驅(qū)動程序采用什么模式的圖形方式適配器驅(qū)動程序的尋找路徑名。注意:所用系統(tǒng)的卡一定要支持所選用的顯示模式,否則將出錯。高級編程技術(shù)的實現(xiàn)顯示方式:圖形方式——方式設(shè)定圖形系統(tǒng)的初始化函數(shù):voidfarinitgraph(intfar*pdriver,intfar*pmode,charfar*ppath_for_driver);enumgraphics_driver {DETECT,CGA,MCGA,EGA,EGA64,EGAMONO,IBM8514,HERCMONO,ATT400,VGA,PC3270};

高級編程技術(shù)的實現(xiàn)顯示方式:圖形方式——方式設(shè)定圖形系統(tǒng)的初始化函數(shù):voidfarinitgraph(intfar*pdriver,intfar*pmode,charfar*ppath_for_driver);高級編程技術(shù)的實現(xiàn)顯示方式:圖形方式——方式設(shè)定圖形系統(tǒng)檢測函數(shù):voidfardetectgraph(intfar*pdriver,intfar*pmode);完成對適配器的檢查并得到顯示器類型號和相應(yīng)的最高分辨率模式

將graphdriver設(shè)成DETECT,initgraph()將調(diào)用detectgraph()自動檢測所用顯卡類型,并將相應(yīng)的驅(qū)動程序裝入,并將其最高的顯示模式作為當(dāng)前顯示模式。

int

graphdriver=DETECT,graphmode;initgraph(&graphdriver,&graphmode,"");

高級編程技術(shù)的實現(xiàn)顯示方式:圖形方式——方式設(shè)定清屏函數(shù):畫圖前一般需清除屏幕,使得屏幕如同一張白紙,以畫最新最美的圖畫。voidfarcleardevice(void);

圖形系統(tǒng)的關(guān)閉:當(dāng)畫圖結(jié)束時可以通過調(diào)用關(guān)閉圖形系統(tǒng)的函數(shù):voidfarclosegraph(void);

使顯示器恢復(fù)到調(diào)用initgraph()函數(shù)之前的文本方式。高級編程技術(shù)的實現(xiàn)顯示方式:圖形方式——顏色設(shè)置前景色設(shè)置函數(shù):voidfarsetcolor(intcolor);背景色設(shè)置函數(shù):voidfarsetbkcolor(intcolor);高級編程技術(shù)的實現(xiàn)顯示方式:圖形方式——顏色設(shè)置前景色設(shè)置函數(shù):voidfarsetcolor(intcolor);背景色設(shè)置函數(shù):voidfarsetbkcolor(intcolor);高級編程技術(shù)的實現(xiàn)顯示方式:圖形方式——顏色設(shè)置CGA前景色的取值:高級編程技術(shù)的實現(xiàn)顯示方式:圖形方式——顏色設(shè)置CGA背景色的取值:高級編程技術(shù)的實現(xiàn)顯示方式:圖形方式——顏色設(shè)置EGA/VGA調(diào)色板:

setcolor(color)時color的取值;0號索引位置的顏色總是和背景色相同;16個索引號意味著同時最多可顯示16種不同的顏色64/256色選一高級編程技術(shù)的實現(xiàn)顯示方式:圖形方式——顏色設(shè)置EGA/VGA調(diào)色板:整體設(shè)置:voidfarsetallpalette(struct

palettetypefar*palette);#defineMAXCOLORSl5struct

palattetype{unsignedcharsize;signedcharcolors[MAXCOLORS+1];};單色設(shè)置:void farsetpalette(intindex,intactual_color);

高級編程技術(shù)的實現(xiàn)顯示方式:圖形方式——顏色設(shè)置EGA/VGA標(biāo)準(zhǔn)色:高級編程技術(shù)的實現(xiàn)顯示方式:圖形方式——圖視口設(shè)置函數(shù):voidfarsetviewport(int

xl,inty1,intx2,inty2,clipflag);其中(x1,y1)為圖視口的左上角所在的原屏幕物理坐標(biāo),(x2,y2)為右下角所在的原屏幕物理坐標(biāo)。clipflag參數(shù)clipflag若為0,則超出圖視口的圖形部分仍將顯示出來;否則,超出圖視口的部分將被切除而不顯示。清除函數(shù):voidfarclearviewport(void)高級編程技術(shù)的實現(xiàn)顯示方式:圖形方式——文本輸出當(dāng)前位置文本輸出函數(shù):

voidfarouttext(charfar*textstring);定位文本輸出函數(shù):

voidfarouttextxy(int

x,inty,charfar*textstring);文本輸出字符串函數(shù)

int

sprintf(char*string,char*format[,argument,…]);高級編程技術(shù)的實現(xiàn)顯示方式:圖形方式——文本輸出文本輸出位置函數(shù):voidfarsettextjustify(int

horiz,int

vert);高級編程技術(shù)的實現(xiàn)顯示方式:圖形方式——文本輸出

定義文本字型函數(shù):

voidfarsettextstyle(int

font,int

direction,intcharsize);

高級編程技術(shù)的實現(xiàn)#include<graphics.h>main(){

int

i,graphdriver,graphmode,size,page;chars[30];

graphdriver=DETECT;

initgraph(&graphdriver,&graphmode,"");

cleardevice();settextstyle(DEFAULT_FONT,HORIZ_DIR,2);settextjustify(LEFT_TEXT,0);outtextxy(220,20,"Defautfont");

settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);settextjustify(LEFT_TEXT,0);outtextxy(220,50,"Triplexfont");應(yīng)用實例程序源代碼settextstyle(SMALL_FONT,HORIZ_DIR,2);settextjustify(LEFT_TEXT,0);outtextxy(220,80,"Smallfont");settextstyle(SANS_SERIF_FONT,HORIZ_DIR,2);settextjustify(LEFT_TEXT,0);outtextxy(220,110,"Sansseriffont");settextstyle(GOTHIC_FONT,HORIZ_DIR,2);settextjustify(LEFT_TEXT,0);outtextxy(220,140,"gothicfont");getch();

closegraph();}顯示方式:圖形方式——文本輸出高級編程技術(shù)的實現(xiàn)應(yīng)用實例程序輸出顯示方式:圖形方式——文本輸出高級編程技術(shù)的實現(xiàn)主要內(nèi)容操作手段顯示方式圖形繪制技術(shù)動畫技術(shù)發(fā)聲技術(shù)漢字顯示技術(shù)圖像技術(shù)精確的時間控制技術(shù)高級編程技術(shù)的實現(xiàn)圖形繪制voidfarmoveto(int

x,inty);移動畫筆到指定的(x,y)位置,移動過程不畫。voidfarmoverel(int

dx,int

dy);畫筆從現(xiàn)行位置(x,y)處移到一位置增量處(x+dx,y+dx),移動過程不畫:intfargetx(void);得到當(dāng)前畫筆的x位置intfargety(void);得到當(dāng)前畫筆的y位置:畫筆定位高級編程技術(shù)的實現(xiàn)圖形繪制

畫點函數(shù):

voidfarputpixel(int

x,int

y,intcolor);該函數(shù)表示在指定的x,y位置畫一點,點的顯示顏色由設(shè)置的color值決定。

intfargetpixel(int

x,inty);該函數(shù)與putpixel()相對應(yīng),它得到在(x,y)點位置上的像素的顏色值

:點和線高級編程技術(shù)的實現(xiàn)圖形繪制:點和線

畫線函數(shù):voidfarline(intx0,inty0,intx1,inty1);該函數(shù)從(x0,y0)點到(x1,y1)點畫一直線。voidfarlineto(int

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

dx,int

dy);

該函數(shù)將從現(xiàn)行畫筆位置(x,y)到位置增量處(x+dx,y+dy)畫一直線。

高級編程技術(shù)的實現(xiàn)

線類型的設(shè)置:在確省的情況下,畫線函數(shù)畫出的線都是一個像素點寬的細(xì)實線。也可以在畫線之前通過函數(shù):voidfarsetlinestyle(int

linestyle,unsigned

upattern,intthickness);

定義線的類型和粗細(xì)。

setlinestyle(4,0xF3D0,1)設(shè)置的線型

圖形繪制:點和線高級編程技術(shù)的實現(xiàn)BIOS的10H中斷負(fù)責(zé)顯示器服務(wù),該中斷的主要功能通過對AH來設(shè)置:AH=00H,功能為設(shè)置顯示方式。此時通過對AL進行設(shè)置來設(shè)定顯示方式,如設(shè)置AL=13H,則顯示方式設(shè)置為VGA的256色320×200圖形顯示模式。

AH=0CH,功能為畫點。這時AL中設(shè)置的值為顏色號,CX和DX的值決定畫點的位置坐標(biāo)。圖形繪制:點和線——利用BIOS調(diào)用高級編程技術(shù)的實現(xiàn)#include<dos.h>#include<conio.h>intmain(){

inti,j;unionREGSinreg,outreg;

inreg.h.ah=0;/*置屏幕顯示方式*/

inreg.h.al=0x13;/*定義VGA256色320×200圖形模式*/int86(0x10,&inreg,&outreg);/*調(diào)用中斷0x10*/for(i=0;i<256;i++)for(j=0;j<200;j++){

inreg.h.ah=0x0c;/*寫點*/

應(yīng)用實例在屏幕上畫出顏色不同的256條直線的程序源代碼

inreg.h.al=i;/*置顏色號*/

inreg.h.ch=0;/*決定畫點位置*/

inreg.h.cl=i;

inreg.h.dh=0;

inreg.h.dl=j;int86(0x10,&inreg,&outreg);

}

getch();

inreg.h.ah=0;

inreg.h.al=2;/*返回到文本方式*/

int86(0x10,&inreg,&outreg);}圖形繪制:點和線——利用BIOS調(diào)用高級編程技術(shù)的實現(xiàn)圖形繪制:矩形、圓和弧線

畫矩形的函數(shù):voidfarrectangle(int

xl,inty1,intx2,inty2);

畫橢圓、圓和扇形圖函數(shù):voidellipse(int

x,int

y,int

stangle,int

endangel,

int

xradius,int

yradius);voidfarcircle(int

x,int

y,intradius);voidfararc(int

x,int

y,int

stangle,int

endangle,

intradius);高級編程技術(shù)的實現(xiàn)編寫程序,使用鼠標(biāo)進行如下操作:按住鼠標(biāo)器的任意鍵并移動,十字光標(biāo)將隨鼠標(biāo)而移動,根據(jù)按鍵的不同采用不同的形狀來畫出相應(yīng)的移動軌跡:當(dāng)僅按下左鍵時用圓圈;僅按下右鍵時用矩形;其它按鍵情況用線條。

應(yīng)用實例問題描述圖形繪制高級編程技術(shù)的實現(xiàn)結(jié)合鼠標(biāo)使用方法和上述的圖形繪制函數(shù)來解決問題。由于在Windows2000/XP下不支持INT33的1號顯示鼠標(biāo)光標(biāo)功能,可以用畫線函數(shù)line()畫出一個十字形光標(biāo)。光標(biāo)的移動是通過將原位置光標(biāo)用背景色再畫而使其消失,然后在新位置處重新畫一個光標(biāo),從而實現(xiàn)光標(biāo)移動的動感。

應(yīng)用實例設(shè)計思想圖形繪制高級編程技術(shù)的實現(xiàn)應(yīng)用實例程序運行截圖圖形繪制高級編程技術(shù)的實現(xiàn)圖形繪制:封閉圖形的填色

填充設(shè)置函數(shù):voidfarsetfillstyle(int

pattern,intcolor);該函數(shù)將用設(shè)定的color顏色和pattern圖模式對后面畫出的輪廓圖進行填充,這些圖輪廓是由待定函數(shù)畫出的。

高級編程技術(shù)的實現(xiàn)圖形繪制:封閉圖形的填色

填充設(shè)置函數(shù):voidfarsetfillstyle(int

pattern,intcolor)高級編程技術(shù)的實現(xiàn)圖形繪制:封閉圖形的填色

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

upattefn,intcolor);該函數(shù)設(shè)置用戶自定義可填充模式,以color指出的顏色對封閉圖形進行填充。參數(shù)upattern是一個指向8個字節(jié)存儲區(qū)的指針,這8個字節(jié)表示了一個8×8像素點陣組成的填充圖模,它是由用戶自定義的,用來對封閉圖形填充。8個字節(jié)的圖模是這樣形成的:每個字節(jié)代表一行,而每個字節(jié)的每一個二進制位代表該行的對應(yīng)列上的像素。是1,則用color顯示,是0則不顯示。

高級編程技術(shù)的實現(xiàn)圖形繪制:封閉圖形的填色

得到目前的填充模式和顏色的函數(shù)

voidfarfillsettings(struct

fillsettingstypefar*fillinfo);voidfargetfillpattern(char*upattern);

高級編程技術(shù)的實現(xiàn)圖形繪制:封閉圖形的填色

可填充的基本圖形函數(shù):(這些函數(shù)繪制的圖形,將根據(jù)事先用setfillstyle函數(shù)設(shè)置的填充模式和顏色,或按缺省方式進行填充)voidbar(intx1,inty1,intx2,inty2);

voidfarpieslice(int

x,int

y,int

stangle,int

endangle,intradius);

voidfarbar3d(intx1,inty1,intx2,inty2,intdepth,int

topflag);voidfarsector(int

x,int

y,int

stangle,intendang1e,intxradius,int

yradius);voidfarfillellipse(int

x,int

y,int

xradius,int

yradius);voidfarfillpoly(int

numpoints,intfarpolypoints);高級編程技術(shù)的實現(xiàn)圖形繪制:封閉圖形的填色

可對任意封閉圖形填充的函數(shù):

voidfarfloodfill(int

x,int

y,intborder);

該函數(shù)將對任一封閉圖形進行填充,其顏色和模式將由設(shè)定的或缺省的圖模與顏色決定。其中參數(shù)(x,y)為封閉圖形中的任一點,border是封閉圖形的邊框顏色。編程時該函數(shù)位于畫封閉圖形(即要填充的圖形)的代碼之后。

高級編程技術(shù)的實現(xiàn)#include<graphics.h>main(){

inti,graphdriver,graphmode,size,page;chars[30];

graphdriver=DETECT;

initgraph(&graphdriver,&graphmode,"");

cleardevice();

setbkcolor(BLUE);setviewport(40,40,600,440,1);/*開圖視口 */

setfillstyle(1,2);

setcolor(YELLOW);rectangle(0,0,560,400);floodfill(50,50,14);/*用綠色填充矩形框*/

rectangle(20,20,540,380);setfillstyle(1,13);floodfill(2l,300,14);/*用淡洋紅色填充矩形框*/

setcolor(BLACK);

應(yīng)用實例程序源代碼settextstyle(1,0,6);/*設(shè)置字形方向,尺寸 */

outtextxy(100,60,"WelcomYou");setviewport(100,200,540,380,0);

setcolor(14);setfillstyle(1,12);rectangle(20,20,420,120);settextstyle(2,0,9);floodfill(21,100,14);/*用深藍(lán)色填充*/

sprintf(s,“Let‘sstudyTurboC”);

setcolor(YELLOW);outtextxy(60,40,s);/*用黃色顯示*/

setcolor(1);settextstyle(4,0,3);outtextxy(110,80,s);

getch();

closegraph();}

圖形繪制高級編程技術(shù)的實現(xiàn)應(yīng)用實例程序輸出圖形繪制高級編程技術(shù)的實現(xiàn)主要內(nèi)容操作手段顯示方式圖形繪制技術(shù)圖像技術(shù)動畫技術(shù)發(fā)聲技術(shù)漢字顯示技術(shù)精確的時間控制技術(shù)高級編程技術(shù)的實現(xiàn)圖像技術(shù):圖像的二種來源(1)屏幕圖像:在圖形方式下所繪圖形形成的像素點圖像。圖像數(shù)據(jù)直接存儲在VRAM中,VRAM中某地址單元存放的數(shù)就表示了相應(yīng)屏幕上某行和列上的像素及其顏色值。(2)圖像文件:圖像數(shù)據(jù)以一定的格式存儲在文件中。需要有專門的軟件來支持,或自己編寫程序來讀取、顯示和生成某種格式的圖像文件。首先必須要了解某種圖像文件的格式。高級編程技術(shù)的實現(xiàn)圖像技術(shù):屏幕圖像與VRAM直接寫屏:在圖形方式下將圖像數(shù)據(jù)直接寫入VRAM的過程,即圖像顯示過程。直接寫屏是最快的圖像顯示方法。高級編程技術(shù)的實現(xiàn)圖像技術(shù):VRAM與系統(tǒng)存儲器的對應(yīng)關(guān)系

CGA的VRAM對應(yīng)的內(nèi)存地址開始于B8000H,VGA、EGA的開始于A0000H。對CGA,VRAM僅有16K字節(jié);對VGA和EGA,VRAM可達256K字節(jié),它分成獨立的4個64K字節(jié)部分,這樣的每個部分稱為一個位面或頁面(編號0-3),它們共同占有一塊內(nèi)存空間,即用同一的64K個地址。相應(yīng)內(nèi)存的每個地址實際上代表VRAM4個位面上相并列的4個字節(jié)。對于SVGA,由于它要存取更高分辨率或更多顏色的數(shù)據(jù),一般都至少擁有512K以上的VRAM,但其所占用的內(nèi)存地址仍大都是64K,因此也需要劃分許多頁面,對應(yīng)到A0000H或其它的視頻內(nèi)存地址上。

高級編程技術(shù)的實現(xiàn)圖像技術(shù):屏幕圖像的允許讀寫過程允許讀的過程是:首先通過索引寄存器(接口地址為0x3ce)選擇讀位面選擇寄存器(其索引號為4),然后通過讀位面選擇寄存器(接口地址0x3cf)選擇位面號。相應(yīng)的代碼為:outportb(0x3ce,4);/*將索引號4送索引寄存器,選擇讀位面選擇寄存器*/outportb(0x3cf,n);/*將選擇的位面號n送讀位面選擇寄存器,允許該位面可讀*/高級編程技術(shù)的實現(xiàn)圖像技術(shù):屏幕圖像的讀寫過程允許寫的過程是:首先通過索引寄存器(接口地址為0x3c4)選擇位面寫允許寄存器(索引號為2),然后通過接口地址0x3c5選擇位面號。相應(yīng)的代碼為:outportb(0x3c4,2);/*將索引號2送索引寄存器,選擇位面寫允許寄存器*/outportb(0x3c5,k);/*送位面號至位面寫允許寄存器,允許該位面可寫*/高級編程技術(shù)的實現(xiàn)圖像技術(shù):屏幕圖像數(shù)據(jù)在VRAM中存放格式CGA的4色320×200的模式,視頻內(nèi)存起始地址B0000H。屏幕上顯示的像素點從左到右,從上到下依次存在VRAM從0號地址開始的連續(xù)地址中,每個像素占2位,VRAM每個字節(jié)存放四個像素點。特殊的地方:屏幕上顯示的偶行像素存在16KVRAM的上半部,而奇行存在下半部。從系統(tǒng)地址看,上半部開始于B800:0000,下半部開始于B800:1000。高級編程技術(shù)的實現(xiàn)圖像技術(shù):屏幕圖像數(shù)據(jù)在VRAM中存放格式VGA視頻內(nèi)存起始地址A0000H,在16色640×480模式下采用位面對應(yīng)方式,視頻內(nèi)存地址上每一個字節(jié)代表8個像素,每一位又可對應(yīng)到位面中同樣位置的4位上(4位的組合表示16色之一,因此又稱位面為顏色位面)。在屏幕上繪出一個點時,就必須將數(shù)據(jù)分別存放到四個位面中對應(yīng)的位上。高級編程技術(shù)的實現(xiàn)圖像技術(shù):屏幕圖像數(shù)據(jù)在VRAM中存放格式在256色320×200模式下采用的是線性對應(yīng)的方法(SVGA的所有256色和真彩都是用這種方法)。線性對應(yīng)將屏幕上每一點與視頻內(nèi)存地址按順序一一對應(yīng)起來,一個點對應(yīng)一個字節(jié),這樣做的好處是:這種對應(yīng)方式比位面對應(yīng)方式簡單多了,因為只需直接對視頻內(nèi)存地址做存取即可,而不必理會位面與內(nèi)存地址的對應(yīng)關(guān)系。

高級編程技術(shù)的實現(xiàn)圖像技術(shù):屏幕圖像的操作函數(shù)名含義unsignedfarimagesize(intx1,inty1,intx2,inty2);測定圖像所占字節(jié)數(shù)voidfargetimage(intx1,inty1,intx2,inty2,voidfar*bitmap);屏幕圖像存儲voidfarputimage(intx1,inty1,voidfar*bitmap,intop);顯示所存屏幕圖像

屏幕圖像的存儲和顯示操作函數(shù)高級編程技術(shù)的實現(xiàn)圖像技術(shù):圖像像素與背景像素的邏輯操作

表3-13操作規(guī)定值及操作符號名

值含義COPY_PUT0存儲圖像進行覆蓋XOR_PUT1對應(yīng)像素點進行異或操作OR_PUT2對應(yīng)像素點進行或操作AND_PUT3對應(yīng)像素點進行與操作NOT_PUT4存儲圖像取反后進行覆蓋高級編程技術(shù)的實現(xiàn)圖像技術(shù):屏幕圖像操作實例繪制滿屏的16色圓和長方形,并將屏幕圖像保存到文件pic.dat中。然后將保存在文件pic.dat的屏幕圖像重新顯示在VGA屏幕上。

應(yīng)用實例問題描述高級編程技術(shù)的實現(xiàn)圖像技術(shù):屏幕圖像操作實例應(yīng)用實例注意事項VGA的VRAM起始地址為A0000H,開始單元的地址為0xA000:0x0000。存取對應(yīng)屏幕圖像VRAM中的信息時,其開始地址指針定義為:ptr=(charfar*)0xa0000000L;由于程序?qū)@示模式設(shè)置為VGAHI模式,分辨率是640×480,16色,每個像素由每個位面上的1位組成,即一個字節(jié)代表8個像素,故對應(yīng)的內(nèi)存地址是從A0000H開始的38400個字節(jié)地址。由于系統(tǒng)初始化時,讀位面選擇寄存器設(shè)置為位面0,程序最后應(yīng)恢復(fù)原系統(tǒng)初始化設(shè)置。

高級編程技術(shù)的實現(xiàn)圖像技術(shù):屏幕圖像操作實例應(yīng)用實例源程序/*保存屏幕圖像*/voidsave_pic(char*fname){FILE*fp;

inti;longj;charfar*ptr;

fp=fopen(fname,"wb");for(i=0;i<4;i++){outportb(0x3ce,4); /*選擇讀位面選擇寄存器*/outportb(0x3cf,i); /*允許位面i可讀*/

ptr=(charfar*)0xa0000000L; /*VGA的VRAM指針*/

for(j=0;j<38400L;j++){

fputc(*ptr,fp);

ptr++;}}

fclose(fp);outport(0x3cf,0);}高級編程技術(shù)的實現(xiàn)圖像技術(shù):屏幕圖像操作實例應(yīng)用實例源程序/*從文件載入圖像*/voidload_pic(char*fname){FILE*fp;

inti,k=1;longj;charfar*ptr;

fp=fopen(fname,"rb");for(i=0;i<4;i++){outportb(0x3c4,2); /*選擇位面寫允許寄存器*/outportb(0x3c5,k); /*選擇位面號*/

ptr=(charfar*)0xa0000000L; /*VGA的VRAM指針*/for(j=0;j<38400L;j++) /*讀滿屏信息字節(jié)數(shù)*/

{*ptr=fgetc(fp);/*從文件中將圖像信息字節(jié)寫到VRAM中*/ptr++; /*字節(jié)地址加1*/}k=k*2;}

fclose(fp);

getch();outport(0x3c5,0xf); /*恢復(fù)位面允許寫寄存器的缺省值*/}高級編程技術(shù)的實現(xiàn)圖像技術(shù):圖像文件圖像文件由文件頭和圖像數(shù)據(jù)組成。文件頭的內(nèi)容一般包括文件類型、文件制作者、制作時間、版本號、文件大小和壓縮方式等。常見的圖像格式有BMP、JPEG、GIF、TIFF等。高級編程技術(shù)的實現(xiàn)圖像技術(shù):BMP圖像文件BMP文件由4個部分組成:文件頭、信息頭、彩色表和圖像數(shù)據(jù)文件頭包含有關(guān)于文件類型、文件大小、存放位置等信息信息頭包含關(guān)于這幅圖像的信息,如以像素為單位的圖像的寬度和高度。彩色表記錄圖像顏色的RGB值高級編程技術(shù)的實現(xiàn)圖像技術(shù):BMP圖像文件圖像的每一掃描行由表示圖像像素的連續(xù)的字節(jié)組成,每一行的字節(jié)數(shù)取決于圖像的顏色數(shù)目和用像素表示的圖像寬度。通常掃描行是由底向上存儲的,就是說,陣列中的第一個字節(jié)表示位圖左下角的像素,而最后一個字節(jié)表示位圖右上角的像素。每一掃描行的字節(jié)數(shù)必需是4的整倍數(shù),也就是DWORD對齊的。高級編程技術(shù)的實現(xiàn)圖像技術(shù):BMP圖像文件說明:并不是所有的BMP文件都有彩色表。若有彩色表,如8位256色的BMP圖像,其圖像數(shù)據(jù)的每一字節(jié)代表一個像素,但是它的值是彩色表的一個索引而不是該像素的RGB值;若沒有彩色表,如16位高彩色或24位真彩色文件,像素值直接表示RGB值。高級編程技術(shù)的實現(xiàn)圖像技術(shù):BMP圖像文件的格式

偏移量域的名稱大小內(nèi)容

圖像文件頭

0000h文件標(biāo)識2bytes識別BMP圖像的類型:0002hFileSize1dword用字節(jié)表示的整個文件的大小0006hReserved1dword保留,必須設(shè)置為0000AhBitmapDataOffset1dword從文件開始到圖像數(shù)據(jù)開始之間的數(shù)據(jù)之間的偏移量000EhBitmapHeaderSize1dword信息頭(BitmapInfoHeader)的長度,用來描述圖像的顏色、壓縮方法等。0012hWidth1dword圖像的寬度,以像素為單位0016hHeight1dword圖像的高度,以像素為單位001AhPlanes1word圖像的位面數(shù)(注:該值將總是1)高級編程技術(shù)的實現(xiàn)圖像技術(shù):BMP圖像文件的格式

偏移量域的名稱大小內(nèi)容

圖像信息頭

001ChBitsPerPixel1word每個像素的位數(shù):1-單色圖像4-16色圖像,8-256色圖像,16-16bit高彩色圖像,24-24bit真彩色圖像,32-32bit增強型真彩色圖像001EhCompression1dword壓縮說明:0-不壓縮0022hBitmapDataSize1dword用字節(jié)數(shù)表示的位圖數(shù)據(jù)的大小。該數(shù)必須是4的倍數(shù)0026hHResolution1dword用像素/米表示的水平分辨率002AhVResolution1dword用像素/米表示的垂直分辨率002EhColors1dword圖像使用的顏色數(shù)。如8-比特/像素表示為100h或者256.0032hImportantColors1dword指定重要的顏色數(shù)。當(dāng)該域的值等于顏色數(shù)時(或者等于0時),表示所有顏色都一樣重要高級編程技術(shù)的實現(xiàn)圖像技術(shù):BMP圖像文件的格式

偏移量域的名稱大小內(nèi)容調(diào)色板數(shù)據(jù)根據(jù)BMP版本的不同而不同PaletteN*4byte調(diào)色板規(guī)范。對于調(diào)色板中的每個表項,這4個字節(jié)用下述方法來描述RGB的值:每字節(jié)分別表示藍(lán),綠,紅,填充符(設(shè)置為)。圖像數(shù)據(jù)根據(jù)BMP版本及調(diào)色板尺寸的不同而不同BitmapDataxxxbytes該域的大小取決于壓縮方法及圖像的尺寸和圖像的位深度,它包含所有的圖像數(shù)據(jù)字節(jié),這些數(shù)據(jù)可能是彩色調(diào)色板的索引號,也可能是實際的RGB值,這將根據(jù)圖像信息頭中的位深度值來決定。高級編程技術(shù)的實現(xiàn)圖像技術(shù):BMP圖像的顯示TurboC提供的BGI圖形接口的局限:只支持VGA及以前的各種圖形顯示模式;調(diào)色板顏色為標(biāo)準(zhǔn)的,難以改變;顯示的分辨率及色彩數(shù)有限。通過對顯卡的VRAM直接進行訪問來突破上述局限高級編程技術(shù)的實現(xiàn)圖像技術(shù):BMP圖像的顯示目前常用的圖形顯示模式集中在256色上,主要包括VGA320×200模式SVGA高精度的640×480、800×600和1024×768模式。同樣,可以利用BIOS設(shè)置高精度的SVGA圖形顯示模式。SVGA利用VESA標(biāo)準(zhǔn),就可以實現(xiàn)直接寫屏(WindowsXP采用了VESA標(biāo)準(zhǔn))高級編程技術(shù)的實現(xiàn)圖像技術(shù):BMP圖像的顯示VESA圖形標(biāo)準(zhǔn)(在圖形模式下):SVGA的VRAM是順序的鏈結(jié)構(gòu),且圖像數(shù)據(jù)是按行順序存放的。一個像素用一個字節(jié)(256色)表示。VRAM按字節(jié)連續(xù)尋址,與主機內(nèi)存采用分頁映射方式通訊,一次只能讀寫64KB的VRAM,通過改變段偏移量(I/O操作)來尋址不同的段。高級編程技術(shù)的實現(xiàn)圖像技術(shù):SVGA模式顯示BMP圖像實例以256色640×480SVGA模式顯示BMP圖像。應(yīng)用實例問題描述高級編程技術(shù)的實現(xiàn)圖像技術(shù):SVGA模式顯示BMP圖像實例/*bmp文件頭結(jié)構(gòu)*/typedef

struct

tagBITMAPFILEHEADER{

int

bfType;/*通常是'BM'?,F(xiàn)在來看似乎判斷OS/2的標(biāo)識已無什么意義*/longbfSize;/*文件大小,以字節(jié)為單位*/

intbfReserved1;/*保留,必須設(shè)置為0*/

intbfReserved2;/*保留,必須設(shè)置為0*/longbfOffBits;/*從文件頭開始到實際的圖象數(shù)據(jù)之間的字節(jié)的偏移量。這*//*個參數(shù)是非常有用的,因為位圖信息頭和調(diào)色板的長度會*//*根據(jù)不同情況而變化,可以用這個偏移值迅速的從文件中*//*讀取到位數(shù)據(jù)。*/}BITMAPFILEHEADER;應(yīng)用實例程序片段高級編程技術(shù)的實現(xiàn)圖像技術(shù):SVGA模式顯示BMP圖像實例/*信息頭結(jié)構(gòu)*/typedef

struct

tagBITMAPINFOHEADER{longbiSize;/*信息頭大小*/longbiWidth;/*圖像寬度*/longbiHeight;/*圖像高度*/

int

biPlanes;/*必須為1*/

int

biBitCount;/*每像素位數(shù),必須是1,4,8或24*/longbiCompression;/*壓縮方法*/longbiSizeImage;/*實際圖像大小,必須是4的倍數(shù)*/longbiXPelsPerMeter;/*水平方向每米像素數(shù)*/longbiYPelsPerMeter;/*垂直方向每米像素數(shù)*/longbiClrUsed;/*所用顏色數(shù)*/longbiClrImportant;/*重要的顏色數(shù)*/}BITMAPINFOHEADER;應(yīng)用實例程序片段高級編程技術(shù)的實現(xiàn)圖像技術(shù):SVGA模式顯示BMP圖像實例/*調(diào)色板*/typedef

struct

tagRGBQUAD{charrgbBlue;/*藍(lán)色分量*/charrgbGreen;/*綠色分量*/charrgbRed;/*紅色分量*/charrgbReserved;}RGBQUAD;應(yīng)用實例程序片段高級編程技術(shù)的實現(xiàn)圖像技術(shù):SVGA模式顯示BMP圖像實例/*換頁函數(shù)*/voidselectpage(registercharpage){ unionREGSr;

r.x.ax=0x4f05;

r.x.bx=0;

r.x.dx=page;/*選擇頁面*/ int86(0x10,&r,&r);}應(yīng)用實例程序片段高級編程技術(shù)的實現(xiàn)圖像技術(shù):SVGA模式顯示BMP圖像實例

/*設(shè)置SVGA屏幕模式*//*101H256色640×480模式*//*103H256色800×600模式*//*105H256色1024×768模式*/unsignedcharset_SVGA_mode(int

vmode){ unionREGSr; r.x.ax=0x4f02;

r.x.bx=vmode; int86(0x10,&r,&r); return(r.h.ah);}應(yīng)用實例程序片段高級編程技術(shù)的實現(xiàn)圖像技術(shù):SVGA模式顯示BMP圖像實例/*獲取當(dāng)前SVGA屏幕模式*/unsignedintget_SVGA_mode(){ unionREGSr; r.x.ax=0x4f03; int86(0x10,&r,&r);

return(r.x.bx);}應(yīng)用實例程序片段高級編程技術(shù)的實現(xiàn)圖像技術(shù):SVGA模式顯示BMP圖像實例/*設(shè)置調(diào)色板*/voidset_SVGA_palette(unsignedcharr[],unsignedcharg[],unsignedcharb[]){

intk; for(k=0;k<256;k++){ outportb(0x03C8,k); outportb(0x03C9,r[k]>>2); outportb(0x03C9,g[k]>>2); outportb(0x03C9,b[k]>>2); }}應(yīng)用實例程序片段高級編程技術(shù)的實現(xiàn)主要內(nèi)容操作手段顯示方式圖形繪制技術(shù)圖像技術(shù)動畫技術(shù)發(fā)聲技術(shù)漢字顯示技術(shù)精確的時間控制技術(shù)高級編程技術(shù)的實現(xiàn)動畫技術(shù)在實際應(yīng)用中,經(jīng)常會遇到要求產(chǎn)生動態(tài)畫面的情況電影或動畫片是由一張張圖像組成的,利用人眼不能夠分辨出時間間隔在25毫秒內(nèi)的動態(tài)圖像變化這一特性,當(dāng)這些連續(xù)圖像被放映時,從視覺效果上給人以動的感覺。高級編程技術(shù)的實現(xiàn)動畫技術(shù):簡單的實現(xiàn)方法利用cleardevice()和delay()函數(shù)相互配合,先畫一幅圖形,讓它延遲一個時間,然后清屏,再畫另一幅,如此反復(fù),形成動態(tài)效果。高級編程技術(shù)的實現(xiàn)動畫技術(shù):利用動態(tài)開辟圖視口利用圖視口設(shè)置技術(shù),可以實現(xiàn)圖視口動畫效果例如可在不同圖視口中設(shè)置同樣的圖像,而讓圖視口沿x軸方向移動設(shè)置,這次出現(xiàn)前要清除上次圖視口的內(nèi)容,這樣就會出現(xiàn)圖像沿x軸移動的效果。也就是,在位置動態(tài)變化,但大小不變的圖視口中(用setviewpot()函數(shù)),設(shè)置固定圖形(也可是微小變化的圖像),這樣雖呈現(xiàn)在觀察者面前的是當(dāng)前圖視口位置在動態(tài)變化,但視覺上卻象是看到圖像在屏幕上動態(tài)變化一樣。高級編程技術(shù)的實現(xiàn)動畫技術(shù):利用動態(tài)開辟圖視口應(yīng)用實例源程序#include<graphics.h>#include<dos.h>main(){

int

i,graphdriver,graphmode;

graphdriver=DETECT;

initgraph(&graphdriver,&graphmode,“”);for(i=0;i<25;i++){ setfillstyle(1,i);

movebar(i*20);}

closegraph();}

movebar(int

xorig)/*設(shè)窗口并畫填色小立方體*/{ setviewport(xorig,0,639,199,1); setcolor(5); bar3d(10,120,60,150,40,1); floodfill(70,130,5); floodfill(30,110,5); delay(250000);

clearviewport();}高級編程技術(shù)的實現(xiàn)動畫技術(shù):利用動態(tài)開辟圖視口不斷的沿x軸開辟圖視窗口,就像一個大小一樣的窗口沿x軸在移動,由于總有clearviewport函數(shù)清除上次窗口的相同立方體,因而視覺效果上,就像一個立方體從左向右移動一樣。程序中定義的movebar函數(shù)作用是開辟一個圖視窗口,并畫一個填色的立方體,保留一陣(delay(250000))然后清除它,主程序不斷調(diào)用它,因每次頂點x坐標(biāo)在增加,因而效果是立方體沿x軸從左向右在運動。應(yīng)用實例例程說明高級編程技術(shù)的實現(xiàn)動畫技術(shù)采用上面的兩種方法對較復(fù)雜圖形不宜:一、畫圖形要占較長時間,二、圖視口位置切換的時間就變得較長,因而動畫效果就會變差。高級編程技術(shù)的實現(xiàn)動畫技術(shù):屏幕圖像存儲再放同制作幻燈片一樣,將整個動畫過程變成一個個片斷,然后存到顯示緩沖區(qū)內(nèi),當(dāng)把它們按順序重放到屏幕上時,就出現(xiàn)了動畫效果,這可以用getimage()和putimage()函數(shù)來實現(xiàn)。這種方法較快,因它已事先將要重放的畫面畫好,之后要做的事就是計算應(yīng)在什么位置重放存放好的屏幕圖像了。高級編程技術(shù)的實現(xiàn)動畫技術(shù):頁交替的方法圖形方式下存儲在VRAM中的一滿屏圖像信息稱為一頁,每頁一般為64K字節(jié),VRAM可以存儲要顯示的圖像幾個頁。通過設(shè)置顯示頁函數(shù),激活不同顯示頁實現(xiàn)動畫效果。TurboC支持頁的功能有限,按在圖形方式下顯示的模式最多支持4頁(EGALO顯示方式),一般為兩頁(注意對CGA,僅有一頁),因存儲圖像的頁顯示時,一次只能顯示一頁,因此必須設(shè)定某頁為當(dāng)前顯示的頁(又稱可視頁),缺省時定為0頁。高級編程技術(shù)的實現(xiàn)動畫技術(shù):頁交替的方法當(dāng)前顯示頁(可視頁):當(dāng)前顯示在屏幕上的頁面當(dāng)前編輯頁(激活頁):正在由用戶編輯圖形的頁。這個頁不等于顯示頁,即若用戶不設(shè)定該頁為當(dāng)前顯示頁時,在該頁上編輯的圖形將不會在屏幕上顯示出來。缺省時,設(shè)定0頁為當(dāng)前編輯頁,又為當(dāng)前顯示頁。高級編程技術(shù)的實現(xiàn)動畫技術(shù):頁交替的方法

設(shè)置激活頁和顯示頁的函數(shù)如下:voidfarsetactivepage(int

pagenum);voidfarsetvisualpage(int

pagenum);這兩個函數(shù)只能用于EGA、VGA等顯示適配器。前者設(shè)置由pagenum指出的頁為激活的頁,后者設(shè)置可顯示的頁。當(dāng)設(shè)定了激活的頁,即編輯頁后,則程序中其后的畫圖操作均在該頁進行,若它不定為顯示頁,則其上的圖像信息并不會在屏幕上顯示出來。高級編程技術(shù)的實現(xiàn)動畫技術(shù):頁交替的方法首先設(shè)置l頁為編輯頁,在上面畫出一個紅色邊框、用淡綠色填充的圓,此圖并不顯示出來(因缺省時,定義0頁為可視頁)。接著又定義0頁為編輯頁并清屏,也定義0頁為可視頁,并在其上畫出一個用洋紅色填充的方塊,該方塊將在屏幕上顯示出來。接著進入do循環(huán),設(shè)置l頁為可視頁,因而其上的圓便在屏幕上顯示出來,方塊的圖像消失,用delay(2000)將圓圖像保持2000毫秒即2秒,當(dāng)不按鍵時,下一次循環(huán)又將0頁設(shè)為可視頁,因而方塊的圖像顯示出來,圓圖像又消失。保持2秒后,又重復(fù)剛開始的過程。這樣我們就會看到:屏幕上同一位置洋紅色圓和淡綠色方塊交替出現(xiàn),若將delay時間變少,將會出現(xiàn)動畫的效果。應(yīng)用實例例程描述高級編程技術(shù)的實現(xiàn)動畫技術(shù):頁交替的方法應(yīng)用實例源程序#include<graphics.h>#include<dos.h>main(){

int

i,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();

closegraph();}高級編程技術(shù)的實現(xiàn)主要內(nèi)容操作手段顯示方式圖形繪制技術(shù)圖像技術(shù)動畫技術(shù)發(fā)聲技術(shù)漢字顯示技術(shù)精確的時間控制技術(shù)高級編程技術(shù)的實現(xiàn)發(fā)聲技術(shù)計算機發(fā)聲原理:在揚聲器電路中,定時器的頻率決定了揚聲器發(fā)音的頻率,通過設(shè)定定時器電路的頻率使揚聲器發(fā)出不同的聲音。發(fā)聲函數(shù):voidsound(unsignedfrequency);

-入口參數(shù)為揚聲器要產(chǎn)生聲音的頻率。 voidnosound(void); -函數(shù)用于關(guān)閉揚聲器。高級編程技術(shù)的實現(xiàn)發(fā)聲技術(shù):聲音函數(shù)voidsound(unsignedfrequency);

-入口參數(shù)為揚聲器要產(chǎn)生聲音的頻率。voidnosound(void); -函數(shù)用于關(guān)閉揚聲器。voiddelay(unsignedmilliseconds);

-延時函數(shù)。高級編程技術(shù)的實現(xiàn)發(fā)聲技術(shù):例程應(yīng)用實例每間隔10000millisecondspc揚聲器發(fā)出不同頻率的聲音,直到頻率大于5000hz。/*該程序每間隔10000millisecondspc揚聲器發(fā)出不同頻率的聲音,直到頻率大于5000hz*/#include<dos.h>main(){

intfreq;for(freq=50;freq<5000;freq+=50){sound(freq);delay(10000);}

nosound();}高級編程技術(shù)的實現(xiàn)發(fā)聲技術(shù):計算機樂譜思路:將各個頻率存儲在一個二維數(shù)組中,根據(jù)音階字符、音符和節(jié)拍數(shù),得到發(fā)音的音長,使用sound函數(shù)發(fā)音,使用delay函數(shù)控制。高級編程技術(shù)的實現(xiàn)發(fā)聲技術(shù):計算機樂譜步驟:首先應(yīng)有一張頻率與音階的對照表,然后定義音長基準(zhǔn)、音階和節(jié)拍數(shù),例如,音長基準(zhǔn)一般為300、600、900、1200,音階的設(shè)置如下:最高音:在音符前加“E”;高音:在音符前加“H”;中音:在音符前加“M”;低音:在音符前加“L”;高級編程技術(shù)的實現(xiàn)發(fā)聲技術(shù):計算機樂譜節(jié)拍數(shù)以0.5表示,每個音的音長=音長基數(shù)×節(jié)拍數(shù)。接著將原樂譜轉(zhuǎn)換成計算機樂譜,如:在計算機中可以表述為:

600H10.5H10.5

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論