版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第一章 編程技術(shù)實(shí)現(xiàn) 本章內(nèi)容簡(jiǎn)介:本章主要介紹如何實(shí)現(xiàn)鍵盤和鼠標(biāo)的輸入,圖形圖像技術(shù),動(dòng)畫技術(shù),發(fā)聲技術(shù),漢字顯示技術(shù),精確的時(shí)間控制技術(shù)。是編寫大型程序的基本功。雖然每個(gè)技術(shù)所涉及的內(nèi)容很少,所提及的函數(shù)也很少,但是當(dāng)它們組合在一起的時(shí)候,就可以編寫大型程序。一、鍵盤: 首先有必要介紹一下計(jì)算機(jī)是如何來(lái)處理鍵盤輸入的數(shù)據(jù)的鍵盤里面有一個(gè)微處理器,用來(lái)掃描和檢測(cè)每個(gè)鍵的按下或者抬起的狀態(tài),然后向主機(jī)傳送一個(gè)字節(jié)的鍵盤掃描碼,鍵盤掃描碼翻譯成對(duì)應(yīng)的ASC碼。
2、60; 作為編程來(lái)說(shuō),只要知道每個(gè)按鍵都有對(duì)應(yīng)的ASC碼。由于ASC碼不能將鍵盤上所有的按鍵全部包括,因此有些控制鍵如Ctrl、Alt、End、Home和Del等用擴(kuò)充的ASC碼表示。至于每個(gè)按鍵所對(duì)應(yīng)的ASC碼到底是什么,這里介紹一個(gè)函數(shù)可以實(shí)現(xiàn)該功能: int bioskey(int n) 該函數(shù)聲明在bios.h頭文件中,所以調(diào)用之前需要在程序開始的位置寫上 #include<bios.h>,(以后如果第一次碰到的函數(shù)可以在TC根目錄下的include文件夾中的頭文件中查找,可以用記事本打開。)參數(shù)n用來(lái)確定該函數(shù)的三
3、個(gè)功能,具體如下表所示 表1-1參數(shù)n的具體數(shù)值實(shí)現(xiàn)的功能0bioskey(0) 返回按鍵的鍵值兩個(gè)字節(jié)的整型數(shù)據(jù)。若沒有鍵按下,該函數(shù)一直等待,直到有鍵按下(這種情況有時(shí)會(huì)影響效率,在之后的例2中會(huì)看到有一種方法可以實(shí)現(xiàn):在一定時(shí)間內(nèi)沒有按鍵就去執(zhí)行下面的代碼)。當(dāng)按下時(shí),返回該鍵所對(duì)應(yīng)的ASC碼或其擴(kuò)展的ASC碼。具體請(qǐng)看例1;1bioskey(1) 查詢是否有鍵按下。 若沒有鍵按下,返回0;若有鍵按下,返回非零值2bioskey(2) 將返回一些控制鍵是否被按過,按過的狀態(tài)由該函數(shù)返回的值來(lái)表示,具體請(qǐng)看表2
4、; 如選參數(shù)n為2時(shí),當(dāng)某位為1時(shí),表示相應(yīng)的鍵已按,或相應(yīng)的控制功能已有效,若key值為0x09, 那么從表1-2中可以得知右Shift鍵和Alt鍵被按下,因?yàn)橹挥?x01和0x08相加和為0x09。 若該函數(shù)還是無(wú)法理解也不影響最后編小游戲,故此處不做詳細(xì)介紹。 表1-2 字節(jié)位對(duì)應(yīng)的16進(jìn)制數(shù)含義字節(jié)位對(duì)應(yīng)的16進(jìn)制數(shù)含義00x
5、01右Shift鍵被按下40x10Scroll Lock已打開10x02左Shift鍵被按下50x20Num Lock已打開20x04Ctrl鍵被按下60x40Caps Lock已打開30x08Alt鍵被按下70x80Inset 已打開 例1-1:#include<bios.h>int main ( ) int key; key=bioskey(0); printf(“%x”,key);/* 該例子中,若按下鍵盤上的UP ()鍵,屏幕會(huì)顯示4800(16
6、進(jìn)制),用 16進(jìn)制是一種習(xí)慣, 在上表2中也體現(xiàn)了這種習(xí)慣的合理性。*/ 例1-2:#include<stdio.h>#include<bios.h>int main() int i , s; for(i=0;i<5000;i+) delay(1); /*delay()函數(shù)用于延時(shí),即使同樣的參數(shù)會(huì)根據(jù)不同的實(shí)際情況的 不同而延
7、時(shí)不同的時(shí)間,精確的時(shí)間控制請(qǐng)參閱精確的時(shí)間控制(超鏈接)一章*/ if(bioskey(1)!=0) s=1; break;
8、0; printf(“hello”); /* 該例中用了一個(gè)5000次的循環(huán),每次延時(shí)1,每次去判斷是否有按鍵被按下,如果有,則跳出循環(huán),馬上去執(zhí)行printf(“hello”);若5000次循環(huán)里面都沒有按鍵按下,在循環(huán)結(jié)束后,執(zhí)行printf(“hello”); 這種方法對(duì)于最后編小游戲非常有用,在最后的吃豆子放炸彈(超鏈接)例子中會(huì)再次提到 */ 最后再介紹一個(gè)函數(shù):int kbhit(void); 該函數(shù)聲明
9、在conio.h頭文件中,所以調(diào)用之前需要在程序開始的位置寫上 #include<conio.h>若按了鍵盤,該函數(shù)返回1,否則返回0; C語(yǔ)言也可以實(shí)現(xiàn)鼠標(biāo)的操作,但由于這種方法效率低,現(xiàn)在的面向?qū)ο蟮木幊潭疾皇怯肅語(yǔ)言的鼠標(biāo)操作手段。并且,本課程的一些例子中,也可以不用鼠標(biāo)的操作,一般只用鍵盤就可以實(shí)現(xiàn)所需要的功能,因此,這里就不做介紹。第二章 文本與圖像的顯示 第一節(jié) 硬件基礎(chǔ) 由于本課程的重點(diǎn)在于讓大家體會(huì)C語(yǔ)言的進(jìn)一步用法,所以對(duì)于
10、硬件部分的知識(shí)(有興趣的話可以到硬件概論學(xué)習(xí)硬件知識(shí)),本人會(huì)在非講不可的情況下給大家做一介紹,就本人經(jīng)歷而言,沒有掌握硬件知識(shí)也不影響C語(yǔ)言的應(yīng)用,但為了知識(shí)的完整性,本人就文字圖像顯示所涉及的硬件知識(shí)做一介紹。 對(duì)于TC而言,如果想利用C的庫(kù)函數(shù)在屏幕上顯示圖像,它所支持的顯卡類型如下表2-1所示: 表2-1分辨率顏色數(shù)顯卡類型320×2004CGA320×2002CGA640×2002CGA320×20016EGA640×20016EGA640×3502EGA640×350
11、16EGA640×4802VGA640×48016VGA 表格說(shuō)明:表中所出現(xiàn)的顯卡類型有:CGA(彩色圖形適配器)EGA(增強(qiáng)型圖形適配器)VGA(視頻圖形陣列適配器)之后將介紹TC所支持的模式 第二節(jié) 文本顯示方式 這里所涉及的函數(shù)有:文本窗口大小的設(shè)定,窗口顏色的設(shè)置,窗口文本的清除和輸入輸出等函數(shù),在之后會(huì)對(duì)這些函數(shù)做詳細(xì)介紹。這些函數(shù)包含在 conio.h 頭文件中。 1. void textmode (int newmode) 函數(shù) 該
12、函數(shù)用來(lái)定義文本方式,具體如下表所示: 表3-2顯示方式行×列 顏色數(shù)值符號(hào)常量40×25 黑白0BW4040×25 彩色1C4080×25 黑白2BW8080×25 彩色3C8080×25 單色7MONO上一次的顯示方式-1LASTMODE 表格解釋:該函數(shù)設(shè)置之后才能用上面所提到的一些文本顯示方式下的函數(shù)。當(dāng)然如果不用該函數(shù),TC會(huì)認(rèn)為是缺省定義,也就是說(shuō),它會(huì)默認(rèn)一種模式:80×25。在調(diào)用函數(shù)時(shí),參數(shù)用數(shù)值或者用符號(hào)常量是一樣的,比如 textmode(0);和textmode(BW40); 等效
13、。 2void window (int left, int top, int right, int bottom); 該函數(shù)定義屏幕上一個(gè)矩形的區(qū)域作為窗口。(left,top)是窗口的左上角坐標(biāo),(right,bottom)是窗口右下角坐標(biāo),這樣一個(gè)矩形就唯一確定了。對(duì)于屏幕上的坐標(biāo)需要解釋一下,如下圖3-1:如果屏幕是640×480分辨率,則坐上角為坐標(biāo)(0,0),右下角是(640,480) 圖3-1: 注意:該函數(shù)中的坐標(biāo)如果超過了屏幕坐標(biāo),TC不會(huì)編譯報(bào)錯(cuò),但
14、是該函數(shù)無(wú)效了。 窗口定義之后,用有關(guān)的窗口輸入輸出函數(shù)就可以只在此窗口內(nèi)進(jìn)行操作而不超出窗口界限。3 . void textbackground(int color) 和 void textcolor(int color) 函數(shù) 前者用來(lái)設(shè)置背景顏色,后者用來(lái)設(shè)置字符函數(shù)。具體應(yīng)用會(huì)在之后的例子給出 有關(guān)顏色參數(shù)color的取值具體如下表3-3所示: 表3-3:適用于前景色或背景色顏色數(shù)值符號(hào)常量前景色,背景色黑0BLACK前
15、景色,背景色藍(lán)1BLUE前景色,背景色綠2GREEN前景色,背景色青3GYAN前景色,背景色紅4RED前景色,背景色洋紅5MAGENTA前景色,背景色棕6BROWN前景色,背景色淡灰7LIGHTGRAY前景色深灰8DARKGRAY前景色淡藍(lán)9LIGHTBLUE前景色淡綠10LIGHTGREEN前景色淡青11LIGHTGYAN前景色淡紅12LIGHTRED前景色淡洋紅13LIGHTMAGENTA前景色黃14YELLOW前景色白15WHITE前景色閃爍128BLINK
16、 另外有函數(shù) void textattr(int attr) 可以同時(shí)設(shè)置文本的字符和背景顏色。 如要求黃底藍(lán)字:textattr(BLUE+(YELLOW<<4); << 表示移位運(yùn)算,在C課程中有介紹(超鏈接)再如:要求藍(lán)底黃字并且要閃爍:textattr(128+YELLOW+(BLUE<<4));使用時(shí)只要根據(jù)這兩個(gè)的框架并結(jié)合表2-3就可以自己定義。 最后說(shuō)明下:textbackground( ) 和 textcolo
17、r( ) 函數(shù)設(shè)置了之后,要用 clrscr( )函數(shù)清除窗口,這樣才能顯示出所設(shè)置的顏色。clrscr( )函數(shù)會(huì)在下一文章具體解釋(超鏈接)。 4. 窗口內(nèi)文本輸入輸出函數(shù)4.1文本輸入函數(shù)窗口定義好之后,文本輸入可以采用getch( ) 或 getche( ) 函數(shù)。這兩個(gè)函數(shù)定義在 stdio.h頭文件中。函數(shù)原型分別是: int getch(void) int getche(void) (void表示沒有參數(shù))它們的區(qū)別是:getc
18、h( ):讀入一個(gè)字符,當(dāng)你用鍵盤輸入的時(shí)候,屏幕不顯示你所輸入的字符。getche( ) :讀入一個(gè)字符,鍵盤輸入的時(shí)候,屏幕顯示所輸入的字符。遇到窗口最右端會(huì)自動(dòng)換行。 4.2 文本的輸出函數(shù): int cprintf(char *format,表達(dá)式表); 括號(hào)中內(nèi)容的格式跟 printf()函數(shù)相同(pirnf()在C語(yǔ)言中將誒少超鏈接),比如 cprintf(,) 。int cputs(char *str); 該函數(shù)類似于puts()函數(shù)(puts()在C語(yǔ)言中介紹超鏈接),輸出一個(gè)字符串
19、到窗口。int putch(int ch); 輸出一個(gè)字符到窗口。 這里要解釋下,TC雖然可以在屏幕上畫多個(gè)窗口,但是每次只能處理一個(gè)窗口,所以這些函數(shù)在都是在當(dāng)前窗口進(jìn)行操作,而要對(duì)別的窗口操作,需要將定義那個(gè)窗口的函數(shù)重新調(diào)用一次,則那個(gè)窗口就成了當(dāng)前窗口。 以上三個(gè)函數(shù)都定義在conio.h頭文件中。conio.h是一個(gè)C標(biāo)準(zhǔn)庫(kù)中的頭文件。conio是Console Input/Output(控制臺(tái)輸入輸出)的簡(jiǎn)寫,其中定義了通過控制臺(tái)進(jìn)行數(shù)
20、據(jù)輸入和數(shù)據(jù)輸出的函數(shù),主要是一些用戶通過按鍵盤產(chǎn)生的對(duì)應(yīng)操作。 5 有關(guān)窗口或文本整體的操作void clrscr(void); 該函數(shù)清除窗口中的文本,并將光標(biāo)移到當(dāng)前窗口的左上角。void clreol(void); 該函數(shù)清除當(dāng)前光標(biāo)到光標(biāo)所在行的結(jié)尾的所有字符,不改變標(biāo)位置。void delline(void); 該函數(shù)刪除光標(biāo)所在行的一行字符。void gotoxy(int x,int y); 光標(biāo)定位到坐標(biāo)(x,y)處,
21、若坐標(biāo)超出窗口就不起作用了。int movetext(int x1, int y1,int x2, int y2, int x3, int y3) 該函數(shù)把左上角(x1, y1),右下角(x2, y2)的矩形整體拷貝到左上角為(x3, y3)的一個(gè)新矩形內(nèi)。原窗口仍保留。int gettext(int x1,int y1,int x2,int y2, void *buffer) 該函數(shù)把左上角(x1, y1)到右下角(x2, y2)的窗口內(nèi)的文本全部存到buffer指針(指針
22、的內(nèi)容在C語(yǔ)言課程中介紹,超鏈接)。其中的坐標(biāo)是指屏幕的絕對(duì)坐標(biāo)。int puttext(int x1,int y1,int x2,int y2,void*buffer) 相對(duì)應(yīng)于上面這個(gè)函數(shù),該函數(shù)把指針buffer中的內(nèi)容拷貝到左上角(x1, y1)到右下角(x2, y2)的窗口內(nèi)。其中的坐標(biāo)是指屏幕的絕對(duì)坐標(biāo)。 下面一個(gè)例子是對(duì)以上的幾個(gè)函數(shù)的運(yùn)用。該例子實(shí)現(xiàn)了繪制左右兩個(gè)窗口,用Tap鍵切換光標(biāo)
23、??梢栽诠鈽?biāo)所在窗口輸入文本,ESC鍵退出。 例子3-1: #include <stdio.h>#include <conio.h>#include <bios.h> char leftbuf40*25*2; /*切換時(shí)保存左窗口文本*/ char rightbuf40*25*2; /*切換時(shí)保存右窗口文本*/ int leftx, lefty; /*切換時(shí)保存左窗口當(dāng)前坐標(biāo)*/ int rightx, righty; /*切換時(shí)保存右窗口當(dāng)前坐標(biāo)*/ void draw_left_win
24、();/*重繪左邊窗口*/ void draw_right_win();/*重繪右邊窗口*/ int main() int key; int turn; textmode(C80); /*采用之前提及的 80×25 彩色顯示模式*/ textbackground(0); textcolor(WHITE); clrscr();
25、160; /*清屏,也使得以上三個(gè)函數(shù)起作用 */ /*以下4句話定義右邊窗口為綠色背景,紅色前景*/ window(41,2,79,24); textbackground(2); textcolor(4); clrscr(); /*清屏,也使得以上三個(gè)函數(shù)起作用,單步調(diào)試可以發(fā)現(xiàn),未執(zhí)行該函數(shù),屏幕不會(huì)出現(xiàn)右窗口 */ gettext(41,2,79,24
26、, rightbuf); /*用rightbuf指針存放右窗口文本 */ window(2,2,40,24); /*左邊窗口為藍(lán)色背景,白色前景*/ textbackground(1); textcolor(15); clrscr(); gettext(2,2,40,24, leftbuf); turn = 0; /*初始激活左窗口*
27、/ for(;) key=bioskey(0); if(key = 0x11b) /*ox11b是ESC鍵的ASCII碼,如果按下ESC鍵,退出*/ exit(0);
28、 /*獲取窗口輸入的文本的ASCII碼值*/ if(key = 0xf09) /*ox11b是tap鍵的ASCII碼,如果按下tap鍵,切換窗口*/ if(turn = 0)
29、160; /*切換到左窗口*/ gettext(2,2,40,24, leftbuf);
30、160; leftx = wherex(); lefty = wherey(); draw_right_win();
31、160; turn = 1; else if(turn = 1) /*切換到右窗口*/
32、0; gettext(41,2,79,24, rightbuf); rightx = wherex(); &
33、#160; righty = wherey(); draw_left_win(); turn = 0;
34、60; else putch(key); /
35、*當(dāng)前光標(biāo)處顯示新輸入的文本字符*/ /*重繪右邊窗口*/void draw_right_win() window(41,2,79,24); textbackground(2); textcolor(4); clrscr(); puttext(41,2,79,24, rightbuf); gotoxy(rightx, righty); /*重繪左邊窗口*/void draw_left_win()
36、 window(2,2,40,24); textbackground(1); textcolor(15); clrscr(); puttext(2,2,40,24, leftbuf); gotoxy(leftx, lefty);第三節(jié) 圖形顯示方式 TC有一個(gè)圖形庫(kù)文件(graphic.lib),提供了許多有用的圖形函數(shù),這些函數(shù)均包含在graphics.h頭文件中。 TC所支持的圖形模式如下
37、表所示(和文本顯示類似,表格就不具體介紹了): 表4-1:適配器模式分辨率顏色數(shù)符號(hào)常量CGA0320×2004CGAC01320×2004CGAC12320×2004CGAC23320×2004CGAC34640×2002CGAHIEGA0640×20016EGALO1640×35016EGAHIVGA0640×20016VGALO1640×35016VGAMED2640×48016VGAHI TC支持的都是早期的模式,自己編小游戲時(shí)也只能在差的里
38、面挑最高的了VGAHI 1. void far initgraph(int far *pdriver, int far *pmode, char far *path) 該函數(shù)用來(lái)設(shè)置圖形方式,也就是選擇上表中一種模式。按照習(xí)慣,該函數(shù)使用時(shí)一般先定義兩個(gè)變量graphdiver, graphmode 。下面以表中最后一種模式為例,說(shuō)明該函數(shù)具體的使用方法。 int graphdiver=VGA; int graphmode =VGAHI;
39、160; initgraph(&graphdiver, & graphmode,); 最后一個(gè)參數(shù)寫作 是表示驅(qū)動(dòng)程序路徑就在程序文件當(dāng)前所在目錄,所以方便起見,一般把TC目錄下的BGI文件中的所有文件(驅(qū)動(dòng)程序都在里面了)都拷貝到程序文件所在目錄,那么例子中的程序才可以正常運(yùn)行,否則要寫路徑, 比如d:tcBGI 此外,若設(shè)置 int graphdiver=DETECT; 那么TC會(huì)自動(dòng)檢測(cè)最高的顯示模式,graphdiver參數(shù)不用賦值。 (如果出現(xiàn) BGI Error: Graphics
40、not initialized(use 'initgraph')錯(cuò)誤,可能是上述路徑的問題,也有可能是機(jī)子的問題,請(qǐng)參照附錄) 一旦調(diào)用了該函數(shù),顯示器就變成了圖形顯示模式,而要回到上一節(jié)所說(shuō)的文本顯示模式,需要調(diào)用函數(shù) closegraph( ) ;2. void far setcolor(int color); void far setbkcolor(int color); 這兩個(gè)函數(shù)分別用來(lái)設(shè)置前景色(畫
41、圖函數(shù)所畫出的圖形的顏色)和背景色。 下面表4-2介紹了VGAHI模式下color參數(shù)的16種情況。這也同樣適用于EGAHI模式,其他模式的不作介紹了。 表中的所代表的顏色和第三講文本顯示模式下的表3-3相同,看英文就可以知道顏色。 表4-2:數(shù)值符號(hào)常量0EGA_BLACK1EGA_BLUE2EGA_GREEN3EGA_GYAN4EGA_RED5EGA_MAGENTA6EGA_BROWN7EGA_LIGHTGRAY數(shù)值符號(hào)常量8EGA_DARKGRAY9EGA_LIGHTBLUE10EGA_LIGH
42、TGREEN11EGA_LIGHTGYAN12EGA_LIGHTRED13EGA_LIGHTMAGENTA14EGA_YELLOW15EGA_WHITE 3. void far setviewport(int x1, int y1, int x2, int y2, clipflag ); 和文本顯示方式類似,在圖形方式下,也可以利用該函數(shù)設(shè)置一個(gè)左上角(x1, y1)到右下角(x2, y2)的窗口。clipflag參數(shù)為0時(shí),所畫
43、圖形即使超出了該窗口,仍將顯示超出部分;clipflag參數(shù)非0時(shí)(比如寫作1),所畫圖形超出該窗口的部分將不顯示。設(shè)置窗口之后,就可以用相對(duì)坐標(biāo)來(lái)定位了,也就是說(shuō)圖形的左上角(x1, y1)成了坐標(biāo)(0, 0)。 用該函數(shù)可以在屏幕上設(shè)置多個(gè)函數(shù),甚至可以重疊,但是和文本顯示方式下的設(shè)置窗口函數(shù)一樣,只能對(duì)當(dāng)前窗口操作,若要操作別的窗口,需要重新調(diào)用該函數(shù)。 用setcolor設(shè)置前景色時(shí),只對(duì)當(dāng)前窗口內(nèi)所畫圖形起作用,并且該窗口在第二次被調(diào)用時(shí)如果沒有使用setcolor設(shè)置前景色,TC也能記住之前所設(shè)置的顏色。
44、60; 用setbkcolor設(shè)置背景色時(shí),對(duì)整個(gè)屏幕背景都起作用。4. 清屏函數(shù) cleardevice( ); 和 clear ( );這兩個(gè)函數(shù)分別作用在整個(gè)屏幕和當(dāng)前窗口。畫圖前調(diào)用該函數(shù)。 5. 文本輸出void far outtext(char far *textstring); 該函數(shù)將字符串指針textstring所指向的內(nèi)容輸出到當(dāng)前位置。void far outtextxy(int x, int y, char far *textstring);該函數(shù)在(x
45、,y)處輸出字符串指針textstring所指向的內(nèi)容。 此外介紹一下sprintf()函數(shù)。原型為int sprintf(char *string,char *format,arg_list) 函數(shù)sprintf()后兩個(gè)參數(shù)的用法和printf()函數(shù)一樣,只是sprintf()函數(shù)給出第一個(gè)參數(shù)string(一般為字符數(shù)組)。一般在圖形方式下輸出數(shù)字比較麻煩。此時(shí)可調(diào)用sprintf()函數(shù)將所要輸出的格式送到第一個(gè)參數(shù),然后顯示輸出。再用前兩個(gè)函數(shù)輸出。 舉例來(lái)說(shuō),cp
46、rintf(str, "%d", 10); 就將數(shù)字10轉(zhuǎn)為文本放入了字符串str中。然后就可以調(diào)用前兩個(gè)函數(shù)輸出了。 void far settextjustify(int horiz, int vert);該函數(shù)用來(lái)設(shè)置輸出方式。具體如下表所示表4-3: 參數(shù)horiz參數(shù)vert符號(hào)名值含義符號(hào)名值含義LEFT_TEXT0輸出左對(duì)齊BOTTOM_TEXT0底部對(duì)齊CENTER_TEXT1輸出以字串中心對(duì)齊CENTER_TEXT1中心對(duì)齊R
47、IGHT_TEXT2輸出右對(duì)齊TOP_TEXT2頂部對(duì)齊 void far settextstyle(int font, int direction, int char size); 該函數(shù)用來(lái)設(shè)置文本輸出的字型,方向和大小。具體如下表所示表4-4:參數(shù)font符號(hào)值值含義DEFAULT_FONT08×8字符點(diǎn)陣TRIPLEX_FONT1三倍筆畫體字SMALL_FONT2小字筆畫體字SANS_SERIF_FONT3無(wú)襯線筆畫體字GOTHIC_FONT4黑體筆畫體字參數(shù)directionHORIZ_DIR0水平輸出VERT_DIR1垂直輸出參數(shù)size
48、無(wú)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)陣 下面舉個(gè)例子對(duì)以上幾個(gè)函數(shù)的實(shí)際應(yīng)用:例4-1:#include <graphics.h>main() int i,graphdriver,graphmode,size,page; char s30; graphdriver=DETECT; initgraph(&am
49、p;graphdriver,&graphmode,""); /*自動(dòng)設(shè)置最高模式,運(yùn)行時(shí)請(qǐng)將BGI中文件拷到程序文件所在目錄,否則請(qǐng)輸入路徑*/ cleardevice(); /*清屏*/ /*以下代碼應(yīng)該不用解釋了,可以單步調(diào)試去了解,單步調(diào)試方法參見附錄2*/ settextstyle(DEFAULT_FONT,HORIZ_DIR,2); settextjustify(LEFT_TEXT,0); outtextxy(220
50、,20,"aaaaaaaa"); settextstyle(TRIPLEX_FONT,HORIZ_DIR, 2); settextjustify(LEFT_TEXT,0); outtextxy(220,50,"bbbbbbbb"); settextstyle(SMALL_FONT,HORIZ_DIR, 2); settextjustify(LEFT_TEXT,0); outtextxy(220,80,"cccccccc"); settextstyle(
51、SANS_SERIF_FONT,HORIZ_DIR,2); settextjustify(LEFT_TEXT,0); outtextxy(220,110,"dddddddd"); settextstyle(GOTHIC_FONT,HORIZ_DIR, 2); settextjustify(LEFT_TEXT,0); outtextxy(220,140,"eeeeeeee"); getch(); closegraph(); 最終效果如下圖所示:當(dāng)然您也可以單步調(diào)試
52、看每小段所顯示的字型。 第四節(jié) 繪制圖形 這一節(jié)所介紹的繪圖函數(shù),都是在圖形顯示方式下的。所以要先用上一節(jié)提到的initgraph( )設(shè)置圖形顯示方式。所用函數(shù)包含在<graphics.h>頭文件中。 首先介紹幾個(gè)畫圖定位有關(guān)的函數(shù)1. void far moveto(int x ,int y); 該函數(shù)使畫圖起始坐標(biāo)定位到(x,y)處。如果假想有一只畫筆,那么畫圖起始坐標(biāo)就是畫筆的筆尖所在坐標(biāo)。2. void far moverel(int dx ,int dy);
53、0; 該函數(shù)使畫圖起始坐標(biāo)從原坐標(biāo)(a,b)移動(dòng)到(a+dx, b+dy)3. int far getx(void); 和 int far gety(void); 這兩個(gè)函數(shù)用來(lái)得到畫圖起始坐標(biāo)所在位置。前者得到X坐標(biāo),后者得到Y(jié)坐標(biāo)。(void表示沒有參數(shù),使用時(shí):getx(); 就可以得到X坐標(biāo)) 畫點(diǎn)1. void far putpixel(int x, int y, int color); 該函數(shù)在(x,y)坐標(biāo)上畫一點(diǎn),顏色參數(shù)color如第三講表3-3所示。 畫線1.
54、 首先介紹一下線類型的設(shè)置,void far setlinestyle(int linestyle, unsigned upattern, int thickness); (unsigned表示無(wú)符號(hào)類型) 這個(gè)函數(shù)比較復(fù)雜,下面仔細(xì)介紹一下:thickness參數(shù)只有兩個(gè)選擇,1或者3,分別表示1個(gè)像素寬的線和三個(gè)像素寬的線,想要更寬,可以多次在不同位置調(diào)用,也可以用后面會(huì)講到的畫矩形函數(shù)來(lái)實(shí)現(xiàn)。linestyle參數(shù)的選擇有如下表所示5種情況: 表5-1:符號(hào)常量值含義SOLID_LINE0實(shí)線DOTTED_LINE1點(diǎn)線CENTER_LINE
55、2中心線DASHED_LINE3點(diǎn)畫線USERBIT_LINE4用戶自定義線 表格說(shuō)明:如果linestyle參數(shù)選擇0、1、2或3,upattern 參數(shù)取0;如果linestyle參數(shù)選擇4。那么就表示需要用戶自定義,具體說(shuō)明如下: 自定義的情況下,upattern參數(shù)有16個(gè)位,每個(gè)位代表一個(gè)像素,若該位是1,則用設(shè)置好的前景色顯示該點(diǎn)像素;若該位是0,則用背景色顯示,其效果就是不顯示。比如:想畫間隔的點(diǎn)線 用二進(jìn)制表示1010101010101010 (16位),參數(shù)
56、upattern參數(shù)通常習(xí)慣用16進(jìn)制表示,此時(shí)該二進(jìn)制數(shù)就是0xAAAA, 所以調(diào)用函數(shù) setlinestyle(4, 0xAAAA, 1); 之后再用畫線函數(shù)所畫圖形就是1個(gè)像素寬的點(diǎn)線,當(dāng)然隨便改二進(jìn)制數(shù)中每一位的0、1值就可以改變線的類型。 另外一點(diǎn)需要注意的是,setlinestyle函數(shù)也會(huì)作用到接下來(lái)所要講的畫圖函數(shù)(比如畫圓、矩形等)的邊線,所以若在之前調(diào)用了該函數(shù),要想畫出邊線為實(shí)線的圓,要重新調(diào)用該函數(shù),并設(shè)置為實(shí)線。 設(shè)置好了線類型并且調(diào)用了前一節(jié)所提到的setcolor( )函數(shù)設(shè)置線
57、的顏色之后,就可以用以下三個(gè)函數(shù)來(lái)畫線了,具體請(qǐng)看例4-1。2. void far line(int x0, int y0, int x1, int y1); 該函數(shù)從(x0, y0)到(x1, y1)畫一直線。3. void far lineto(int x, int y); 該函數(shù)從當(dāng)前畫筆所在位置到(x,y)坐標(biāo)處畫一直線,畫筆的定位由上面提及的畫圖定位函數(shù)設(shè)置。4. void far linerel(int dx, int dy); 該函數(shù)從當(dāng)前畫筆所在位置(a,b)到(a+dx, b+dy)坐標(biāo)處畫一直線。&
58、#160;下面舉個(gè)實(shí)例來(lái)綜合運(yùn)用以上的一些函數(shù)例5-1:#include <graphics.h>main() int graphdriver=VGA; int graphmode=VGAHI; int x; initgraph(&graphdriver,&graphmode,&qu
59、ot;"); cleardevice(); /*畫平行四邊形*/ line(150,100,100,300); moveto(100,300);
60、lineto(500,300); linerel(50,-200); lineto(150,100); /*畫垂直中線,線為淡藍(lán)色粗線*/ /*自定線型(0x1001)的模式是4個(gè)白點(diǎn)后跟8個(gè)不顯示點(diǎn),接著4個(gè)白點(diǎn)*/ move
61、rel(200,0); setcolor(EGA_LIGHTBLUE); setlinestyle(4,0x1001,3); lineto(300,300); /*畫水平中線*/ for(x=125;x<=519
62、;x+=16) /*線的模式是兩個(gè)連續(xù)的淡綠點(diǎn)間隔四個(gè)不顯示點(diǎn)后,*/ /*又有兩個(gè)連續(xù)的淡紅點(diǎn)后接16個(gè)不顯示點(diǎn) */
63、; putpixel(x,200,EGA_LIGHTGREEN); putpixel(x+1,200,EGA_LIGHTGREEN); putpixel(x+5,200,EGA_LIGHTRED);
64、0; putpixel(x+6,200,EGA_LIGHTRED); getch(); closegraph();效果圖如下所示: 仿照本例,您可以根據(jù)自己愛好設(shè)計(jì)各種線型的圖案了,當(dāng)然離不開數(shù)學(xué)計(jì)算。第五節(jié) 繪制圖形之二
65、160; 以下函數(shù)所繪的均是只有邊線,而不填充內(nèi)部的圖形。調(diào)用之前,請(qǐng)先用setcolor( )設(shè)置前景色,這里前景色就是指邊線顏色。 1. void far rectangle(int x1,int y1,int x2,int y2); 該函數(shù)畫一個(gè)從左上角(x1, y1)到右下角(x2, y2)的矩形;2. void ellipse(int x, int y, int stangle, int endangel, int xradius, int yradius); 該函數(shù)將以(x,y)為中心,以xradius
66、和 yradius為x軸半徑和y軸半徑,從起始角度stangle到終止角度endangel 畫一橢圓。在TC中,X正半軸角度為0,按逆時(shí)針方向旋轉(zhuǎn),角度依次增加,直到360度時(shí)回到X正半軸。所以xradius和 yradius分別取0和360時(shí),畫出的是一個(gè)完整的橢圓。 以后,凡是函數(shù)中參數(shù)涉及到角度的,都是和此處一樣,從X正半軸角度為0,按逆時(shí)針方向旋轉(zhuǎn),角度依次增加,直到360度時(shí)回到X正半軸。3. void far circle(int x, int y, int radius); 該函數(shù)以(x,y)為圓心,以radius為半
67、徑畫圓。4. void far arc(int x, int y,int stangle, int endangle, int radius); 該函數(shù)以(x, y)圓心,以radius為半徑,從從起始角度stangle到終止角度endangel 畫一圓弧。 下面舉個(gè)例子來(lái)運(yùn)用以上函數(shù):例6-1:#include <graphics.h>#include <conio.h>#include <math.h>#define PI 3.141593 /*定義的值*/int main()
68、0; int graphdriver=VGA; int graphmode=VGAHI; double a=0,b; int x0=340,y0=240,r=100,i,x,y; initgraph(&graphdriver,&graphmode,""
69、;); /*初始化圖形模式*/ cleardevice(); /*清屏*/ /* 設(shè)置圖形邊線的線型,之前提到過setlinestyle函數(shù)可以作用到圖形邊線 */ setlinestyle(DASHED_LINE,0,3); setcolor(EGA_RED); /*設(shè)置邊線顏色*/ /*這段代碼畫圓弧,單步調(diào)試下比較清楚,
70、單步調(diào)試方法參見附錄2*/for(i=0;i<6;i+,a+=60) b=a*PI/180; x=x0+r*cos(b);
71、 y=y0+r*sin(b); arc(x,y,120-i*60,240-i*60,r); setcolor(EGA_YELLOW); circle(x0,y0,100); /*畫圓*/ &
72、#160; getch(); closegraph(); /*關(guān)閉圖形系統(tǒng),小程序中不用也罷,就編程風(fēng)格來(lái)說(shuō)用上最好*/ return 0; 運(yùn)行結(jié)果如圖:由于我電腦不支持TC, 所以是用虛擬機(jī)運(yùn)行的,結(jié)果有條線特別粗,不解,從代碼上看,各線的粗細(xì)該相同,所以此圖僅供參考圖6-1:繪制圖形之三:封閉可填色圖形 本講內(nèi)容還是屬于圖形顯示模式,需要 #include <g
73、raphics.h> 1. void far setfillstyle(int pattern, int color); 和前一講不同的是,這一講的函數(shù)都是有內(nèi)部顏色的,該函數(shù)可以設(shè)置內(nèi)部的填充顏色和填充方式,具體如下表7-1所示 表7-1:符號(hào)常量數(shù)值含義EMPTY_FILL0背景色填充(效果和前一節(jié)的函數(shù)相同,只有邊線)SOLID_FILL1實(shí)填充(充滿整個(gè)封閉區(qū)域)LINE_FILL2用 填充LTSLASH_FILL3用 / / 填充SLASH_FILL4用 粗/ / 填充BKSLASH_FILL5用 填充LTBKSLASH_
74、FILL6用 粗 填充HATCH_FILL7用方網(wǎng)格填充XHATCH_FILL8用斜網(wǎng)格填充INTTERLEAVE_FILL9用間隔點(diǎn)填充WIDE_DOT_FILL10用稀疏點(diǎn)填充CLOSE_DOT_FILL11用密集點(diǎn)填充 2. 如果以上的各種方式還不能讓您滿意的話,那就用自定義填充模式函數(shù):void far setfillpattern(char *upattefn, int color); 該函數(shù)參數(shù)color就不用解釋了,和之前多次提到的一樣,參照表3-3。參數(shù)upattefn是一個(gè)字符型數(shù)組,用來(lái)設(shè)定8×8的像素點(diǎn)陣所組成的填充
75、模板。用該模板去填充所畫的封閉圖形,好比是貼地磚。每一行都用一個(gè)二進(jìn)制數(shù)來(lái)表示,該二進(jìn)制數(shù)有8個(gè)位,該位上若是1,則顯示該像素;是0就不顯示。和之前提到的自定義線型相同。還是舉例說(shuō)明比較清楚: char u8=0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x81; setfillpattern(u,RED); 這樣就設(shè)定了自定義的8×8的像素點(diǎn)陣填充模板:第1行全是顯示的,就是一條實(shí)線,2-7
76、行是背景色,不顯示,最后一行就是二進(jìn)制數(shù)10000001,就頭尾有一個(gè)點(diǎn)。 3. 可填充的基本圖形void bar(int x1, int y1, int x2, int y2); 該函數(shù)從左上角(x1, y1)到右下角(x2, y2)畫一個(gè)矩形,該矩形沒有邊線。void far pieslice(int x, int y, int stangle, int endangle,int radius); 該函數(shù)以(x, y)為圓心,以radius為半徑,以stangle為起始角,endangle為結(jié)束角,畫一扇形,有邊線。若想
77、以此函數(shù)畫圓,即stangle和endangle取0和360,那么,若邊線未設(shè)置成和內(nèi)部相同顏色,則會(huì)在X正半軸留下一條顏色不同的邊線。當(dāng)然畫圓可以用之后馬上要介紹的一個(gè)函數(shù)。void far bar3d(int x1, int y1, int x2, int y2, int depth, int topflag); 該函數(shù)用來(lái)畫一個(gè)三維的立方體,有邊線,具體參數(shù)如下圖7-1所示:圖7-1: void far sector(int x, int y, int stangle, int endangle,int xradiu
78、s, int yradius); 該函數(shù)以(x, y)為中心,以xradius和yradius分別為X軸半徑和Y軸半徑,以stangle為起始角,endangle為結(jié)束角,畫一橢圓扇形。有邊線。void far fillellipse(int x, int y, int xradius, int yradius); 該函數(shù)以(x, y)為中心,以xradius和yradius分別為X軸半徑和Y軸半徑,畫一橢圓,有邊線。void far fillpoly(int numpoint, int *polypoints); 該函數(shù)畫出一個(gè)頂點(diǎn)數(shù)為(numpoin-1)的多邊形,各頂點(diǎn)坐標(biāo)由polypoints決定,若取numpoint為7 ,polypoints可如下定義: polypoints =420,20,330,45,330,145,420,120,510,145,510,55,42
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 研發(fā)部保密協(xié)議書
- 禮儀模特活動(dòng)合同
- 北京市汽車轉(zhuǎn)讓合同
- 新汽車租賃合同模板
- 2025年全球及中國(guó)穿戴美甲行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025-2030全球肺部電阻抗斷層成像儀行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球云原生數(shù)字引擎服務(wù)行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 倉(cāng)儲(chǔ)物流石料配送合同范本
- 商業(yè)空間裝修延期協(xié)議書
- 2025年紫漿色基還原染料行業(yè)深度研究分析報(bào)告
- 子宮畸形的超聲診斷
- 2024年1月高考適應(yīng)性測(cè)試“九省聯(lián)考”數(shù)學(xué) 試題(學(xué)生版+解析版)
- (正式版)JBT 11270-2024 立體倉(cāng)庫(kù)組合式鋼結(jié)構(gòu)貨架技術(shù)規(guī)范
- DB11∕T 2035-2022 供暖民用建筑室溫?zé)o線采集系統(tǒng)技術(shù)要求
- EPC項(xiàng)目采購(gòu)階段質(zhì)量保證措施
- T-NAHIEM 101-2023 急診科建設(shè)與設(shè)備配置標(biāo)準(zhǔn)
- 《復(fù)旦大學(xué)》課件
- 針灸與按摩綜合療法
- 四川2024年專業(yè)技術(shù)人員公需科目“數(shù)字經(jīng)濟(jì)與驅(qū)動(dòng)發(fā)展”參考答案(通用版)
- 《我的家族史》課件
- 煤炭裝卸服務(wù)合同
評(píng)論
0/150
提交評(píng)論