



版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 第第3 3章章 高級編程技術的實現高級編程技術的實現 主要內容主要內容操作手段顯示方式圖形繪制技術圖像技術動畫技術發聲技術漢字顯示技術精確的時間控制技術 1第第3 3章章 高級編程技術的實現高級編程技術的實現操作手段:鍵盤操作手段:鍵盤在鍵盤內有一個微處理器,用來掃描和檢測每個鍵的按下和抬起狀態,然后以程序中斷(INT 9H)的方式與主機通信,向主機傳送一個字節的按鍵掃描碼。接著ROM中BIOS內的鍵盤中斷處理程序,將按鍵掃描碼翻譯成對應的ASCII碼或擴充的ASCII碼,存放在AX寄存器中。 它不是它不是ASCIIASCII碼;其碼;其0606位標識位標識了每個鍵在鍵盤上的位置,最了每個鍵
2、在鍵盤上的位置,最高位為高位為0 0對應該鍵是被按下;對應該鍵是被按下;1 1對應松開;它并不能區別大小對應松開;它并不能區別大小寫字母,而且一些特殊鍵不產寫字母,而且一些特殊鍵不產生掃描碼直接引起中斷調用生掃描碼直接引起中斷調用 鍵名AHAL字符鍵ASCII碼ASCII碼功能鍵/組合鍵擴充碼的ASCII碼0原理原理2第第3 3章章 高級編程技術的實現高級編程技術的實現操作手段:鍵盤操作手段:鍵盤方法方法方法一:直接使用聲明在bios.h中的庫函數bioskey();方法二:通過庫函數int86(),調用BIOS的INT 16H、功能 號為0的中斷。它將按鍵的掃描碼存放在AH寄存器 中;方法三
3、:簡單地利用聲明在conio.h中的庫函數kbhit()。3第第3 3章章 高級編程技術的實現高級編程技術的實現操作手段:鍵盤操作手段:鍵盤方法一方法一int bioskey(int cmd)int bioskey(int cmd);/ /* *參數cmd用來確定函數如何操作*/cmd=0bioskey()返回按健的鍵值,該值是2個字節的整型數。若沒有鍵按下,則該函數一直等待若沒有鍵按下,則該函數一直等待,直到有鍵按下。當按下時,若返回值的低8位為非零,則表示為普通鍵,其值代表該鍵的ASCII碼。若返回值的低8位為0,則高8位表示為擴展的ASCII碼,表示按下的是特殊功能鍵4第第3 3章章 高
4、級編程技術的實現高級編程技術的實現操作手段:鍵盤操作手段:鍵盤方法一方法一int bioskey(int cmd)int bioskey(int cmd);/ /* *參數cmd用來確定函數如何操作*/cmd=1bioskey()查詢是否有鍵按下。若返回非0值,則表示有鍵按下,若為0表示沒鍵按下。5第第3 3章章 高級編程技術的實現高級編程技術的實現操作手段:鍵盤操作手段:鍵盤方法一方法一int bioskey(int cmd)int bioskey(int cmd);/ /* *參數cmd用來確定函數如何操作*/cmd=2bioskey()將返回一些控制鍵是否被按過,按過的狀態由該函數返回的
5、低8位的各位值來表示: 字節位 對應的16進制數含義 0 0 x01右邊的shift鍵被按下 1 0 x02 左邊的shift鍵被按下 2 0 x04Ctrl鍵被按下 3 0 x08 Alt鍵被按下 4 0 x10 Scroll Lock已打開 5 0 x20Num Lock已打開 6 0 x40Caps Lock已打開 7 0 x80 Insert已打開6第第3 3章章 高級編程技術的實現高級編程技術的實現操作手段:鍵盤操作手段:鍵盤方法二方法二/* 讀鍵函數,返回掃描碼 */int getKeySCode()union REGS rg; rg.h.ah=0;int86(0 x16,&
6、;rg,&rg);return rg.h.ah; 7鍵盤掃描碼表見課程主頁鍵盤掃描碼表見課程主頁第第3 3章章 高級編程技術的實現高級編程技術的實現操作手段:鍵盤操作手段:鍵盤方法三方法三int kbhit(void); 若按了鍵盤,該函數返回值1,否則返回值0。 8第第3 3章章 高級編程技術的實現高級編程技術的實現操作手段:鼠標操作手段:鼠標DOS操作系統和Turbo C 2.0并不支持鼠標器的操作。要操縱鼠標器,首先必須安裝相應的鼠標驅動程序。鼠標驅動程序由生產鼠標的廠家提供,它提供了許多鼠標操作的功能。這些功能可以通過INT 33H鼠標中斷調用來使用。原理原理9第第3 3章章
7、高級編程技術的實現高級編程技術的實現操作手段:鼠標操作手段:鼠標常用功能常用功能/*顯示鼠標器光標*/void cursorOn() union REGS r; struct SREGS s; r.x.ax1; /* 1號鼠標器功能:顯示鼠標光標 */ msvisibleTRUE; int86x(0 x33,&r,&r,&s); 10第第3 3章章 高級編程技術的實現高級編程技術的實現/*關閉鼠標器光標*/void cursorOff() union REGS r; struct SREGS s; r.x.ax2; /* 2號鼠標器功能 :不顯示鼠標光標 */ msvi
8、sibleFALSE; int86x(0 x33,&r,&r,&s); 操作手段:鼠標操作手段:鼠標常用功能常用功能11第第3 3章章 高級編程技術的實現高級編程技術的實現/*設定鼠標光標的初始位置*/void cursorXY(unsigned int x, unsigned int y) union REGS r; struct SREG s; r.x.ax=4; /* 4號鼠標器功能:設置鼠標光標位置 */ r.x.cx=x; /* 設定光標x坐標 */ r.x.dx=y; /* 設定光標y坐標 */ int86x(0 x33,&r,&r,&
9、;s); mousex=x; mousey=y; 操作手段:鼠標操作手段:鼠標常用功能常用功能12第第3 3章章 高級編程技術的實現高級編程技術的實現/*報告鼠標器當前光標位置和當前按鍵狀態*/void mouseRead() union REGS rl,r2; struct SREGS s; r1.x.ax=3; /* 3號鼠標器功能:取按鈕狀態和鼠標位置 */ int86x(0 x33,&r1,r2,&s); mousex=r2.x.cx;/*鼠標器光標x方向坐標*/ mousey=r2.x.dx;/*鼠標器光標y方向坐標*/ mousekey=r2.x.bx; /*鼠標器
10、按健狀態*/ 操作手段:鼠標操作手段:鼠標常用功能常用功能13第第3 3章章 高級編程技術的實現高級編程技術的實現/*等待鼠標器的某種狀態*/void wait(int i) do mouseread(); while(mousekey=i); 操作手段:鼠標操作手段:鼠標常用功能常用功能14第第3 3章章 高級編程技術的實現高級編程技術的實現主要內容主要內容操作手段顯示方式圖形繪制技術圖像技術動畫技術發聲技術漢字顯示技術精確的時間控制技術 15第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:顯示系統顯示方式:顯示系統顯卡在計算機主機和顯示器之間起到了信息轉換和視頻發送作用,必須
11、與顯示器配套。不同種類的顯卡支持的顯示模式種類不同,而且同一顯卡一般可以支持多種顯示模式。一種顯示模式指定了相應顯示器的工作方式、分辨率和顏色數目。 顯顯 卡卡16第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:顯示系統顯示方式:顯示系統 常見顯卡及其模式常見顯卡及其模式17第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:顯示系統顯示方式:顯示系統 顯示器工作方式顯示器工作方式顯示器有兩種工作方式,即文本顯示方式和圖形顯示方式,它們的主要差別是顯示存儲器(VRAM)中存的信息不同。文本方式時,VRAM存放要顯示字符的ASCII碼,用它作為地址,取出字符發生器ROM中
12、存放的相應字符的圖像變成視頻信號在顯示器屏幕上進行顯示。圖形方式時,則要顯示的圖形的圖像直接存在VRAM中,VRAM中某地址單元存放的數就表示了相應屏幕上某行和列上的像素及顏色。 18第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:顯示方式:也稱作字符顯示方式,是Turbo C確省的顯示方式。文本方式屏幕的最大分辨單位是單個字符,字符顯示的位置用行和列坐標來表示。文本方式文本方式19第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:文本方式顯示方式:文本方式方式設定方式設定Turbo C支持的幾種文本顯示方式可以用下面的函數來設置: void textmode(int
13、 newmode);。 20第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:文本方式顯示方式:文本方式顏色設置顏色設置void textbackground(int color);/*設置字符背景顏色*/void textcolor(int color); /*設置字符顏色*/void textattr(int attr);/ /* *可同時設置文本的字符和背景顏色*/ 顏色函數顏色函數21第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:文本方式顯示方式:文本方式窗口設置窗口設置Turbo C確省定義的文本窗口為整個屏幕。用戶可以通過函數: void window(
14、int left, int top, int right, int bottom);定義屏幕上的一個矩形域作為窗口窗口。參數(left,top)是窗口左上角所在的屏幕坐標,(right,bottom)是窗口的右下角所在的屏幕坐標。窗口定義之后,用有關窗口的輸入輸出函數就可以只在此窗口內進行操作而不超出窗口的邊界。另外,一個屏幕可以定義多個窗口,但現行窗口只能有一個。 22第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:文本方式顯示方式:文本方式窗口操作窗口操作窗口內文本輸出函數:窗口內文本輸出函數: int cprintf(char *format,表達式表表達式表); int
15、cputs(char *str); int putch(int ch);/*這三個函數受窗口的控制,窗口內顯示光標的位置就是它們開始輸出的位置。當輸出行超過窗口右邊界或輸出到窗口底部邊界時,會自動轉到窗口內的下一行輸出或自動上卷窗口內的內容繼續輸出*/光標操作函數:光標操作函數: void gotoxy(int x, int y); /*把光標移到窗口把光標移到窗口(x,y)處處*/23第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:文本方式顯示方式:文本方式屏幕操作屏幕操作 清屏函數:清屏函數: void clrscr(void); /*清除窗口文本,光標移到清除窗口文本,光標
16、移到(1,1)*/ void clreol(void); /*清除窗口從光標位置開始到本行清除窗口從光標位置開始到本行 結尾的所有字符,但光標不變結尾的所有字符,但光標不變 */ void delline(void); /*刪除當前窗口的當前行刪除當前窗口的當前行*/24第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:文本方式顯示方式:文本方式屏幕操作屏幕操作 屏幕文本移動函數:屏幕文本移動函數: void movetext(int x1, int y1, int x2, int y2, int x3, int y3);屏幕文本存取函數屏幕文本存取函數void gettext(i
17、nt x1, int y1, int x2, int y2, void *buffer);void puttext(int x1, int y1, int x2, int y2, void *buffer); 25第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:文本方式顯示方式:文本方式編制一個程序,將屏幕垂直平分成兩個窗口,左邊窗口為藍色背景,白色前景,右邊窗口為綠色背景,紅色前景。兩個窗口都設計為文本輸入,即在窗口中可以輸入文字,在窗口屏幕中顯示出來。使用tab鍵在左右兩個窗口中切換,每個窗口都有光標,活動窗口光標進行閃爍。 應應用用實實例例 問題描述問題描述26第第3 3章
18、章 高級編程技術的實現高級編程技術的實現顯示方式:文本方式顯示方式:文本方式首先用文本窗口函數window (int x1, int y1, int x2, int y2)畫出兩個窗口,用textcolor (int color),textbackground (int color),clrscr (void)等進行窗口屬性的設置。用tabtab鍵鍵進行兩個窗口間的循環切換,在每次切換前先調用gettext (int left, int top, int right, int bottom, void * buf)函數把當前矩形窗口上的字符拷貝到由buf所指向的內存中,在切換到另一個窗口后調用
19、puttext (int left, int top, int right, int bottom, void * buf)把先前存儲在該窗口buf所指向的內存中的字符拷貝到當前窗口中,并用gotoxy (int x, int y)把光標移到原先所在位置,因此可以接著先前的文本繼續編輯。 應應用用實實例例 設計思想設計思想27第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:文本方式顯示方式:文本方式應應用用實實例例 程序運行截圖程序運行截圖28第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:顯示方式:圖形方式圖形方式圖形顯示方式可以滿足在屏幕上作圖的要求。在此方式下
20、,屏幕顯示的單位是像素。屏幕顯示的像素大小(分辨率)可以通過設置不同的顯示方式來改變。像素在屏幕上的位置可由其所在的x,y坐標來決定。此時,屏幕的坐標系統就象一個倒置的直角坐標系。29第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:圖形方式顯示方式:圖形方式方式設定方式設定圖形系統的初始化:圖形系統的初始化:用什么類型的顯卡的驅動程序采用什么模式的圖形方式適配器驅動程序的尋找路徑名。注意:所用系統的卡一定要支持所選用的顯示模式,否則將出錯。30第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:圖形方式顯示方式:圖形方式方式設定方式設定圖形系統的初始化函數:圖形系統的初
21、始化函數:void far initgraph(int far *pdriver,int far *pmode,char far *ppath_for_driver);enum graphics_driver DETECT,CGA,MCGA,EGA,EGA64,EGAMONO,IBM 8514,HERCMONO,ATT400,VGA,PC3270; 31第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:圖形方式顯示方式:圖形方式方式設定方式設定圖形系統的初始化函數:圖形系統的初始化函數:void far initgraph(int far *pdriver,int far *pmo
22、de,char far *ppath_for_driver);32第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:圖形方式顯示方式:圖形方式方式設定方式設定圖形系統檢測函數圖形系統檢測函數 :void far detectgraph(int far *pdriver,int far *pmode);完成對適配器的檢查并得到顯示器類型號和相應的最高分辨率模式 將graphdriver設成DETECT, initgraph()將調用detectgraph()自動檢測所用顯卡類型,并將相應的驅動程序裝入,并將其最高的顯示模式作為當前顯示模式。 int graphdriver=DETEC
23、T,graphmode;initgraph(&graphdriver,&graphmode,); 33第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:圖形方式顯示方式:圖形方式方式設定方式設定清屏函數:清屏函數:畫圖前一般需清除屏幕,使得屏幕如同一張白紙,以畫最新最美的圖畫。void far cleardevice(void); 圖形系統的關閉:圖形系統的關閉:當畫圖結束時可以通過調用關閉圖形系統的函數: void far closegraph(void); 使顯示器恢復到調用initgraph()函數之前的文本方式。34第第3 3章章 高級編程技術的實現高級編程
24、技術的實現顯示方式:圖形方式顯示方式:圖形方式顏色設置顏色設置前景色設置函數:前景色設置函數:void far setcolor(int color); 背景色設置函數:背景色設置函數:void far setbkcolor(int color);35第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:圖形方式顯示方式:圖形方式顏色設置顏色設置前景色設置函數:前景色設置函數:void far setcolor(int color); 背景色設置函數:背景色設置函數:void far setbkcolor(int color);36第第3 3章章 高級編程技術的實現高級編程技術的實現顯
25、示方式:圖形方式顯示方式:圖形方式顏色設置顏色設置CGA前景色的取值:前景色的取值:37第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:圖形方式顯示方式:圖形方式顏色設置顏色設置CGA背景色的取值:背景色的取值:38第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:圖形方式顯示方式:圖形方式顏色設置顏色設置EGA/VGA調色板:調色板: setcolor(color)時color的取值; 0號索引位置的顏色總是和背景色相同 ;16個索引號意味著同時最多可顯示16種不同的顏色64/256色選一39第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:圖形方式顯示
26、方式:圖形方式顏色設置顏色設置EGA/VGA調色板:調色板:整體設置: void far setallpalette(struct palettetype far *palette);#define MAXCOLORS l5struct palattetype unsigned char size; signed char colorsMAXCOLORS+1;; 單色設置:單色設置:voidfar setpalette(int index, int actual_color); 40第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:圖形方式顯示方式:圖形方式顏色設置顏色設置EGA/
27、VGA標準色:標準色:41第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:圖形方式顯示方式:圖形方式圖視口圖視口設置函數設置函數:void far setviewport(int xl,int y1,int x2,int y2, clipflag); 其中(x1,y1)為圖視口的左上角所在的原屏幕物理坐標,(x2,y2)為右下角所在的原屏幕物理坐標。clipflag參數clipflag若為0,則超出圖視口的圖形部分仍將顯示出來;否則,超出圖視口的部分將被切除而不顯示。清除函數:清除函數:void far clearviewport(void)42第第3 3章章 高級編程技術的實現
28、高級編程技術的實現顯示方式:圖形方式顯示方式:圖形方式文本輸出文本輸出當前位置文本輸出函數:當前位置文本輸出函數: void far outtext(char far *textstring); 定位文本輸出函數:定位文本輸出函數: void far outtextxy(int x,int y,char far *textstring);文本輸出字符串函數文本輸出字符串函數 int sprintf(char *string, char *format, argument, );43第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:圖形方式顯示方式:圖形方式文本輸出文本輸出 文本輸出
29、位置函數:文本輸出位置函數:void far settextjustify(int horiz,int vert); 44第第3 3章章 高級編程技術的實現高級編程技術的實現顯示方式:圖形方式顯示方式:圖形方式文本輸出文本輸出 定義文本字型函數:定義文本字型函數: void far settextstyle(int font,int direction,int char size); 45第第3 3章章 高級編程技術的實現高級編程技術的實現#include main() int i,graphdriver,graphmode,size,page; char s30; graphdriver=D
30、ETECT; initgraph(&graphdriver,&graphmode,); cleardevice(); settextstyle(DEFAULT_FONT,HORIZ_DIR,2); settextjustify(LEFT_TEXT,0); outtextxy(220,20,Defaut font); settextstyle(TRIPLEX_FONT,HORIZ_DIR, 2); settextjustify(LEFT_TEXT,0); outtextxy(220,50,Triplex font);應應用用實實例例 程序源代碼程序源代碼settextstyle(
31、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,Sans serif font);settextstyle(GOTHIC_FONT,HORIZ_DIR, 2);settextjustify(LEFT_TEXT,0);outtextxy(220,140,gothic font);getch(); closegr
32、aph(); 顯示方式:圖形方式顯示方式:圖形方式文本輸出文本輸出46第第3 3章章 高級編程技術的實現高級編程技術的實現應應用用實實例例 程序輸出程序輸出顯示方式:圖形方式顯示方式:圖形方式文本輸出文本輸出47 第第3 3章章 高級編程技術的實現高級編程技術的實現主要內容主要內容操作手段顯示方式圖形繪制技術動畫技術發聲技術漢字顯示技術圖像技術精確的時間控制技術 48第第3 3章章 高級編程技術的實現高級編程技術的實現圖形繪制圖形繪制void far moveto(int x,int y);移動畫筆到指定的(x,y)位置,移動過程不畫。void far moverel(int dx,int d
33、y);畫筆從現行位置(x,y)處移到一位置增量處(x+dx,y+dx),移動過程不畫:int far getx(void);得到當前畫筆的x位置int far gety(void);得到當前畫筆的y位置:畫筆定位:畫筆定位 49第第3 3章章 高級編程技術的實現高級編程技術的實現圖形繪制圖形繪制 畫點函數:畫點函數: void far putpixel(int x,int y,int color);該函數表示在指定的x,y位置畫一點,點的顯示顏色由設置的color值決定。 int far getpixel(int x,int y);該函數與putpixel()相對應,它得到在(x,y)點位置上
34、的像素的顏色值 :點和線:點和線 50第第3 3章章 高級編程技術的實現高級編程技術的實現圖形繪制:圖形繪制: 點和線點和線 畫線函數:畫線函數:void far line(int x0,int y0,int x1,int y1);該函數從(x0,y0)點到(x1,y1)點畫一直線。void far lineto(int x,int y);該函數將從現行畫筆位置到(x,y)點畫一直線。void far linerel(int dx,int dy); 該函數將從現行畫筆位置(x,y)到位置增量處 (x+dx,y+dy)畫一直線。 51第第3 3章章 高級編程技術的實現高級編程技術的實現 線類型的
35、設置:線類型的設置:在確省的情況下,畫線函數畫出的線都是一個像素點寬的細實線。也可以在畫線之前通過函數: void far setlinestyle(int linestyle,unsigned upattern,int thickness); 定義線的類型和粗細。 F 3 D 0setlinestyle(4,0 xF3D0,1)設置的線型設置的線型 圖形繪制:圖形繪制: 點和線點和線 52第第3 3章章 高級編程技術的實現高級編程技術的實現 BIOS的10H中斷負責顯示器服務,該中斷的主要功能通過對AH來設置: AH=00H,功能為設置顯示方式。此時通過對AL進行設置來設定顯示方式,如設置A
36、L=13H,則顯示方式設置為VGA的256色320200圖形顯示模式。 AH=0CH,功能為畫點。這時AL中設置的值為顏色號,CX和DX的值決定畫點的位置坐標。圖形繪制:圖形繪制: 點和線點和線 利用利用BIOS調用調用53第第3 3章章 高級編程技術的實現高級編程技術的實現#include#include int main() int i,j; union REGS inreg,outreg; inreg.h.ah=0; /*置屏幕顯示方式*/ inreg.h.al=0 x13; /* 定義VGA256色320200圖形模式 */ int86(0 x10,&inreg,&ou
37、treg); /*調用中斷0 x10*/ for (i=0;i256;i+) for(j=0;j200;j+) inreg.h.ah=0 x0c;/*寫點*/ 應應用用實實例例在屏幕上畫出顏色不同的在屏幕上畫出顏色不同的256條直線的條直線的程序源代碼程序源代碼 inreg.h.al=i; /*置顏色號*/ inreg.h.ch=0; /*決定畫點位置*/ inreg.h.cl=i; inreg.h.dh=0; inreg.h.dl=j; int86(0 x10,&inreg,&outreg); getch(); inreg.h.ah=0; inreg.h.al=2; /*返回
38、到文本方式*/ int86(0 x10,&inreg,&outreg); 圖形繪制:圖形繪制: 點和線點和線 利用利用BIOS調調用用54第第3 3章章 高級編程技術的實現高級編程技術的實現圖形繪制圖形繪制 :矩形、圓和弧線矩形、圓和弧線 畫矩形的函數:畫矩形的函數:void far rectangle(int xl,int y1,int x2,int y2); 畫橢圓、圓和扇形圖函數:畫橢圓、圓和扇形圖函數: void ellipse(int x,int y,int stangle,int endangel, int xradius,int yradius); void fa
39、r circle(int x,int y,int radius); void far arc(int x,int y,int stangle,int endangle, int radius);55第第3 3章章 高級編程技術的實現高級編程技術的實現編寫程序,使用鼠標進行如下操作:按住鼠標器的任意鍵并移動,十字光標將隨鼠標而移動,根據按鍵的不同采用不同的形狀來畫出相應的移動軌跡:當僅按下左鍵時用圓圈;僅按下右鍵時用矩形;其它按鍵情況用線條。 應應用用實實例例 問題描述問題描述圖形繪制圖形繪制56第第3 3章章 高級編程技術的實現高級編程技術的實現結合鼠標使用方法和上述的圖形繪制函數來解決問題。
40、由于在Windows2000/XP下不支持INT 33的1號顯示鼠標光標功能,可以用畫線函數line()畫出一個十字形光標。光標的移動是通過將原位置光標用背景色再畫而使其消失,然后在新位置處重新畫一個光標,從而實現光標移動的動感。 應應用用實實例例 設計思想設計思想圖形繪制圖形繪制57第第3 3章章 高級編程技術的實現高級編程技術的實現應應用用實實例例 程序運行截圖程序運行截圖圖形繪制圖形繪制58第第3 3章章 高級編程技術的實現高級編程技術的實現圖形繪制:圖形繪制:封閉圖形的填色封閉圖形的填色 填充設置函數填充設置函數 :void far setfillstyle(int pattern,i
41、nt color);該函數將用設定的color顏色和pattern圖模式對后面畫出的輪廓圖進行填充,這些圖輪廓是由待定函數畫出的。 59第第3 3章章 高級編程技術的實現高級編程技術的實現圖形繪制:圖形繪制:封閉圖形的填色封閉圖形的填色 填充設置函數填充設置函數 :void far setfillstyle(int pattern,int color)60第第3 3章章 高級編程技術的實現高級編程技術的實現圖形繪制:圖形繪制:封閉圖形的填色封閉圖形的填色 用戶自定義填充函數用戶自定義填充函數: void far setfillpattern(char upattefn,int color);該
42、函數設置用戶自定義可填充模式,以color指出的顏色對封閉圖形進行填充。參數upattern是一個指向8個字節存儲區的指針,這8個字節表示了一個88像素點陣組成的填充圖模,它是由用戶自定義的,用來對封閉圖形填充。8個字節的圖模是這樣形成的:每個字節代表一行,而每個字節的每一個二進制位代表該行的對應列上的像素。是1,則用color顯示,是0則不顯示。 61第第3 3章章 高級編程技術的實現高級編程技術的實現圖形繪制:圖形繪制:封閉圖形的填色封閉圖形的填色 得到目前的填充模式和顏色的函數得到目前的填充模式和顏色的函數 : void far fillsettings(struct fillsetti
43、ngstype far *fillinfo); void far getfillpattern(char void far getfillpattern(char * *upattern)upattern); 62第第3 3章章 高級編程技術的實現高級編程技術的實現圖形繪制:圖形繪制:封閉圖形的填色封閉圖形的填色 可填充的基本圖形函數:可填充的基本圖形函數: (這些函數繪制的圖形,將根據事先用setfillstyle函數設置的填充模式和顏色,或按缺省方式進行填充 ) void bar(int x1,int y1,int x2,int y2); void far pieslice(int x,i
44、nt y,int stangle,int endangle,int radius); void far bar3d(int x1,int y1,int x2,int y2,int depth,int topflag);void far sector(int x,int y,int stangle,int endang1e,int xradius,int yradius);void far fillellipse(int x,int y,int xradius,int yradius); void far fillpoly(int numpoints,int far polypoints);63
45、第第3 3章章 高級編程技術的實現高級編程技術的實現圖形繪制:圖形繪制:封閉圖形的填色封閉圖形的填色 可對任意封閉圖形填充的函數可對任意封閉圖形填充的函數 : void far floodfill(int xvoid far floodfill(int x,int yint y,int border)int border); 該函數將對任一封閉圖形進行填充,其顏色和模式將由設定的或缺省的圖模與顏色決定。其中參數(x,y)為封閉圖形中的任一點,border是封閉圖形的邊框顏色。編程時該函數位于畫封閉圖形(即要填充的圖形)的代碼之后。 64第第3 3章章 高級編程技術的實現高級編程技術的實現#in
46、clude main() int i, graphdriver,graphmode,size,page; char s30; 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); /*用綠色填充矩形框*/ recta
47、ngle(20,20,540,380); setfillstyle(1,13); floodfill(2l,300,14); /*用淡洋紅色填充矩形框*/ setcolor(BLACK); 應應用用實實例例 程序源代碼程序源代碼 settextstyle(1,0,6); /*設置字形方向,尺寸*/ outtextxy(100,60,Welcom You); setviewport(100,200,540,380,0); setcolor(14); setfillstyle(1,12); rectangle(20,20,420,120); settextstyle(2,0,9); floodfi
48、ll(21,100,14); /*用深藍色填充*/ sprintf(s,“Lets study Turbo C”); setcolor(YELLOW); outtextxy(60,40, s);/*用黃色顯示*/ setcolor(1); settextstyle(4,0,3); outtextxy(110,80,s); getch(); closegraph(); 圖形繪制圖形繪制65第第3 3章章 高級編程技術的實現高級編程技術的實現應應用用實實例例 程序輸出程序輸出圖形繪制圖形繪制66 第第3 3章章 高級編程技術的實現高級編程技術的實現主要內容主要內容操作手段顯示方式圖形繪制技術圖像技
49、術動畫技術發聲技術漢字顯示技術精確的時間控制技術 67第第3 3章章 高級編程技術的實現高級編程技術的實現圖像技術圖像技術:圖像的二種來源圖像的二種來源(1)屏幕圖像:在圖形方式下所繪圖形形成的像素點圖像 。圖像數據直接存儲在VRAM中,VRAM中某地址單元存放的數就表示了相應屏幕上某行和列上的像素及其顏色值 。(2)圖像文件:圖像數據以一定的格式存儲在文件中。需要有專門的軟件來支持,或自己編寫程序來讀取、顯示和生成某種格式的圖像文件。首先必須要了解某種圖像文件的格式。68第第3 3章章 高級編程技術的實現高級編程技術的實現圖像技術:屏幕圖像與圖像技術:屏幕圖像與VRAM直接寫屏:在圖形方式下
50、將圖像數據直接寫入VRAM的過程,即圖像顯示過程。直接寫屏是最快的圖像顯示方法。69第第3 3章章 高級編程技術的實現高級編程技術的實現圖像技術:圖像技術:VRAM與系統存儲器的對應關系與系統存儲器的對應關系q CGA的VRAM對應的內存地址開始于B8000H,VGA、EGA的開始于A0000H。q對CGA,VRAM僅有16K字節;對VGA和EGA,VRAM可達256K字節,它分成獨立的4個64K字節部分,這樣的每個部分稱為一個位面或頁面(編號0-3),它們共同占有一塊內存空間,即用同一的64K個地址。相應內存的每個地址實際上代表VRAM4個位面上相并列的4個字節。q 對于SVGA,由于它要存
51、取更高分辨率或更多顏色的數據,一般都至少擁有512K以上的VRAM,但其所占用的內存地址仍大都是64K,因此也需要劃分許多頁面,對應到A0000H或其它的視頻內存地址上。 70第第3 3章章 高級編程技術的實現高級編程技術的實現圖像技術:屏幕圖像的允許讀寫過程圖像技術:屏幕圖像的允許讀寫過程q允許讀的過程是:首先通過索引寄存器(接口地址為0 x3ce)選擇讀位面選擇寄存器(其索引號為4),然后通過讀位面選擇寄存器(接口地址0 x3cf)選擇位面號。相應的代碼為:outportb(0 x3ce, 4); /*將索引號4送索引寄存器,選擇讀位面選擇寄存器*/outportb(0 x3cf, n);
52、 /*將選擇的位面號n送讀位面選擇寄存器,允許該位面可讀*/71第第3 3章章 高級編程技術的實現高級編程技術的實現圖像技術:屏幕圖像的讀寫過程圖像技術:屏幕圖像的讀寫過程q允許寫的過程是:首先通過索引寄存器(接口地址為0 x3c4)選擇位面寫允許寄存器(索引號為2),然后通過接口地址0 x3c5選擇位面號。相應的代碼為:outportb(0 x3c4, 2); /*將索引號2送索引寄存器,選擇位面寫允許寄存器*/outportb(0 x3c5, k); /*送位面號至位面寫允許寄存器,允許該位面可寫*/72第第3 3章章 高級編程技術的實現高級編程技術的實現圖像技術:屏幕圖像數據在圖像技術:
53、屏幕圖像數據在VRAM中存放格式中存放格式 qCGA的4色320200的模式,視頻內存起始地址B0000H。屏幕上顯示的像素點從左到右,從上到下依次存在VRAM從0號地址開始的連續地址中,每個像素占2位,VRAM每個字節存放四個像素點。q特殊的地方:屏幕上顯示的偶行像素存在16KVRAM的上半部,而奇行存在下半部。從系統地址看,上半部開始于B800:0000,下半部開始于B800:1000。73第第3 3章章 高級編程技術的實現高級編程技術的實現圖像技術:屏幕圖像數據在圖像技術:屏幕圖像數據在VRAM中存放格式中存放格式 qVGA視頻內存起始地址A0000H,在16色640480模式下采用位面
54、對應方式,視頻內存地址上每一個字節代表8個像素,每一位又可對應到位面中同樣位置的4位上(4位的組合表示16色之一,因此又稱位面為顏色位面)。q在屏幕上繪出一個點時,就必須將數據分別存放到四個位面中對應的位上。74第第3 3章章 高級編程技術的實現高級編程技術的實現圖像技術:屏幕圖像數據在圖像技術:屏幕圖像數據在VRAM中存放格式中存放格式 q在256色320200模式下采用的是線性對應的方法(SVGA的所有256色和真彩都是用這種方法)。q線性對應將屏幕上每一點與視頻內存地址按順序一一對應起來,一個點對應一個字節,這樣做的好處是:這種對應方式比位面對應方式簡單多了,因為只需直接對視頻內存地址做
55、存取即可,而不必理會位面與內存地址的對應關系。 75第第3 3章章 高級編程技術的實現高級編程技術的實現圖像技術:屏幕圖像的操作圖像技術:屏幕圖像的操作函數名 含義unsigned far imagesize(int x1,int y1,int x2,int y2);測定圖像所占字節數void far getimage(int x1,int y1,int x2,int y2,void far *bitmap);屏幕圖像存儲void far putimage(int x1,int y1,void far *bitmap,int op);顯示所存屏幕圖像 屏幕圖像的存儲和顯示操作函數76第第3 3
56、章章 高級編程技術的實現高級編程技術的實現圖像技術:圖像像素與背景像素的邏輯操作圖像技術:圖像像素與背景像素的邏輯操作 表表3-13 3-13 操作規定值及操作操作規定值及操作符號名 值含義COPY_PUT0存儲圖像進行覆蓋XOR_PUT1對應像素點進行異或操作OR_PUT2對應像素點進行或操作AND_PUT3對應像素點進行與操作NOT_PUT4存儲圖像取反后進行覆蓋77第第3 3章章 高級編程技術的實現高級編程技術的實現圖像技術:圖像技術:屏幕圖像操作實例繪制滿屏的16色圓和長方形,并將屏幕圖像保存到文件pic.dat中。然后將保存在文件pic.dat的屏幕圖像重新顯示在VGA屏幕上。 應應
57、用用實實例例 問題描述問題描述78第第3 3章章 高級編程技術的實現高級編程技術的實現圖像技術:圖像技術:屏幕圖像操作實例應應用用實實例例注意事項注意事項1)VGA的VRAM起始地址為A0000H,開始單元的地址為0 xA000:0 x0000。 2)存取對應屏幕圖像VRAM中的信息時,其開始地址指針定義為:ptr=(charfar*)0 xa0000000L; 3)由于程序將顯示模式設置為VGAHI模式,分辨率是640480,16色,每個像素由每個位面上的1位組成,即一個字節代表8個像素,故對應的內存地址是從A0000H開始的38400個字節地址。4)由于系統初始化時,讀位面選擇寄存器設置為
58、位面0,程序最后應恢復原系統初始化設置。 79第第3 3章章 高級編程技術的實現高級編程技術的實現圖像技術:圖像技術:屏幕圖像操作實例應應用用實實例例源程序源程序/*保存屏幕圖像*/void save_pic(char *fname) FILE *fp; int i; long j; char far *ptr; fp=fopen(fname,wb); for (i=0;i4; i+) outportb(0 x3ce, 4); /*選擇讀位面選擇寄存器*/ outportb(0 x3cf, i);/*允許位面i可讀*/ ptr=(char far*)0 xa0000000L; /*VGA的VR
59、AM指針*/ for (j=0;j38400L;j+) fputc(*ptr, fp); ptr+; fclose(fp); outport(0 x3cf,0);80第第3 3章章 高級編程技術的實現高級編程技術的實現圖像技術:圖像技術:屏幕圖像操作實例應應用用實實例例源程序源程序/*從文件載入圖像*/void load_pic(char *fname) FILE *fp; int i,k=1; long j; char far *ptr; fp=fopen(fname,rb); for (i=0;i4; i+) outportb(0 x3c4, 2); /*選擇位面寫允許寄存器*/ outp
60、ortb(0 x3c5, k); /*選擇位面號*/ ptr=(char far*)0 xa0000000L; /*VGA的VRAM指針*/ for (j=0;j38400L;j+) /*讀滿屏信息字節數*/ *ptr=fgetc(fp); /*從文件中將圖像信息字節寫到 VRAM中*/ptr+; /*字節地址加1*/ k=k*2; fclose(fp); getch(); outport(0 x3c5,0 xf); /*恢復位面允許寫寄存器的缺省值*/81第第3 3章章 高級編程技術的實現高級編程技術的實現圖像技術:圖像文件圖像技術:圖像文件q圖像文件由文件頭和圖像數據組成。q文件頭的內容一般包括文件類型、文件制作者、制作時間、版本號、文件大小和壓縮方式等。q常見的圖像格式有BMP、JPEG、GIF、TIFF等。 82第第3 3章章 高級編程技術的實現高級編程技術的實
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 書包購貨合同標準文本
- 會計培訓協議合同標準文本
- 微型燃料電池企業ESG實踐與創新戰略研究報告
- 耐堿短切玻璃纖維企業數字化轉型與智慧升級戰略研究報告
- 脫錠起重機企業數字化轉型與智慧升級戰略研究報告
- 采礦服務企業ESG實踐與創新戰略研究報告
- 發酵、提取設備企業縣域市場拓展與下沉戰略研究報告
- 出讓資本投資合同樣本
- 共同購買地皮合同標準文本
- 經濟作物高效智能控制裝備企業縣域市場拓展與下沉戰略研究報告
- MOOC 航空燃氣渦輪發動機結構設計-北京航空航天大學 中國大學慕課答案
- 公共安全管理
- 中風的早期識別和急救處理
- 2024年高考語文復習:散文化小說閱讀 專項練習題(含答案解析)
- 2024年河南省安陽市中考模擬考試數學模擬預測題(含答案)
- 科普課題立項申報書
- 中華人民共和國愛國主義教育法
- 傳愛國時代風鑄強國夢
- 人教版四年級美術下冊單元測試題及答案全套1
- 腦梗死的健康宣教及指導
- 美容院背部培訓課件
評論
0/150
提交評論