c語(yǔ)言鍵盤操作_第1頁(yè)
c語(yǔ)言鍵盤操作_第2頁(yè)
c語(yǔ)言鍵盤操作_第3頁(yè)
c語(yǔ)言鍵盤操作_第4頁(yè)
c語(yǔ)言鍵盤操作_第5頁(yè)
已閱讀5頁(yè),還剩155頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論