




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第一章 編程技術(shù)實現(xiàn) 本章內(nèi)容簡介:本章主要介紹如何實現(xiàn)鍵盤和鼠標(biāo)的輸入,圖形圖像技術(shù),動畫技術(shù),發(fā)聲技術(shù),漢字顯示技術(shù),精確的時間控制技術(shù)。是編寫大型程序的基本功。雖然每個技術(shù)所涉及的內(nèi)容很少,所提及的函數(shù)也很少,但是當(dāng)它們組合在一起的時候,就可以編寫大型程序。一、鍵盤: 首先有必要介紹一下計算機是如何來處理鍵盤輸入的數(shù)據(jù)的鍵盤里面有一個微處理器,用來掃描和檢測每個鍵的按下或者抬起的狀態(tài),然后向主機傳送一個字節(jié)的鍵盤掃描碼,鍵盤掃描碼翻譯成對應(yīng)的ASC碼。
2、60; 作為編程來說,只要知道每個按鍵都有對應(yīng)的ASC碼。由于ASC碼不能將鍵盤上所有的按鍵全部包括,因此有些控制鍵如Ctrl、Alt、End、Home和Del等用擴充的ASC碼表示。至于每個按鍵所對應(yīng)的ASC碼到底是什么,這里介紹一個函數(shù)可以實現(xiàn)該功能: int bioskey(int n) 該函數(shù)聲明在bios.h頭文件中,所以調(diào)用之前需要在程序開始的位置寫上 #include<bios.h>,(以后如果第一次碰到的函數(shù)可以在TC根目錄下的include文件夾中的頭文件中查找,可以用記事本打開。)參數(shù)n用來確定該函數(shù)的三
3、個功能,具體如下表所示 表1-1參數(shù)n的具體數(shù)值實現(xiàn)的功能0bioskey(0) 返回按鍵的鍵值兩個字節(jié)的整型數(shù)據(jù)。若沒有鍵按下,該函數(shù)一直等待,直到有鍵按下(這種情況有時會影響效率,在之后的例2中會看到有一種方法可以實現(xiàn):在一定時間內(nèi)沒有按鍵就去執(zhí)行下面的代碼)。當(dāng)按下時,返回該鍵所對應(yīng)的ASC碼或其擴展的ASC碼。具體請看例1;1bioskey(1) 查詢是否有鍵按下。 若沒有鍵按下,返回0;若有鍵按下,返回非零值2bioskey(2) 將返回一些控制鍵是否被按過,按過的狀態(tài)由該函數(shù)返回的值來表示,具體請看表2
4、; 如選參數(shù)n為2時,當(dāng)某位為1時,表示相應(yīng)的鍵已按,或相應(yīng)的控制功能已有效,若key值為0x09, 那么從表1-2中可以得知右Shift鍵和Alt鍵被按下,因為只有0x01和0x08相加和為0x09。 若該函數(shù)還是無法理解也不影響最后編小游戲,故此處不做詳細(xì)介紹。 表1-2 字節(jié)位對應(yīng)的16進(jìn)制數(shù)含義字節(jié)位對應(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 ()鍵,屏幕會顯示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ù)會根據(jù)不同的實際情況的 不同而延
7、時不同的時間,精確的時間控制請參閱精確的時間控制(超鏈接)一章*/ if(bioskey(1)!=0) s=1; break;
8、0; printf(“hello”); /* 該例中用了一個5000次的循環(huán),每次延時1,每次去判斷是否有按鍵被按下,如果有,則跳出循環(huán),馬上去執(zhí)行printf(“hello”);若5000次循環(huán)里面都沒有按鍵按下,在循環(huán)結(jié)束后,執(zhí)行printf(“hello”); 這種方法對于最后編小游戲非常有用,在最后的吃豆子放炸彈(超鏈接)例子中會再次提到 */ 最后再介紹一個函數(shù):int kbhit(void); 該函數(shù)聲明
9、在conio.h頭文件中,所以調(diào)用之前需要在程序開始的位置寫上 #include<conio.h>若按了鍵盤,該函數(shù)返回1,否則返回0; C語言也可以實現(xiàn)鼠標(biāo)的操作,但由于這種方法效率低,現(xiàn)在的面向?qū)ο蟮木幊潭疾皇怯肅語言的鼠標(biāo)操作手段。并且,本課程的一些例子中,也可以不用鼠標(biāo)的操作,一般只用鍵盤就可以實現(xiàn)所需要的功能,因此,這里就不做介紹。第二章 文本與圖像的顯示 第一節(jié) 硬件基礎(chǔ) 由于本課程的重點在于讓大家體會C語言的進(jìn)一步用法,所以對于
10、硬件部分的知識(有興趣的話可以到硬件概論學(xué)習(xí)硬件知識),本人會在非講不可的情況下給大家做一介紹,就本人經(jīng)歷而言,沒有掌握硬件知識也不影響C語言的應(yīng)用,但為了知識的完整性,本人就文字圖像顯示所涉及的硬件知識做一介紹。 對于TC而言,如果想利用C的庫函數(shù)在屏幕上顯示圖像,它所支持的顯卡類型如下表2-1所示: 表2-1分辨率顏色數(shù)顯卡類型320×2004CGA320×2002CGA640×2002CGA320×20016EGA640×20016EGA640×3502EGA640×350
11、16EGA640×4802VGA640×48016VGA 表格說明:表中所出現(xiàn)的顯卡類型有:CGA(彩色圖形適配器)EGA(增強型圖形適配器)VGA(視頻圖形陣列適配器)之后將介紹TC所支持的模式 第二節(jié) 文本顯示方式 這里所涉及的函數(shù)有:文本窗口大小的設(shè)定,窗口顏色的設(shè)置,窗口文本的清除和輸入輸出等函數(shù),在之后會對這些函數(shù)做詳細(xì)介紹。這些函數(shù)包含在 conio.h 頭文件中。 1. void textmode (int newmode) 函數(shù) 該
12、函數(shù)用來定義文本方式,具體如下表所示: 表3-2顯示方式行×列 顏色數(shù)值符號常量40×25 黑白0BW4040×25 彩色1C4080×25 黑白2BW8080×25 彩色3C8080×25 單色7MONO上一次的顯示方式-1LASTMODE 表格解釋:該函數(shù)設(shè)置之后才能用上面所提到的一些文本顯示方式下的函數(shù)。當(dāng)然如果不用該函數(shù),TC會認(rèn)為是缺省定義,也就是說,它會默認(rèn)一種模式:80×25。在調(diào)用函數(shù)時,參數(shù)用數(shù)值或者用符號常量是一樣的,比如 textmode(0);和textmode(BW40); 等效
13、。 2void window (int left, int top, int right, int bottom); 該函數(shù)定義屏幕上一個矩形的區(qū)域作為窗口。(left,top)是窗口的左上角坐標(biāo),(right,bottom)是窗口右下角坐標(biāo),這樣一個矩形就唯一確定了。對于屏幕上的坐標(biāo)需要解釋一下,如下圖3-1:如果屏幕是640×480分辨率,則坐上角為坐標(biāo)(0,0),右下角是(640,480) 圖3-1: 注意:該函數(shù)中的坐標(biāo)如果超過了屏幕坐標(biāo),TC不會編譯報錯,但
14、是該函數(shù)無效了。 窗口定義之后,用有關(guān)的窗口輸入輸出函數(shù)就可以只在此窗口內(nèi)進(jìn)行操作而不超出窗口界限。3 . void textbackground(int color) 和 void textcolor(int color) 函數(shù) 前者用來設(shè)置背景顏色,后者用來設(shè)置字符函數(shù)。具體應(yīng)用會在之后的例子給出 有關(guān)顏色參數(shù)color的取值具體如下表3-3所示: 表3-3:適用于前景色或背景色顏色數(shù)值符號常量前景色,背景色黑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è)置文本的字符和背景顏色。 如要求黃底藍(lán)字:textattr(BLUE+(YELLOW<<4); << 表示移位運算,在C課程中有介紹(超鏈接)再如:要求藍(lán)底黃字并且要閃爍:textattr(128+YELLOW+(BLUE<<4));使用時只要根據(jù)這兩個的框架并結(jié)合表2-3就可以自己定義。 最后說明下:textbackground( ) 和 textcolo
17、r( ) 函數(shù)設(shè)置了之后,要用 clrscr( )函數(shù)清除窗口,這樣才能顯示出所設(shè)置的顏色。clrscr( )函數(shù)會在下一文章具體解釋(超鏈接)。 4. 窗口內(nèi)文本輸入輸出函數(shù)4.1文本輸入函數(shù)窗口定義好之后,文本輸入可以采用getch( ) 或 getche( ) 函數(shù)。這兩個函數(shù)定義在 stdio.h頭文件中。函數(shù)原型分別是: int getch(void) int getche(void) (void表示沒有參數(shù))它們的區(qū)別是:getc
18、h( ):讀入一個字符,當(dāng)你用鍵盤輸入的時候,屏幕不顯示你所輸入的字符。getche( ) :讀入一個字符,鍵盤輸入的時候,屏幕顯示所輸入的字符。遇到窗口最右端會自動換行。 4.2 文本的輸出函數(shù): int cprintf(char *format,表達(dá)式表); 括號中內(nèi)容的格式跟 printf()函數(shù)相同(pirnf()在C語言中將誒少超鏈接),比如 cprintf(,) 。int cputs(char *str); 該函數(shù)類似于puts()函數(shù)(puts()在C語言中介紹超鏈接),輸出一個字符串
19、到窗口。int putch(int ch); 輸出一個字符到窗口。 這里要解釋下,TC雖然可以在屏幕上畫多個窗口,但是每次只能處理一個窗口,所以這些函數(shù)在都是在當(dāng)前窗口進(jìn)行操作,而要對別的窗口操作,需要將定義那個窗口的函數(shù)重新調(diào)用一次,則那個窗口就成了當(dāng)前窗口。 以上三個函數(shù)都定義在conio.h頭文件中。conio.h是一個C標(biāo)準(zhǔn)庫中的頭文件。conio是Console Input/Output(控制臺輸入輸出)的簡寫,其中定義了通過控制臺進(jìn)行數(shù)
20、據(jù)輸入和數(shù)據(jù)輸出的函數(shù),主要是一些用戶通過按鍵盤產(chǎn)生的對應(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)的一個新矩形內(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語言課程中介紹,超鏈接)。其中的坐標(biāo)是指屏幕的絕對坐標(biāo)。int puttext(int x1,int y1,int x2,int y2,void*buffer) 相對應(yīng)于上面這個函數(shù),該函數(shù)把指針buffer中的內(nèi)容拷貝到左上角(x1, y1)到右下角(x2, y2)的窗口內(nèi)。其中的坐標(biāo)是指屏幕的絕對坐標(biāo)。 下面一個例子是對以上的幾個函數(shù)的運用。該例子實現(xiàn)了繪制左右兩個窗口,用Tap鍵切換光標(biāo)
23、??梢栽诠鈽?biāo)所在窗口輸入文本,ESC鍵退出。 例子3-1: #include <stdio.h>#include <conio.h>#include <bios.h> char leftbuf40*25*2; /*切換時保存左窗口文本*/ char rightbuf40*25*2; /*切換時保存右窗口文本*/ int leftx, lefty; /*切換時保存左窗口當(dāng)前坐標(biāo)*/ int rightx, righty; /*切換時保存右窗口當(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; /*清屏,也使得以上三個函數(shù)起作用 */ /*以下4句話定義右邊窗口為綠色背景,紅色前景*/ window(41,2,79,24); textbackground(2); textcolor(4); clrscr(); /*清屏,也使得以上三個函數(shù)起作用,單步調(diào)試可以發(fā)現(xiàn),未執(zhí)行該函數(shù),屏幕不會出現(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有一個圖形庫文件(graphic.lib),提供了許多有用的圖形函數(shù),這些函數(shù)均包含在graphics.h頭文件中。 TC所支持的圖形模式如下
37、表所示(和文本顯示類似,表格就不具體介紹了): 表4-1:適配器模式分辨率顏色數(shù)符號常量CGA0320×2004CGAC01320×2004CGAC12320×2004CGAC23320×2004CGAC34640×2002CGAHIEGA0640×20016EGALO1640×35016EGAHIVGA0640×20016VGALO1640×35016VGAMED2640×48016VGAHI TC支持的都是早期的模式,自己編小游戲時也只能在差的里
38、面挑最高的了VGAHI 1. void far initgraph(int far *pdriver, int far *pmode, char far *path) 該函數(shù)用來設(shè)置圖形方式,也就是選擇上表中一種模式。按照習(xí)慣,該函數(shù)使用時一般先定義兩個變量graphdiver, graphmode 。下面以表中最后一種模式為例,說明該函數(shù)具體的使用方法。 int graphdiver=VGA; int graphmode =VGAHI;
39、160; initgraph(&graphdiver, & graphmode,); 最后一個參數(shù)寫作 是表示驅(qū)動程序路徑就在程序文件當(dāng)前所在目錄,所以方便起見,一般把TC目錄下的BGI文件中的所有文件(驅(qū)動程序都在里面了)都拷貝到程序文件所在目錄,那么例子中的程序才可以正常運行,否則要寫路徑, 比如d:tcBGI 此外,若設(shè)置 int graphdiver=DETECT; 那么TC會自動檢測最高的顯示模式,graphdiver參數(shù)不用賦值。 (如果出現(xiàn) BGI Error: Graphics
40、not initialized(use 'initgraph')錯誤,可能是上述路徑的問題,也有可能是機子的問題,請參照附錄) 一旦調(diào)用了該函數(shù),顯示器就變成了圖形顯示模式,而要回到上一節(jié)所說的文本顯示模式,需要調(diào)用函數(shù) closegraph( ) ;2. void far setcolor(int color); void far setbkcolor(int color); 這兩個函數(shù)分別用來設(shè)置前景色(畫
41、圖函數(shù)所畫出的圖形的顏色)和背景色。 下面表4-2介紹了VGAHI模式下color參數(shù)的16種情況。這也同樣適用于EGAHI模式,其他模式的不作介紹了。 表中的所代表的顏色和第三講文本顯示模式下的表3-3相同,看英文就可以知道顏色。 表4-2:數(shù)值符號常量0EGA_BLACK1EGA_BLUE2EGA_GREEN3EGA_GYAN4EGA_RED5EGA_MAGENTA6EGA_BROWN7EGA_LIGHTGRAY數(shù)值符號常量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è)置一個左上角(x1, y1)到右下角(x2, y2)的窗口。clipflag參數(shù)為0時,所畫
43、圖形即使超出了該窗口,仍將顯示超出部分;clipflag參數(shù)非0時(比如寫作1),所畫圖形超出該窗口的部分將不顯示。設(shè)置窗口之后,就可以用相對坐標(biāo)來定位了,也就是說圖形的左上角(x1, y1)成了坐標(biāo)(0, 0)。 用該函數(shù)可以在屏幕上設(shè)置多個函數(shù),甚至可以重疊,但是和文本顯示方式下的設(shè)置窗口函數(shù)一樣,只能對當(dāng)前窗口操作,若要操作別的窗口,需要重新調(diào)用該函數(shù)。 用setcolor設(shè)置前景色時,只對當(dāng)前窗口內(nèi)所畫圖形起作用,并且該窗口在第二次被調(diào)用時如果沒有使用setcolor設(shè)置前景色,TC也能記住之前所設(shè)置的顏色。
44、60; 用setbkcolor設(shè)置背景色時,對整個屏幕背景都起作用。4. 清屏函數(shù) cleardevice( ); 和 clear ( );這兩個函數(shù)分別作用在整個屏幕和當(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()后兩個參數(shù)的用法和printf()函數(shù)一樣,只是sprintf()函數(shù)給出第一個參數(shù)string(一般為字符數(shù)組)。一般在圖形方式下輸出數(shù)字比較麻煩。此時可調(diào)用sprintf()函數(shù)將所要輸出的格式送到第一個參數(shù),然后顯示輸出。再用前兩個函數(shù)輸出。 舉例來說,cp
46、rintf(str, "%d", 10); 就將數(shù)字10轉(zhuǎn)為文本放入了字符串str中。然后就可以調(diào)用前兩個函數(shù)輸出了。 void far settextjustify(int horiz, int vert);該函數(shù)用來設(shè)置輸出方式。具體如下表所示表4-3: 參數(shù)horiz參數(shù)vert符號名值含義符號名值含義LEFT_TEXT0輸出左對齊BOTTOM_TEXT0底部對齊CENTER_TEXT1輸出以字串中心對齊CENTER_TEXT1中心對齊R
47、IGHT_TEXT2輸出右對齊TOP_TEXT2頂部對齊 void far settextstyle(int font, int direction, int char size); 該函數(shù)用來設(shè)置文本輸出的字型,方向和大小。具體如下表所示表4-4:參數(shù)font符號值值含義DEFAULT_FONT08×8字符點陣TRIPLEX_FONT1三倍筆畫體字SMALL_FONT2小字筆畫體字SANS_SERIF_FONT3無襯線筆畫體字GOTHIC_FONT4黑體筆畫體字參數(shù)directionHORIZ_DIR0水平輸出VERT_DIR1垂直輸出參數(shù)size
48、無18×8點陣216×16點陣324×24點陣432×32點陣540×40點陣648×48點陣756×56點陣864×64點陣972×72點陣1080×80點陣 下面舉個例子對以上幾個函數(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,""); /*自動設(shè)置最高模式,運行時請將BGI中文件拷到程序文件所在目錄,否則請輸入路徑*/ 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>頭文件中。 首先介紹幾個畫圖定位有關(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)移動到(a+dx, b+dy)3. int far getx(void); 和 int far gety(void); 這兩個函數(shù)用來得到畫圖起始坐標(biāo)所在位置。前者得到X坐標(biāo),后者得到Y(jié)坐標(biāo)。(void表示沒有參數(shù),使用時:getx(); 就可以得到X坐標(biāo)) 畫點1. void far putpixel(int x, int y, int color); 該函數(shù)在(x,y)坐標(biāo)上畫一點,顏色參數(shù)color如第三講表3-3所示。 畫線1.
54、 首先介紹一下線類型的設(shè)置,void far setlinestyle(int linestyle, unsigned upattern, int thickness); (unsigned表示無符號類型) 這個函數(shù)比較復(fù)雜,下面仔細(xì)介紹一下:thickness參數(shù)只有兩個選擇,1或者3,分別表示1個像素寬的線和三個像素寬的線,想要更寬,可以多次在不同位置調(diào)用,也可以用后面會講到的畫矩形函數(shù)來實現(xiàn)。linestyle參數(shù)的選擇有如下表所示5種情況: 表5-1:符號常量值含義SOLID_LINE0實線DOTTED_LINE1點線CENTER_LINE
55、2中心線DASHED_LINE3點畫線USERBIT_LINE4用戶自定義線 表格說明:如果linestyle參數(shù)選擇0、1、2或3,upattern 參數(shù)取0;如果linestyle參數(shù)選擇4。那么就表示需要用戶自定義,具體說明如下: 自定義的情況下,upattern參數(shù)有16個位,每個位代表一個像素,若該位是1,則用設(shè)置好的前景色顯示該點像素;若該位是0,則用背景色顯示,其效果就是不顯示。比如:想畫間隔的點線 用二進(jìn)制表示1010101010101010 (16位),參數(shù)
56、upattern參數(shù)通常習(xí)慣用16進(jìn)制表示,此時該二進(jìn)制數(shù)就是0xAAAA, 所以調(diào)用函數(shù) setlinestyle(4, 0xAAAA, 1); 之后再用畫線函數(shù)所畫圖形就是1個像素寬的點線,當(dāng)然隨便改二進(jìn)制數(shù)中每一位的0、1值就可以改變線的類型。 另外一點需要注意的是,setlinestyle函數(shù)也會作用到接下來所要講的畫圖函數(shù)(比如畫圓、矩形等)的邊線,所以若在之前調(diào)用了該函數(shù),要想畫出邊線為實線的圓,要重新調(diào)用該函數(shù),并設(shè)置為實線。 設(shè)置好了線類型并且調(diào)用了前一節(jié)所提到的setcolor( )函數(shù)設(shè)置線
57、的顏色之后,就可以用以下三個函數(shù)來畫線了,具體請看例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;下面舉個實例來綜合運用以上的一些函數(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個白點后跟8個不顯示點,接著4個白點*/ move
61、rel(200,0); setcolor(EGA_LIGHTBLUE); setlinestyle(4,0x1001,3); lineto(300,300); /*畫水平中線*/ for(x=125;x<=519
62、;x+=16) /*線的模式是兩個連續(xù)的淡綠點間隔四個不顯示點后,*/ /*又有兩個連續(xù)的淡紅點后接16個不顯示點 */
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è)計各種線型的圖案了,當(dāng)然離不開數(shù)學(xué)計算。第五節(jié) 繪制圖形之二
65、160; 以下函數(shù)所繪的均是只有邊線,而不填充內(nèi)部的圖形。調(diào)用之前,請先用setcolor( )設(shè)置前景色,這里前景色就是指邊線顏色。 1. void far rectangle(int x1,int y1,int x2,int y2); 該函數(shù)畫一個從左上角(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,按逆時針方向旋轉(zhuǎn),角度依次增加,直到360度時回到X正半軸。所以xradius和 yradius分別取0和360時,畫出的是一個完整的橢圓。 以后,凡是函數(shù)中參數(shù)涉及到角度的,都是和此處一樣,從X正半軸角度為0,按逆時針方向旋轉(zhuǎn),角度依次增加,直到360度時回到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 畫一圓弧。 下面舉個例子來運用以上函數(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)格來說用上最好*/ return 0; 運行結(jié)果如圖:由于我電腦不支持TC, 所以是用虛擬機運行的,結(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:符號常量數(shù)值含義EMPTY_FILL0背景色填充(效果和前一節(jié)的函數(shù)相同,只有邊線)SOLID_FILL1實填充(充滿整個封閉區(qū)域)LINE_FILL2用 填充LTSLASH_FILL3用 / / 填充SLASH_FILL4用 粗/ / 填充BKSLASH_FILL5用 填充LTBKSLASH_
74、FILL6用 粗 填充HATCH_FILL7用方網(wǎng)格填充XHATCH_FILL8用斜網(wǎng)格填充INTTERLEAVE_FILL9用間隔點填充WIDE_DOT_FILL10用稀疏點填充CLOSE_DOT_FILL11用密集點填充 2. 如果以上的各種方式還不能讓您滿意的話,那就用自定義填充模式函數(shù):void far setfillpattern(char *upattefn, int color); 該函數(shù)參數(shù)color就不用解釋了,和之前多次提到的一樣,參照表3-3。參數(shù)upattefn是一個字符型數(shù)組,用來設(shè)定8×8的像素點陣所組成的填充
75、模板。用該模板去填充所畫的封閉圖形,好比是貼地磚。每一行都用一個二進(jìn)制數(shù)來表示,該二進(jìn)制數(shù)有8個位,該位上若是1,則顯示該像素;是0就不顯示。和之前提到的自定義線型相同。還是舉例說明比較清楚: char u8=0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x81; setfillpattern(u,RED); 這樣就設(shè)定了自定義的8×8的像素點陣填充模板:第1行全是顯示的,就是一條實線,2-7
76、行是背景色,不顯示,最后一行就是二進(jìn)制數(shù)10000001,就頭尾有一個點。 3. 可填充的基本圖形void bar(int x1, int y1, int x2, int y2); 該函數(shù)從左上角(x1, y1)到右下角(x2, y2)畫一個矩形,該矩形沒有邊線。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)部相同顏色,則會在X正半軸留下一條顏色不同的邊線。當(dāng)然畫圓可以用之后馬上要介紹的一個函數(shù)。void far bar3d(int x1, int y1, int x2, int y2, int depth, int topflag); 該函數(shù)用來畫一個三維的立方體,有邊線,具體參數(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ù)畫出一個頂點數(shù)為(numpoin-1)的多邊形,各頂點坐標(biāo)由polypoints決定,若取numpoint為7 ,polypoints可如下定義: polypoints =420,20,330,45,330,145,420,120,510,145,510,55,42
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 江蘇省東??h2025年初三下學(xué)期統(tǒng)測化學(xué)試題試卷含解析
- 江蘇省徐州市六校-重點達(dá)標(biāo)名校2025屆初三七校聯(lián)考化學(xué)試題試卷含解析
- 成都理工大學(xué)工程技術(shù)學(xué)院《大學(xué)英語(5)》2023-2024學(xué)年第一學(xué)期期末試卷
- 西藏自治區(qū)拉薩市八校2025年高三歷史試題2月聯(lián)考試題含解析
- 廣東省河源市重點中學(xué)2025屆下學(xué)期高三數(shù)學(xué)試題高考仿真考試試卷含解析
- 延安職業(yè)技術(shù)學(xué)院《微生物生理學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 西安汽車職業(yè)大學(xué)《朝鮮(韓國)語視聽說》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣東海洋大學(xué)《行動學(xué)習(xí)》2023-2024學(xué)年第二學(xué)期期末試卷
- 上海出版印刷高等專科學(xué)?!侗w楷行書》2023-2024學(xué)年第一學(xué)期期末試卷
- 山東省金鄉(xiāng)縣金育高級中學(xué)2024-2025學(xué)年高三第二次適應(yīng)性考試物理試題試卷含解析
- 《退役鋰電池清潔循環(huán)利用技術(shù)規(guī)范》編制說明
- 交通法律法規(guī)知識培訓(xùn)
- 夜間安全施工培訓(xùn)
- 零售藥店醫(yī)療保障定點管理暫行辦法
- 道路工程交通安全設(shè)施施工方案及保障措施
- 花粉購銷合同范例
- 大學(xué)生就業(yè)規(guī)劃西部計劃
- 柑橘品種改良研究
- CSMS助力教師構(gòu)建中職數(shù)學(xué)高效課堂的案例研究
- 銀屑病門診病歷分享
- 無人值守道閘運營方案
評論
0/150
提交評論