8.1.3大型趣味程序設計基礎 - 高級編程技術的實現-教學課件_第1頁
8.1.3大型趣味程序設計基礎 - 高級編程技術的實現-教學課件_第2頁
8.1.3大型趣味程序設計基礎 - 高級編程技術的實現-教學課件_第3頁
8.1.3大型趣味程序設計基礎 - 高級編程技術的實現-教學課件_第4頁
8.1.3大型趣味程序設計基礎 - 高級編程技術的實現-教學課件_第5頁
已閱讀5頁,還剩146頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

bioskey(int

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

bioskey(int

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

bioskey(int

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

getKeySCode(){ unionREGSrg;

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

高級編程技術的實現操作手段:鍵盤——方法三int

kbhit(void);

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

高級編程技術的實現操作手段:鼠標DOS操作系統和TurboC2.0并不支持鼠標器的操作。要操縱鼠標器,首先必須安裝相應的鼠標驅動程序。鼠標驅動程序由生產鼠標的廠家提供,它提供了許多鼠標操作的功能。這些功能可以通過INT33H鼠標中斷調用來使用。——原理高級編程技術的實現操作手段:鼠標——常用功能/* 顯示鼠標器光標 */voidcursorOn() {unionREGSr;

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

*/

msvisible=TRUE;int86x(0x33,&r,&r,&s);}高級編程技術的實現/* 關閉鼠標器光標 */voidcursorOff() {unionREGSr;

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

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

操作手段:鼠標——常用功能高級編程技術的實現/*設定鼠標光標的初始位置*/voidcursorXY(unsigned

intx,unsignedinty){unionREGSr;

structSREGs;r.x.ax=4; /*4號鼠標器功能:設置鼠標光標位置

*/

r.x.cx=x;/*設定光標x坐標*/

r.x.dx=y;/*設定光標y坐標*/

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

mousex=x;mousey=y;}

操作手段:鼠標——常用功能高級編程技術的實現/*報告鼠標器當前光標位置和當前按鍵狀態*/voidmouseRead() {unionREGSrl,r2;

structSREGSs;r1.x.ax=3;/*3號鼠標器功能:取按鈕狀態和鼠標位置

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

mousex=r2.x.cx; /* 鼠標器光標x方向坐標 */mousey=r2.x.dx; /* 鼠標器光標y方向坐標 */

mousekey=r2.x.bx; /* 鼠標器按健狀態 */}

操作手段:鼠標——常用功能高級編程技術的實現/*等待鼠標器的某種狀態*/voidwait(inti){do{

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

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

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

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

newmode);。

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

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

int

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

int

cputs(char*str);

int

putch(int

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

清屏函數:

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

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

屏幕文本移動函數:

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

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

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

color),textbackground(int

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

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

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

將graphdriver設成DETECT,initgraph()將調用detectgraph()自動檢測所用顯卡類型,并將相應的驅動程序裝入,并將其最高的顯示模式作為當前顯示模式。

int

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

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

圖形系統的關閉:當畫圖結束時可以通過調用關閉圖形系統的函數:voidfarclosegraph(void);

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

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

palettetypefar*palette);#defineMAXCOLORSl5struct

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

高級編程技術的實現顯示方式:圖形方式——顏色設置EGA/VGA標準色:高級編程技術的實現顯示方式:圖形方式——圖視口設置函數:voidfarsetviewport(int

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

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

voidfarouttextxy(int

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

int

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

horiz,int

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

定義文本字型函數:

voidfarsettextstyle(int

font,int

direction,intcharsize);

高級編程技術的實現#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");應用實例程序源代碼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();}顯示方式:圖形方式——文本輸出高級編程技術的實現應用實例程序輸出顯示方式:圖形方式——文本輸出高級編程技術的實現主要內容操作手段顯示方式圖形繪制技術動畫技術發聲技術漢字顯示技術圖像技術精確的時間控制技術高級編程技術的實現圖形繪制voidfarmoveto(int

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

dx,int

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

畫點函數:

voidfarputpixel(int

x,int

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

intfargetpixel(int

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

:點和線高級編程技術的實現圖形繪制:點和線

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

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

dx,int

dy);

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

高級編程技術的實現

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

linestyle,unsigned

upattern,intthickness);

定義線的類型和粗細。

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

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

AH=0CH,功能為畫點。這時AL中設置的值為顏色號,CX和DX的值決定畫點的位置坐標。圖形繪制:點和線——利用BIOS調用高級編程技術的實現#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);/*調用中斷0x10*/for(i=0;i<256;i++)for(j=0;j<200;j++){

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

應用實例在屏幕上畫出顏色不同的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調用高級編程技術的實現圖形繪制:矩形、圓和弧線

畫矩形的函數:voidfarrectangle(int

xl,inty1,intx2,inty2);

畫橢圓、圓和扇形圖函數: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);高級編程技術的實現編寫程序,使用鼠標進行如下操作:按住鼠標器的任意鍵并移動,十字光標將隨鼠標而移動,根據按鍵的不同采用不同的形狀來畫出相應的移動軌跡:當僅按下左鍵時用圓圈;僅按下右鍵時用矩形;其它按鍵情況用線條。

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

應用實例設計思想圖形繪制高級編程技術的實現應用實例程序運行截圖圖形繪制高級編程技術的實現圖形繪制:封閉圖形的填色

填充設置函數:voidfarsetfillstyle(int

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

高級編程技術的實現圖形繪制:封閉圖形的填色

填充設置函數:voidfarsetfillstyle(int

pattern,intcolor)高級編程技術的實現圖形繪制:封閉圖形的填色

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

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

高級編程技術的實現圖形繪制:封閉圖形的填色

得到目前的填充模式和顏色的函數

voidfarfillsettings(struct

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

高級編程技術的實現圖形繪制:封閉圖形的填色

可填充的基本圖形函數:(這些函數繪制的圖形,將根據事先用setfillstyle函數設置的填充模式和顏色,或按缺省方式進行填充)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);高級編程技術的實現圖形繪制:封閉圖形的填色

可對任意封閉圖形填充的函數:

voidfarfloodfill(int

x,int

y,intborder);

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

高級編程技術的實現#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);

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

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);/*用深藍色填充*/

sprintf(s,“Let‘sstudyTurboC”);

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

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

getch();

closegraph();}

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

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

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

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

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

表3-13操作規定值及操作符號名

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

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

高級編程技術的實現圖像技術:屏幕圖像操作實例應用實例源程序/*保存屏幕圖像*/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);}高級編程技術的實現圖像技術:屏幕圖像操作實例應用實例源程序/*從文件載入圖像*/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++) /*讀滿屏信息字節數*/

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

fclose(fp);

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

偏移量域的名稱大小內容

圖像文件頭

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

偏移量域的名稱大小內容

圖像信息頭

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

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

struct

tagBITMAPFILEHEADER{

int

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

intbfReserved1;/*保留,必須設置為0*/

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

struct

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

int

biPlanes;/*必須為1*/

int

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

struct

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

r.x.ax=0x4f05;

r.x.bx=0;

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

/*設置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);}應用實例程序片段高級編程技術的實現圖像技術:SVGA模式顯示BMP圖像實例/*獲取當前SVGA屏幕模式*/unsignedintget_SVGA_mode(){ unionREGSr; r.x.ax=0x4f03; int86(0x10,&r,&r);

return(r.x.bx);}應用實例程序片段高級編程技術的實現圖像技術:SVGA模式顯示BMP圖像實例/*設置調色板*/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); }}應用實例程序片段高級編程技術的實現主要內容操作手段顯示方式圖形繪制技術圖像技術動畫技術發聲技術漢字顯示技術精確的時間控制技術高級編程技術的實現動畫技術在實際應用中,經常會遇到要求產生動態畫面的情況電影或動畫片是由一張張圖像組成的,利用人眼不能夠分辨出時間間隔在25毫秒內的動態圖像變化這一特性,當這些連續圖像被放映時,從視覺效果上給人以動的感覺。高級編程技術的實現動畫技術:簡單的實現方法利用cleardevice()和delay()函數相互配合,先畫一幅圖形,讓它延遲一個時間,然后清屏,再畫另一幅,如此反復,形成動態效果。高級編程技術的實現動畫技術:利用動態開辟圖視口利用圖視口設置技術,可以實現圖視口動畫效果例如可在不同圖視口中設置同樣的圖像,而讓圖視口沿x軸方向移動設置,這次出現前要清除上次圖視口的內容,這樣就會出現圖像沿x軸移動的效果。也就是,在位置動態變化,但大小不變的圖視口中(用setviewpot()函數),設置固定圖形(也可是微小變化的圖像),這樣雖呈現在觀察者面前的是當前圖視口位置在動態變化,但視覺上卻象是看到圖像在屏幕上動態變化一樣。高級編程技術的實現動畫技術:利用動態開辟圖視口應用實例源程序#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)/*設窗口并畫填色小立方體*/{ 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();}高級編程技術的實現動畫技術:利用動態開辟圖視口不斷的沿x軸開辟圖視窗口,就像一個大小一樣的窗口沿x軸在移動,由于總有clearviewport函數清除上次窗口的相同立方體,因而視覺效果上,就像一個立方體從左向右移動一樣。程序中定義的movebar函數作用是開辟一個圖視窗口,并畫一個填色的立方體,保留一陣(delay(250000))然后清除它,主程序不斷調用它,因每次頂點x坐標在增加,因而效果是立方體沿x軸從左向右在運動。應用實例例程說明高級編程技術的實現動畫技術采用上面的兩種方法對較復雜圖形不宜:一、畫圖形要占較長時間,二、圖視口位置切換的時間就變得較長,因而動畫效果就會變差。高級編程技術的實現動畫技術:屏幕圖像存儲再放同制作幻燈片一樣,將整個動畫過程變成一個個片斷,然后存到顯示緩沖區內,當把它們按順序重放到屏幕上時,就出現了動畫效果,這可以用getimage()和putimage()函數來實現。這種方法較快,因它已事先將要重放的畫面畫好,之后要做的事就是計算應在什么位置重放存放好的屏幕圖像了。高級編程技術的實現動畫技術:頁交替的方法圖形方式下存儲在VRAM中的一滿屏圖像信息稱為一頁,每頁一般為64K字節,VRAM可以存儲要顯示的圖像幾個頁。通過設置顯示頁函數,激活不同顯示頁實現動畫效果。TurboC支持頁的功能有限,按在圖形方式下顯示的模式最多支持4頁(EGALO顯示方式),一般為兩頁(注意對CGA,僅有一頁),因存儲圖像的頁顯示時,一次只能顯示一頁,因此必須設定某頁為當前顯示的頁(又稱可視頁),缺省時定為0頁。高級編程技術的實現動畫技術:頁交替的方法當前顯示頁(可視頁):當前顯示在屏幕上的頁面當前編輯頁(激活頁):正在由用戶編輯圖形的頁。這個頁不等于顯示頁,即若用戶不設定該頁為當前顯示頁時,在該頁上編輯的圖形將不會在屏幕上顯示出來。缺省時,設定0頁為當前編輯頁,又為當前顯示頁。高級編程技術的實現動畫技術:頁交替的方法

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

pagenum);voidfarsetvisualpage(int

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

int

i,graphdriver,graphmode,size,page;

graphdriver=DETECT;

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

cleardevice();setactivepage(1); /*設置l頁為編輯頁*/

setbkcolor(BLUE);

setcolor(RED);setfillstyle(1,10);circle(130,270,30); /*畫圓*/floodfill(130,270,4); /*用淡綠色填充圓*/setactivepage(0); /*設置0頁為編輯頁*/

cleardevice(); /*清0頁*/setfillstyle(1,5);bar(100,210,160,270); /*畫方塊并填充洋紅色*/setvisualpage(0);/*設置0頁為可視頁*/page=1;do{

setvisualpage(page);/*顯示設定頁的圖像*/delay(2000);/*延遲2000ms*/page=1;if(page<0)page=1;}while(!kbhit());

getch();

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

-入口參數為揚聲器要產生聲音的頻率。 voidnosound(void); -函數用于關閉揚聲器。高級編程技術的實現發聲技術:聲音函數voidsound(unsignedfrequency);

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

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

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

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

600H10.5H10.5

溫馨提示

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

評論

0/150

提交評論