《C語言程序設(shè)計》課件2第11章_第1頁
《C語言程序設(shè)計》課件2第11章_第2頁
《C語言程序設(shè)計》課件2第11章_第3頁
《C語言程序設(shè)計》課件2第11章_第4頁
《C語言程序設(shè)計》課件2第11章_第5頁
已閱讀5頁,還剩139頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第11章*圖形設(shè)計11.1圖形處理基本概念11.2文本模式下的圖形處理11.3圖形模式下的圖形處理習(xí)題11

本章學(xué)習(xí)要求:

1.了解圖形處理的基本概念,了解文本模式、圖形模式,理解圖形模式的

定義。

2.掌握文本模式下顏色的設(shè)置、文本的輸出、文本圖形處理,掌握圖形系統(tǒng)初始化,繪圖函數(shù)的使用,圖形動畫設(shè)計。

圖形設(shè)計在計算機應(yīng)用領(lǐng)域占有很重要的地位,它廣泛應(yīng)用于計算機輔助設(shè)計、計算機輔助制造、醫(yī)學(xué)等領(lǐng)域,即使是軟件本身也越來越多地以圖形界面進(jìn)行人機交互。各種微機上的C語言都提供了圖形處理功能,事實上,各自的標(biāo)準(zhǔn)庫函數(shù)中大部分是圖形處理函數(shù)。不同的C編譯系統(tǒng),圖形功能可能有些差別,相同功能所用的庫函數(shù)名也可能不一樣,但它們的處理方法基本上是一致的。本章以TurboC

2.0作為工作環(huán)境,介紹圖形程序的設(shè)計。

11.1.1圖形處理與顯示適配器

計算機中的圖形顯示都需經(jīng)過顯示適配器(又稱顯卡)的處理才能輸出到顯示器上,顯示適配器在圖形處理中有著重要的作用。由于顯示適配器的不同,所支持的圖形模式也不同,下面介紹一下TurboC2.0所支持的顯示適配器類型。11.1圖形處理基本概念

1.?CGA

CGA是PC/XT等微機配置的彩色圖形適配器,它可以顯示單色或彩色字符和圖形。

在圖形方式下,TurboC支持兩種分辨率:一種是高分辨率方式(CGAHI),這種方式分辨率可達(dá)640

×

200像素,達(dá)到這種最高分辨率時,背景色是黑色(也可以重新設(shè)置),前景色可以選擇一種(也只能選擇一種),因此圖形只顯示兩種色彩(即前景色和背景色);另一種是中分辨率顯示方式,這種方式分辨率可達(dá)320

×

200像素,其背景色和前景色均可由用戶選擇,但僅能顯示4種顏色。因此,可以有4種顏色模式供選擇,即CGAC0、CGAC1、CGAC2和CGAC3,主要區(qū)別是顯示的4種顏色不同。

2.?EGA

EGA是一種增強圖形適配器,它除了能支持CGA的4種顯示模式外,TurboC中支持兩種分辨率:一種是低分辨率方式(EGALO),分辨率為640×200像素的16色顯示方式;另一種是高分辨率顯示方式(EGAHI),分辨率為640×350像素的16色顯示方式。

3.?VGA

VGA是目前流行的顯示標(biāo)準(zhǔn),稱為視頻圖形陣列適配器,它支持CGA、EGA的所有顯示方式,同時還有640

×

480像素的高分辨率顯示方式(VGAHI),還支持640

×

350像素的中分辨率顯示方式(VGAMED)和620

×

200像素的低分辨率顯示方式(VGALO),它們均可達(dá)到16種顯示顏色。

4.?MCGA

MCGA的功能與CGA相似,它和CGA部分兼容,但有些功能又和VGA類似,它有640

×

480像素的2色模式。

5.?IBM8514

IBM8514適配器有較強的圖形功能,最高分辨率可達(dá)1024

×

768像素,有256種顏色。

6.?EGAMONO

EGAMONO(單色適配器)是一種640

×

350像素單色顯示模式。

其他TurboC支持的適配器及其顯示模式參見后面的表11.3。11.1.2文本模式

文本模式是顯示文本字符的一種顯示方式,它顯示的是字符,而在圖形模式下,顯示的是像素。

在文本模式下繪圖時需要對顯示字符的位置進(jìn)行定位,這種定位是由坐標(biāo)系統(tǒng)來決定的,由于是文本顯示模式,要控制字符的位置就可以用字符顯示時的行、列為設(shè)置坐標(biāo)的單位。

在缺省方式下,TurboC規(guī)定屏幕坐標(biāo)為每屏80列25行,屏幕的左上角為第1行第1列,右下角為第25行第80列,如圖11.1所示。

圖11.1文本模式坐標(biāo)系統(tǒng)在TurboC中除了缺省的80列25行顯示方式外,還提供了其他文本顯示方式(見后面的表11.1)。

在文本模式下,可以顯示各種字符,可以控制字符的色彩、亮度和背景色等。TurboC中還提供了很多在文本模式下進(jìn)行屏幕處理的函數(shù),這些函數(shù)在使用時需要包含頭文件“conio.h”。11.1.3圖形模式

在圖形模式下,顯示的基本單位是像素,像素作為圖形處理的基本單位,在屏幕上顯示為一個點(又稱像素點)。屏幕上像素的數(shù)目就是我們常說的屏幕分辨率,分辨率的高低取決于顯示適配器、顯示器和屏幕顯示模式。

顯示圖形時,也可以通過屏幕坐標(biāo)系統(tǒng)來決定像素點的位置,在屏幕坐標(biāo)系統(tǒng)中,以左上角為坐標(biāo)原點,x軸向右,y軸向下,原點坐標(biāo)為(0,0),如圖11.2所示。如:(310,195)表示第310列第195行處像素的坐標(biāo)。

圖11.2圖形屏幕坐標(biāo)系統(tǒng)在程序設(shè)計中使用像素時,必須先初始化屏幕,其中必須指定圖形模式,TurboC中使用到的圖形模式參見后面的表11.3。11.1.4設(shè)計圖形程序的步驟

利用C語言設(shè)計的圖形程序,通常具有以下程序框架:

(1)確定圖形顯示方式,即圖形模式的初始化。

(2)設(shè)置屏幕的背景色和前景色等屬性。

(3)利用圖形函數(shù),在規(guī)定的坐標(biāo)位置上畫圖形或?qū)懳淖帧?/p>

(4)在一些封閉的圖形區(qū)域填充顏色。

(5)關(guān)閉圖形的顯示方式。

在文本模式下,Turbo

C提供了一系列屏幕處理函數(shù),這些函數(shù)包含在頭文件“conio.h”中。11.2文本模式下的圖形處理11.2.1文本模式設(shè)置

文本模式的設(shè)置可以通過函數(shù)textmode()來實現(xiàn)。該函數(shù)的使用格式如下:

textmode(intmode);

其中:參數(shù)mode是將要設(shè)置的文本模式,可以取的參數(shù)值如表11.1所示。

表11.1文本模式在使用函數(shù)textmode()時,參數(shù)mode可以是文本模式名,也可以是文本模式代碼。例如,下面的程序代碼都是設(shè)置文本模式為彩色、40

×

25。

textmode(1);

textmode(C40);11.2.2顏色設(shè)置

在文本模式下,如果使用了彩色的文本模式,就可以設(shè)置輸出時的文本顏色及背景顏色,這些設(shè)置可以由相應(yīng)的函數(shù)完成。

1.文本顏色設(shè)置

文本顏色可以由函數(shù)textcolor()來設(shè)置。該函數(shù)的功能是:設(shè)置顯示文本的前景色,也就是字符的顏色。該函數(shù)使用格式如下:

textcolor(intcolor);

參數(shù)color是將要設(shè)置的顏色,可以取的參數(shù)值如表11.2所示。

表11.2屏幕顏色表可以使用顏色常量或數(shù)值來設(shè)置文本顏色,例如:

textcolor(GREEN);

textcolor(2);

上面的兩行語句都可以設(shè)置文本的前景色為綠色。

2.文本背景顏色設(shè)置

除了可以設(shè)置文件的前景色外,還可以設(shè)置文本的背景色,文本的背景色由函數(shù)textbackground()來設(shè)置。該函數(shù)使用格式如下:

textbackground(intcolor);

其中:參數(shù)color是將要設(shè)置的顏色,可使用的參數(shù)值為表11.2中的前8種(即數(shù)值為0~7)。

3.文本屬性設(shè)置

文本顏色設(shè)置函數(shù)textattr()可用于設(shè)置文本的屬性,包括前景色、背景色,以及字符顯示時是否閃爍、是否加亮。該函數(shù)使用格式如下:

textattr(intattr);

其中:參數(shù)attr使用一個字節(jié)來描述文本的屬性,各位的含義如圖11.3所示。

圖11.3文本屬性字節(jié)的含義從圖中可以看出,低4位(0~3位)用來設(shè)置字符顯示的顏色(前景色),對應(yīng)取的顏色值為0~15;第4~6位用于設(shè)置背景色;最高位設(shè)置顯示出的字符是否閃爍。

設(shè)置文本屬性時,可以通過位運算來控制顏色設(shè)置到字節(jié)的具體位。例如,下面的語句將設(shè)置黃色背景下的紅色字符:

textattr(RED+(YELLOW<<4));

下面的語句將設(shè)置白色背景下的綠色閃爍字符:

textattr(GREEN+BLINK+(WHITE<<4));

4.文本亮度設(shè)置

TurboC中提供了三個設(shè)置文本亮度的函數(shù),分別如下:

highvideo(); /*用于設(shè)置文本為高亮顯示*/

lowvideo(); /*用于設(shè)置文本為低亮顯示*/

normvideo(); /*用于設(shè)置文本為正常亮度*/11.2.3文本輸出

文本窗口是文本模式下在屏幕上定義的一個矩形區(qū)域,在文本窗口定義后,如果要在屏幕上顯示文本信息,將只顯示在這個窗口中,而不能輸出到窗口以外的區(qū)域。默認(rèn)情況下,窗口就是整個屏幕。

1.文本窗口的設(shè)置

使用window()函數(shù)可以將全屏幕窗口設(shè)置成指定大小的窗口。其使用格式如下:

window(intleft,inttop,intright,intbottom);

其中:(left,top)是窗口左上角的坐標(biāo),而(right,bottom)是窗口右下角的坐標(biāo)。

一旦窗口定義好,前面的textcolor()、textbackground()和textattr()函數(shù)將只對窗口有效,窗口以外的區(qū)域不受影響。

2.文本的輸出

以前我們學(xué)過的printf()、puts()和putchar()等函數(shù)都是以全屏幕為窗口進(jìn)行輸出的,如果要以自定義的窗口為輸出對象,則需要使用文本窗口下的輸出函數(shù),它們分別是:

cprintf(char*format,表達(dá)式表列);

cputs(char*str);

putch(intch);

這三個函數(shù)的功能相當(dāng)于printf()、puts()和putchar(),用法也相同,只是它們以窗口作為輸出對象,而不是全屏幕。

3.屏幕清除

在圖形繪制中經(jīng)常需要將屏幕或窗口中原來的輸出清除掉,為此,TurboC提供了文本方式下對屏幕進(jìn)行清除的函數(shù),分別如下:

clrscr();

clreol();

delline();

clrscr()函數(shù)將整個窗口或屏幕中的文本全部清除,并將光標(biāo)移到窗口/屏幕左上角,如果在執(zhí)行該函數(shù)前設(shè)置過文本顏色、背景顏色或文本屬性,則清屏后這些設(shè)置將生效。

clreol()函數(shù)將當(dāng)前文本從光標(biāo)位置開始到本行結(jié)束的所有字符都清除,但不改變光標(biāo)位置。

delline()函數(shù)將清除光標(biāo)所在行的所有字符。

例11.1

顯示彩色文本。

#include<stdio.h>

#include<conio.h> /*將文本模式處理函數(shù)頭文件包 含進(jìn)來*/

main()

{

charstr[80]="彩色文字";

textmode(C80); /*設(shè)置文本模式*/

textcolor(YELLOW); /*設(shè)置文本顏色*/

textbackground(CYAN); /*設(shè)置背景色*/

clrscr();

window(5,1,20,4); /*設(shè)置窗口*/

textcolor(RED); /*設(shè)置文本顏色*/

clrscr();

cprintf("\n%s\n",str); /*輸出字符串*/

window(25,1,40,4);

textbackground(BLUE); /*設(shè)置背景色*/

clrscr();

cprintf("\n%s\n",str); /*輸出字符串*/

window(45,1,60,4);

textattr(BLACK+(WHITE<<4)); /*設(shè)置文本屬性*/

clrscr();

cprintf("\n%s\n",str); /*輸出字符串*/

getch(); /*等待按鍵*/

}

程序執(zhí)行時顯示結(jié)果如圖11.4所示。

程序中的語句“getch();”是暫停程序向下執(zhí)行,當(dāng)按任意鍵才繼續(xù)執(zhí)行,常用來讓運行程序停留在輸出界面。

圖11.4顯示結(jié)果

4.光標(biāo)定位

前面學(xué)習(xí)的幾種輸出函數(shù)都是從當(dāng)前行當(dāng)前光標(biāo)位置順序輸出,不能滿足繪圖的需要。為了能在窗口的指定位置輸出,可以使用gotoxy()函數(shù)。該函數(shù)的使用格式如下:

gotoxy(intx,inty);

gotoxy()函數(shù)的功能是:將光標(biāo)移動到坐標(biāo)(x,y)位置,并以此位置作為當(dāng)前的輸出位置。注意:這里的(x,y)是相對當(dāng)前窗口而言的。例11.2

文字字幕。

本例實現(xiàn)了在文本模式下移動文本,將像電影中的字幕一樣。

#include<conio.h> /*將文本模式處理函數(shù)頭文件包 含進(jìn)來*/

main()

{inti,k=1;

charstr[80]="TurboC2.0";

textmode(C80); /*設(shè)置文本模式*/

window(1,1,80,4); /*設(shè)置窗口*/

textcolor(RED); /*設(shè)置文本顏色*/

textbackground(BLUE); /*設(shè)置背景色*/

clrscr(); /*清除整個窗口*/

i=1;

while(1)

{delay(10000); /*設(shè)置延時*/

if(i>70){i=i%70;k++;} /*循環(huán)移動文本,k為循環(huán) 次數(shù)*/

gotoxy(i,2); /*設(shè)置光標(biāo)位置*/

delline(); /*清除當(dāng)前行所有字符*/

cprintf("%s",str); /*輸出文本*/

i++;

if(k>10)break; /*當(dāng)循環(huán)10次后將結(jié)束*/

}

getch(); /*暫停程序執(zhí)行,直到按任意鍵后繼續(xù)*/

}

程序運行時可以看到字符串“TurboC2.0”文字在定義的窗口(藍(lán)底、紅字)中從左到右循環(huán)移動,一共移動10次。11.2.4文本圖形處理

在ASCII碼和擴展ASCII碼中有一些字符圖形,如果要在屏幕上輸出一些文本圖形,就要使用這些圖形字符。在文本模式下,要想輸出這些字符圖形,只需要使用putch()函數(shù)將ASCII碼輸入即可,例如:

putch('8'); /*向屏幕輸出一個字符8*/

putch(0x01); /*向屏幕輸出一個小笑臉圖形*/

在輸出之前可以使用gotoxy()函數(shù)將光標(biāo)定位到需要輸出圖形的位置,再將字符圖形輸出。

1.文本圖形的移動函數(shù)

函數(shù)movetext()可以將指定矩形區(qū)域中的文本復(fù)制到一個新的位置。該函數(shù)的使用格式如下:

movetext(intx1,inty1,intx2,inty2,intx3,inty3);

movetext()函數(shù)的功能是:將左上角為(x1,y1)、右下角為(x2,y2)的矩形區(qū)域復(fù)制到以(x3,y3)為左上角坐標(biāo)的新位置,并且,原矩形區(qū)域內(nèi)的圖形不會改變。

需要注意的是,movetext()函數(shù)中的坐標(biāo)是以全屏幕為坐標(biāo)系統(tǒng)的,而與窗口無關(guān)。

例11.3

文本圖形移動舉例。

#include<conio.h> /*將文本模式處理函數(shù)頭 文件包含進(jìn)來*/

main()

{

charstr[80]="移動區(qū)域";

textmode(C80); /*設(shè)置文本模式*/

window(1,1,80,25); /*設(shè)置窗口*/

clrscr();

textcolor(RED); /*設(shè)置文本顏色*/

textbackground(CYAN);

/*設(shè)置背景色*/

cprintf("%s",str);

/*輸出文本*/

movetext(1,1,10,1,10,10);

/*將(1,1)~(10,1)矩形區(qū)域 復(fù)制到(10,10)為左上角的新位置*/

movetext(1,1,10,1,20,15);

/*將(1,1)~(10,1)矩形區(qū)域 復(fù)制到(20,15)為左上角的新位置*/

movetext(1,1,10,1,30,20);

/*將(1,1)~(10,1)矩形區(qū)域 復(fù)制到(30,20)為左上角的新位置*/

getch();

/*暫停程序執(zhí)行,直到按任意 鍵后繼續(xù)*/

}

2.文本圖形的存取函數(shù)

文本圖形可以存儲起來以供多次使用,例如,當(dāng)某部分區(qū)域被掩蓋后需要重新繪制時,TurboC中可以使用函數(shù)gettext()來存取文本圖形。該函數(shù)的使用格式如下:

gettext(intx1,inty1,intx2,inty2,void*buffer);

gettext()函數(shù)可以將左上角為(x1,y1)、右下角為(x2,y2)的矩形區(qū)域內(nèi)的文本圖形存儲到buffer指向的緩沖區(qū),在存儲時,矩形內(nèi)的文本圖形按字符從上向下、從左向右連接并存儲到緩沖區(qū)內(nèi)。在調(diào)用該函數(shù)前應(yīng)先計算出所需緩沖區(qū)的大小,由于屏幕上一個字符需要占用2個字節(jié)的存儲空間,即1個字節(jié)存儲ASCII碼,另1個字節(jié)存儲文本屬性。因此計算緩沖區(qū)大小可以用下面的公式:

緩沖區(qū)字節(jié)數(shù)

=

矩形行數(shù)

×

矩形列數(shù)

×

2

矩形行數(shù)

=

y2

-y1

+

1

矩形列數(shù)

=

x2

-x1

+

1使用gettext()函數(shù)存儲在緩沖區(qū)內(nèi)的文本圖形可以使用puttext()函數(shù)讀出,puttext()函數(shù)的使用格式如下:

puttext(intx1,inty1,intx2,inty2,void*buffer);

puttext()函數(shù)完成的功能是:將buffer指向的存儲緩沖區(qū)內(nèi)的文本圖形顯示到左上角為(x1,y1)、右下角為(x2,y2)的矩形區(qū)域中。

3.狀態(tài)查詢

如果需要知道當(dāng)前屏幕的顯示方式、窗口的坐標(biāo)、光標(biāo)位置和文本屬性等,就需要使用gettextinfo()函數(shù),該函數(shù)的使用格式如下:

gettextinfo(structtext_info*f);

該函數(shù)在執(zhí)行時,將獲得的信息存儲到指針f所指向的結(jié)構(gòu)體變量中。Structtext_info結(jié)構(gòu)類型在頭文件conio.h中有定義,其成員結(jié)構(gòu)的含義如下:

structtext_info

{

unsignedcharwinleft; /*窗口左上角x坐標(biāo)*/

unsignedcharwintop; /*窗口左上角y坐標(biāo)*/

unsignedcharwinright; /*窗口右下角x坐標(biāo)*/

unsignedcharwinbottom; /*窗口右下角y坐標(biāo)*/

unsignedcharattribute; /*文本屬性*/

unsignedcharnormattr; /*默認(rèn)屬性*/

unsignedcharcurrmode; /*當(dāng)前文本模式*/

unsignedcharscreenheight; /*屏幕高度*/

unsignedcharscreenwidth; /*屏幕寬度*/

unsignedcharcurx; /*當(dāng)前光標(biāo)x坐標(biāo)*/

unsignedcharcury; /*當(dāng)前光標(biāo)y坐標(biāo)*/

};

盡管使用gettextinfo()函數(shù)可以得到當(dāng)前光標(biāo)位置的坐標(biāo),但光標(biāo)位置查詢在圖形輸出中用得最多。因此,TurboC還提供了兩個光標(biāo)位置查詢的函數(shù),即

intwherex(); /*返回光標(biāo)所在x坐標(biāo)*/

intwherey(); /*返回光標(biāo)所在y坐標(biāo)*/例11.4獲取當(dāng)前屏幕文本信息。

#include<stdio.h>

#include<conio.h> /*將文本模式處理函數(shù)頭文件包 含進(jìn)來*/

main()

{structtext_infoinfo;

textmode(C80);

textattr(WHITE+(BLUE<<4));

window(1,1,60,25);

clrscr();

gettextinfo(&info); /*獲取屏幕文本信息放入info結(jié)構(gòu) 體變量中*/

printf("屏幕文本信息\n\n");

printf("窗口左上角坐標(biāo)為:(%d,%d)\n",info.winleft,info.wintop);

printf("窗口右下角坐標(biāo)為:(%d,%d)\n",info.winright,info.winbottom);

printf("當(dāng)前文本模式為:%d\n",info.attribute);

printf("當(dāng)前屏幕高度為:%d\n",info.screenheight);

printf("當(dāng)前屏幕寬度為:%d\n",info.screenwidth);

printf("當(dāng)前光標(biāo)位置為:(%d,%d)\n",wherex(),wherey()); /*獲取光標(biāo)位置信息*/

printf("當(dāng)前光標(biāo)位置為:(%d,%d)\n",info.curx,info.cury); /*獲取光標(biāo)位置信息*/

getch(); /*暫停程序執(zhí)行,直到按 任意鍵后繼續(xù)*/

}程序運行結(jié)果如圖11.5所示,試想一下:為什么最后一行輸出的是(1,1),而不與倒數(shù)第二行輸出的一樣呢?主要是因為用gettextinfo()函數(shù)時光標(biāo)定位就在(1,1),后來光標(biāo)隨著輸出而移動了,但并沒有更新info.curx、info.cury中的值。

還有一個問題,如果本例中不用printf()函數(shù),而改用cprintf()函數(shù),會有什么樣的結(jié)果呢?(提示:cprintf()函數(shù)是從當(dāng)前光標(biāo)位置處開始輸出。)

圖11.5程序運行結(jié)果

在文本模式下,存在屏幕的行列數(shù)太少、圖形字符比較少等弱點,并且看起來的效果也不太好,因此,對于要求復(fù)雜、精確、漂亮的圖形,一般都在圖形模式下繪制。TurboC中提供了豐富的圖形函數(shù)庫,它包括圖形庫文件graphics.lib、圖形函數(shù)頭文件graphics.h和許多以BGI(圖形接口)為后綴的顯示適配器的驅(qū)動程序,如EGAVGA.BGI、CGA.BGI等。11.3圖形模式下的圖形處理11.3.1圖形系統(tǒng)的初始化

在TurboC中默認(rèn)的是文本方式,因此在進(jìn)行圖形繪制前要先進(jìn)行圖形系統(tǒng)的初始化,并且在繪圖結(jié)束后還要將其關(guān)閉,還原回文本方式。

1.圖形模式的檢測

如果對當(dāng)前顯示器的型號和分辨率模式不清楚,可以使用detectgraph()函數(shù)對圖形模式進(jìn)行檢測。

detectgraph()函數(shù)的使用格式如下:

detectgraph(intfar*graphdriver,intfar*graphmode);

其中:參數(shù)graphdriver為取得的圖形適配器類型,graphmode為分辨率模式。函數(shù)執(zhí)行時,將檢測到的圖形適配器類型賦給graphdriver,將檢測到的該類型適配器所支持的最高分辨率模式賦給graphmode。參數(shù)far表示長指針,這與程序的存儲模式有關(guān),TurboC中支持多種類型的存儲模式,比如:極小型、小型、中型、緊湊型、大型和特大型。只有極小型和小型是用near指針(16位),其他三種存儲模式使用far指針(32位)。關(guān)于各種指針的使用,請參考相關(guān)專業(yè)書籍。本書介紹的程序均為near型指針,由于是小程序,因此可省略指針修飾,所以detectgraph()函數(shù)在使用時可省略成下面的格式:

detectgraph(&graphdriver,&graphmode);

TurboC中支持的圖形適配器和圖形模式見表11.3。

表11.3常用圖形適配器及圖形模式續(xù)表2.圖形模式的初始化

圖形模式的初始化是指選擇某一與所用顯示器和顯卡相適應(yīng)的模式,使顯示器按與該模式對應(yīng)的分辨率顯示圖形或字符。圖形模式的初始化是圖形程序設(shè)計的前提,這一工作是由initgraph()函數(shù)完成的。該函數(shù)的格式如下:

initgraph(int*gdriver,int*gmode,char*path);

initgraph()函數(shù)的功能是:從指定的磁盤目錄路徑中裝入一個圖形驅(qū)動程序來初始化圖形系統(tǒng),并將顯示器設(shè)置成具有一定分辨率及可顯示的顏色數(shù)和可存儲圖形的顯示頁數(shù)的圖形模式。參數(shù)gdriver為調(diào)用的圖形驅(qū)動程序(.bgi)。TurboC系統(tǒng)中的*.bgi文件是各種顯示器的驅(qū)動程序。使用不同的顯示系統(tǒng),要裝入不同的圖形驅(qū)動程序。gdriver的常用代碼及其含義見表11.3,其代碼可以使用符號常量或數(shù)值表示。

參數(shù)gmode為圖形模式,其代碼見表11.3。

參數(shù)path為圖形驅(qū)動程序的存儲路徑,該參數(shù)可省略(用""表示),此時在系統(tǒng)當(dāng)前目錄下查找驅(qū)動程序。特別注意,該函數(shù)中的三個形參都是指針,因此在引用時實參要用地址值。在使用本函數(shù)和其他所有圖形函數(shù)時,要注意顯示器的驅(qū)動程序*.bgi是不可缺少的。另外,*.chr文件是筆畫的字符模型,同樣也不可缺少。并要求TurboC2.0主菜單的Options功能項中的Linker-Graphicslibrary要選取on,程序才能可靠地連接運行。在某些情況下,還可以使用DETECT常量讓系統(tǒng)在初始化時自動檢測,例如:

intdriver=DETECT;

intmode;

initgraph(&driver,&mode);

上面的程序段將自動檢測適配器,并以檢測到的適配器的最高分辨率模式進(jìn)行初始化。

3.清除屏幕

在繪圖前,通常都需要將屏幕進(jìn)行清理,以便繪圖,這就要使用函數(shù)cleardevice()。該函數(shù)的使用格式如下:

cleardevice();

cleardevice()函數(shù)的功能是清除整個屏幕上的內(nèi)容。

4.關(guān)閉圖形模式

當(dāng)進(jìn)入圖形模式并完成圖形處理以后,必須要退出圖形狀態(tài),返回文本模式(默認(rèn)方式),并釋放用于保存圖形驅(qū)動程序和字體的系統(tǒng)內(nèi)存。TurboC中提供了closegraph()函數(shù)來完成這一功能。該函數(shù)的使用格式如下:

closegraph();11.3.2繪圖函數(shù)

1.屏幕顏色的設(shè)置

屏幕顏色可分為背景色和前景色。在設(shè)置屏幕顏色時,可以使用下面兩個函數(shù):

setcolor(intcolor);/*用于設(shè)置前景色,即畫筆顏色*/

setbkcolor(intcolor);/*用于設(shè)置背景色*/

其中:color為顏色的規(guī)定數(shù)值,可取的顏色值見表11.4。

表11.4繪圖顏色表注意:

(1)系統(tǒng)默認(rèn)背景色為黑色(color值為0),前景色為白色(color值為15),即黑底白字。

(2)背景色和前景色不要采用相同或相近的顏色。

2.畫點

點的繪制由putpixel()函數(shù)完成。該函數(shù)的使用格式如下:

putpixel(intx,inty,intcolor);

putpixel()函數(shù)的功能是:在坐標(biāo)(x,y)處用color指定的顏色繪制一個點。color的取值見表11.4。

如果要想取得某一點的顏色,可使用函數(shù)getpixel()來完成,該函數(shù)的使用格式如下:

intgetpixel(intx,inty);

該函數(shù)用于獲取并返回(x,y)這一點的顏色值。

3.畫直線

畫直線的函數(shù)有多個,分別如下:

line(intx0,inty0,intx1,inty1); /*從點(x0,y0)到點(x1,y1) 繪制一條直線*/

lineto(intx,inty); /*從當(dāng)前位置(CP)到點 (x,y)繪制一條直線*/

linerel(intdx,intdy); /*從當(dāng)前位置(CP)按相對 增量dx、dy繪制一條直線*/在繪圖時,有一支看不見的“畫筆”,該畫筆所指的位置稱為當(dāng)前位置(CP)。圖形系統(tǒng)初始化時,畫筆總是指向左上角的坐標(biāo)原點(0,0),但隨著圖形的繪制,當(dāng)前位置會不斷變動。上面三個函數(shù)在繪圖時,line()函數(shù)不改變CP的位置,即CP仍在原位置;而lineto()和linerel()函數(shù)會將CP移到線條的尾部。在畫直線時,線條的顏色由setcolor()函數(shù)指定,還可以用setlinestyle()函數(shù)設(shè)定線條的線型,該函數(shù)的使用格式如下:

setlinestyle(intlinestyle,unsignedupattern,intthickness);

其中:參數(shù)linestyle的取值如表11.5所示,默認(rèn)為實線。但該參數(shù)不影響圓、圓弧、橢圓和扇形的線型。

表11.5linestyle的線型代碼表參數(shù)thickness是指線的寬度,默認(rèn)線寬為一個像素寬,還可以取三個像素寬,見表11.6。但該參數(shù)影響圓、圓弧、橢圓和扇形的線型。表11.6線寬代碼表參數(shù)upattern僅在用戶定義線型時才有意義(其他情況下upattern取值為0)。該參數(shù)是一個16位的二進(jìn)制碼,用于決定16位像素中的某一位是否被顯示。若某一位為1,則該位像素顯示,為0則不顯示。例如:101010101010則表示間隔像素顯示,即畫一條點線。

4.坐標(biāo)的檢測與定位

在TurboC系統(tǒng)中可以使用getx()函數(shù)和gety()函數(shù)來獲取當(dāng)前CP的位置,還可以使用moveto()和moverel()函數(shù)來重新定位CP。這幾個函數(shù)的使用格式如下:

intgetx(); /*返回畫筆在x軸的位置*/

intgety(); /*返回畫筆在y軸的位置*/

moveto(intx,inty); /*將CP位置移到(x,y)*/

moverel(intdx,intdy); /*將CP位置移到(x+dx,y+dy)位置 */

intgetmaxx();/*返回當(dāng)前圖形驅(qū)動程序和模式下的屏幕 最大x值*/

intgetmaxy();/*返回當(dāng)前圖形驅(qū)動程序和模式下的屏幕最大y值*/

5.畫其他圖形

1)畫矩形

(1)

rectangle()函數(shù)可以畫矩形框,使用格式如下:

rectangle(intx1,inty1,intx2,inty2);

rectangle()函數(shù)將在以(x1,y1)為左上角、(x2,y2)為右下角的矩形區(qū)域內(nèi)畫一個空心的矩形框。

(2)

bar()函數(shù)可以畫實心矩形,使用格式如下:

bar(intx1,inty1,intx2,inty2);

bar()函數(shù)將在以(x1,y1)為左上角、(x2,y2)為右下角的矩形區(qū)域內(nèi)畫一個實心的矩形框。矩形內(nèi)部的填充模式和顏色可以使用后面要講到的填充函數(shù)。

(3)

bar3d()函數(shù)可以畫三維立體圖,使用格式如下:

bar3d(intx1,inty1,intx2,inty2,intdepth,inttopflag);

該函數(shù)以(x1,y1)為左上角,(x2,y2)為右下角,深度為depth,畫一正面填充的三維立體圖。當(dāng)topflag

=

0時,三維圖形不封頂。其中,第三維的方向始終為45°。

2)畫圓、橢圓、圓弧與扇形

(1)

circle()函數(shù)可以畫圓,使用格式如下:

circle(intx,inty,intradius);

該函數(shù)以(x,y)為圓心,以radius為半徑畫一個圓形。

(2)

ellipse()函數(shù)可以畫橢圓,使用格式如下:

ellipse(intx,inty,intstangle,intendangle,intxradius,intyradius);

該函數(shù)在(x,y)為中心,以xradius和yradius為x軸和y軸半徑,從起始角stangle到endangle角結(jié)束,畫一橢圓弧線。

當(dāng)設(shè)置stangle為0、endangle為360時,繪制的是一個完整橢圓,否則繪出的是橢圓弧。

(3)

arc()函數(shù)可以畫圓弧,使用格式如下:

arc(intx,inty,intstangle,intendangle,intradius);

該函數(shù)以(x,y)為中心,以radius為半徑,從起始角stangle到endangle角結(jié)束,繪制圓弧。

(4)

pieslice()函數(shù)可以畫扇形,使用格式如下:

pieslice(intx,inty,intstangle,intendangle,intradius);

該函數(shù)以(x,y)為圓心,radius為半徑,stangle為起始角度,endangle為終止角度,畫一被填充過的扇形。當(dāng)stangle=0、endangle=360時,畫出一個實心圓,并在圓內(nèi)從圓點沿x軸正向畫一條半徑。

(5)

fillellipse()函數(shù)可畫封閉橢圓,使用格式如下:

fillellipse(intx,inty,intxradius,intyradius);

該函數(shù)將以(x,y)為中心,以xradius和yradius為x軸和y軸半徑,繪制封閉的橢圓。圖形內(nèi)部的填充模式和顏色可以使用相關(guān)函數(shù)進(jìn)行設(shè)置,如沒有設(shè)置,則使用缺省模式。

(6)

sector()函數(shù)可畫橢圓扇形,使用格式如下:

sector(intx,inty,intstangle,intendangle,intxradius,intyradius);

該函數(shù)將以(x,y)為中心,以xradius和yradius為x軸和y軸半徑,從起始角stangle到endangle角結(jié)束,繪制橢圓扇形。

(7)

drawpoly()函數(shù)可畫多邊形,使用格式如下:

drawpoly(intnumpoint,intfar*polypoints);

該函數(shù)用于畫一個頂點數(shù)為numpoint的多邊折線,參數(shù)polypoints是存放numpoint個頂點坐標(biāo)的整形數(shù)組。在數(shù)組中,各頂點坐標(biāo)按x1,y1,x2,y2,…存放。如果繪制的是封閉圖形,則第一個頂點與最后一個頂點的坐標(biāo)相同。

(8)

fillpoly()函數(shù)可畫填充多邊形,使用格式如下:

fillpoly(intnumpoint,intfar*polypoints);

該函數(shù)將繪制一頂點數(shù)為numpoint、各頂點坐標(biāo)由polypoints給出的多邊形。所繪出的多邊形的邊數(shù)為numpoint-1,如果繪制的是封閉圖形,則第一個頂點與最后一個頂點的坐標(biāo)相同。

6.圖形填充

在默認(rèn)情況下,繪制出的封閉圖形都是單白色實填充,如果需要設(shè)置填充樣式和填充色,則可以使用setfillstyle()函數(shù)來實現(xiàn),該函數(shù)格式如下:

setfillstyle(intpattern,intcolor);

其中:參數(shù)pattern為填充樣式,可以選擇的樣式如表11.7所示;參數(shù)color為填充色,見表11.5。

表11.7填充樣式如果選擇了USER_FILL參數(shù),則用戶可以自定義填充樣式進(jìn)行填充,用戶自定義樣式由setfillpattern()函數(shù)設(shè)定,格式如下:

setfillpattern(char*upattern,intcolor);

該函數(shù)用于設(shè)置用戶自定義填充樣式,以顏色color進(jìn)行填充。參數(shù)upattern是一個指向8個字節(jié)存儲區(qū)的指針,這8個字節(jié)存儲了8

×

8像素構(gòu)成的填充圖模,其中每個字節(jié)代表一行,每個字節(jié)的一個二進(jìn)制位表示該位上是否有像素點,如果為1,顯示由color指定的顏色像素;如果為0,則不顯示。設(shè)定填充樣式后,可用floodfill()函數(shù)對任意封閉的圖形進(jìn)行填充,其格式如下:

floodfill(intx,inty,intborder);

其中:(x,y)為封閉圖形內(nèi)的任意一點,該點稱為填充種子;Border為封閉邊界的顏色,該值必須與圖形輪廓的顏色值一致,否則會使填充超出輪廓。圖形內(nèi)部的填充顏色和樣式由setfillstyle()函數(shù)設(shè)定。

7.圖形模式下的文本輸出

在圖形模式下,可以用printf()、putchar()等標(biāo)準(zhǔn)輸出函數(shù)向屏幕輸出。但它們只能以前景色為白色,輸出80列25行的文本,無法與多種圖形模式有效地配合。

TurboC提供了一些用在圖形模式下的專業(yè)文本輸出函數(shù),它們可以用來選擇輸出位置,輸出的字型、大小、輸出方式等。

為了在圖形方式下輸出文本,TurboC提供了一個8

×

8點陣的字庫,字庫中包含英文字母和一些常用符號的字模,它們是用8

×

8點陣表示的字形庫。該字庫嵌入在圖形系統(tǒng)中,當(dāng)TurboC對系統(tǒng)進(jìn)行圖形系統(tǒng)初始化(即使用initgraph()函數(shù)時)后,該字庫即被調(diào)入內(nèi)存。這種字庫也是在缺省情況下,圖形模式下輸出文本時采用的字形。另外,TurboC的圖形接口軟件(BGI)還提供了4種向量字庫。在該字庫中字符用一組向量表示,這些向量表示如何畫字符。4個向量字庫都是以擴展名為

.chr的文件名存放。它們是itrip.chr(3倍筆畫字庫)、litt.chr(無襯筆畫字庫)、goth.chr(黑體筆畫字庫)和sans.chr(小號筆畫字庫)。當(dāng)文本輸出選擇這些字庫中的一個時,如用settextstyle()函數(shù),則相應(yīng)的筆畫字庫就被調(diào)入內(nèi)存。這些字形常被用來顯示放大的字,因此向量字庫(矢量字庫)在放大時很平滑。

1)文本字型設(shè)置

文本字型設(shè)置函數(shù)的使用格式如下:

settextstyle(intfont,intdirection,intchar_size);

該函數(shù)用來設(shè)置輸出文本的字體、大小和輸出方向。輸出的文本顏色由setcolor()函數(shù)決定。其中,font表示字體,可使用的字體如表11.8所示。

表11.8參數(shù)font取值(字體表)參數(shù)direction決定文本輸出方向,有兩種選擇,如表11.9所示。

表11.9參數(shù)direction取值參數(shù)char_size表示輸出文本的字體大小,可用的取值如表11.10所示。

表11.10參數(shù)char_size取值2)設(shè)置文本的輸出位置

文本輸出位置函數(shù)的格式如下:

settextjustify(inthoriz,intvert);

該函數(shù)用于設(shè)置文本在水平或垂直方向上的對齊方式,其參數(shù)如表11.11取值所示。

表11.11參數(shù)horiz和vert取值表3)輸出文本

輸出文本字符串有以下兩個函數(shù):

outtext(char*textstring); /*當(dāng)前位置輸出文本*/

outtextxy(intx,inty,char*textstring); /*在(x,y)坐標(biāo)位置 輸出文本*/

outtext()函數(shù)在當(dāng)前位置,按照settextstyle()函數(shù)中direction所指定的方向輸出由指針textstring所指向的字符串。

outtextxy()函數(shù)是在規(guī)定的(x,y)的像素坐標(biāo)位置,按照settextjustify()函數(shù)指定的對齊方式輸出由指針textstring所指向的字符串。

例如:

outtextxy(100,100,"ABC");

該語句執(zhí)行時,TurboC將采用缺省方式顯示,設(shè)置字符“A”的左上角位置為(100,100),字形為8

×

8點陣,比例尺寸為1∶1,即和字庫中的字一樣大。

4)格式輸出

圖形模式下,格式輸出字符串函數(shù)的使用格式如下:

sprintf(char*str,char*format[,argument,…]);

該函數(shù)的使用方法類似于printf(),只不過它是將參數(shù)argument的內(nèi)容按format所指定的格式輸出到指針str所指的字符串中,而不是輸出到屏幕。

sprintf()函數(shù)補充了outtext()和outtextxy()函數(shù)的不足。因為outtext()和outtextxy()函數(shù)只能輸出字符串,而無法輸出變量、表達(dá)式結(jié)果等內(nèi)容,可以先將輸出的變量內(nèi)容通過sprintf()函數(shù)轉(zhuǎn)換成字符串str,再通過outtext()或outtextxy()函數(shù)輸出。例如:

charstr[80];

floatf;

f=10*10*3.14159;

sprintf(str,"半徑為10的圓面積為:%f",f);

outtextxy(100,100,str);

上面的程序段運行后,將在屏幕上從(100,100)坐標(biāo)開始輸出字符串“半徑為10的圓面積為:314.159”。11.3.3動畫設(shè)計

1.圖形窗口的設(shè)置

圖形窗口函數(shù)的使用格式如下:

setviewport(intx1,inty1,intx2,inty2,intclipflag);

該函數(shù)用于在屏幕上建立一個左上角坐標(biāo)為(x1,y1)、右下角為(x2,y2)的新的顯示窗口。其中,參數(shù)clipflag用于指定畫線是否在當(dāng)前窗口邊界被截斷。當(dāng)clipflag!=0時,窗口邊界被截斷;如果clipflag==0,則超出部分仍將繪制出來。新窗口建立后,CP位置移到新窗口的(0,0)坐標(biāo)處。

clearviewport()函數(shù)可用于清除圖形窗口的內(nèi)容,格式如下:

clearviewport();

getviewsettings()函數(shù)用于獲取當(dāng)前窗口的信息,格式如下:

getviewsettings(structviewporttypefar*viewport);

該函數(shù)將取得的窗口信息存儲到結(jié)構(gòu)viewporttype中,該結(jié)構(gòu)定義如下:

structviewporttype

{intleft,top,right,bottom;/*窗口的左、上,右、下對應(yīng)的 坐標(biāo)值*/

intclipflag; /*超出窗口部分的處理方式*/

}

2.用putimage函數(shù)實現(xiàn)動畫的技巧

計算機圖形動畫顯示的是由一系列靜止圖像在不同位置上的重現(xiàn)。計算機圖形動畫技術(shù)一般分為畫擦法和覆蓋刷新法兩大類。畫擦法是先畫T時刻的圖形,然后在T+△T時刻把它擦掉,改畫新時刻的圖形由點、線、圓等基本圖元組成。這種一畫一擦的方法對于實現(xiàn)簡單圖形的動態(tài)顯示是比較有效的。而當(dāng)需要顯示比較復(fù)雜的圖形時,由于畫擦圖形時間相對較長,致使畫面在移動時出現(xiàn)局部閃爍現(xiàn)象,使得動畫視覺效果變差。所以,為提高圖形的動態(tài)顯示效果,在顯示比較復(fù)雜的圖形時多采用覆蓋刷新的方法。在TurboC的圖形函數(shù)中,以下函數(shù)可完成動畫的顯示:

getimage()函數(shù)把屏幕圖形部分拷貝到由buf所指向的內(nèi)存區(qū)域。其使用格式如下:

getimage(intleft,inttop,intright,intbottom,voidfar*buf)

imagesize()函數(shù)用來確定存儲圖形所需的字節(jié)數(shù),所定義的字節(jié)數(shù)根據(jù)實際需要可以定義得多一些。其使用格式如下:

intimagesize(intx1,inty1,intx2,inty2);

putimage()函數(shù)可以把getimage()存儲的圖形重寫在屏幕上。其使用格式如下:

putimage(intx1,inty1,voidfar*bitmap,intop);利用putimage()函數(shù)的參數(shù)op中的COPY_PUT項,在下一個要顯示的位置上于屏幕中重寫圖像,如此重復(fù)、交替地顯示下去,即可達(dá)到覆蓋刷新的目的,從而實現(xiàn)動畫顯示。由于圖形是一次性覆蓋到顯示區(qū)的,并在瞬間完成,其動態(tài)特性十分平滑,動畫效果較好。

參數(shù)op的取值如表11.12所示。

表11.12參數(shù)op取值例11.5的程序就是根據(jù)上述思路而實現(xiàn)的。程序運行時,將在屏幕上出現(xiàn)一個跳動的紅色小球。

例11.5

動畫顯示程序。

#include<stdio.h>

#include<graphics.h>

#include<alloc.h>

#include<conio.h>

voidmain(void)

{

intdriver=DETECT,mode;

intk=0,i,m,m1;

intmaXX,mayy,size;

char*buf;

initgraph(&driver,&mode,"");

maXX=getmaxx();/*獲取當(dāng)前屏幕最大x坐標(biāo)*/

mayy=getmaxy();/*獲取當(dāng)前屏幕最大y坐標(biāo)*/

setfillstyle(SOLID_FILL,LIGHTGRAY); /*設(shè)置填充 樣式*/

bar(1,1,maXX,mayy);

setcolor(RED);

for(i=0;i<=10;i++)

circle(150,150,i); /*畫圓*/

size=imagesize(100,100,250,200); /*存儲區(qū)域到緩沖 區(qū)*/

if(size!=-1)

buf=malloc(size); /*緩沖區(qū)大小(字節(jié)數(shù))*/

if(buf)

{

getimage(100,100,250,200,buf); /*讀緩沖區(qū)數(shù)據(jù)*/

m=120;m1=m;

do{

k=k+1;

if((m1+100)>mayy)

{for(m=m+30;m<maXX;m=m+30)

{m1=m1-20;

putimage(m,m1,buf,COPY_PUT); /*將緩沖內(nèi)容復(fù)制 到指定坐標(biāo)處*/

}

}

if((m+100)>maXX)

{m=m-100;

for(m1=m1+100;m1>=1;m1=m1-10)

{m1=m1-19;

putimage(m,m1,buf,COPY_PUT);

}

for(m=m;m>1;m=m-30)

{m1=m1-17;

putimage(m,m1,buf,COPY_PUT);

}

}

m1=m1+20;

m=m+20;

putimage(m,m1,buf,COPY_PUT);

delay(10000); /*延時*/

}while(k!=1000);

getch();

}

restorecrtmode(); /*恢復(fù)顯示模式*/

}11.3.4使圖形軟件脫離BGI的方法

大家知道,用Turbo編譯的圖形軟件,在運行時,當(dāng)前目錄下必須要有相應(yīng)的BGI文件,如CGA.BGI、EGAVGA.BGI等,這對于應(yīng)用程序是不太方便的。為了解決這個問題,可使用以下方法。

(1)用TurboC提供的BGIOBJ.EXE把*.BGI編譯成目標(biāo)文件*.OBJ。例如:

C>BGIOBJCGA

這樣就產(chǎn)生了一個CGA.OBJ。同樣,將EGAVGA.BGI進(jìn)行編譯,再把這些*.OBJ拷入TC目錄下的LIB子目錄中。

使用時,先編譯一個project文件,把需要的OBJ文件列入project文件中。例如對BGIDEMO.C,相應(yīng)BGIDEMO.PRJ可寫為:

BGIDEMO.C

EGAVGA.OBJ

這樣在集成環(huán)境下調(diào)試BGIDEMO.C時,當(dāng)前目錄下不需要有EGAVGA.BGI,最后生成的EXE文件,運行時也不需要EGAVA.BGI。

(2)使用命令行編譯程序TCC.EXE,只要在編譯時列入相應(yīng)的EGAVGA.BGI,最后生成的EXE文件運行時也不需要EGAVGA.BGI的EXE件。

(3)對于經(jīng)常使用TCC.EXE的用戶,可用TurboC提供的TLIB.EXE將上述*.obj擴充進(jìn)圖形庫GRAPHICS.LIB,方法如下:

C>TLIBGRAPHICS.LIB+EGAVGA.OBJ

這樣,以后在編譯時,只要連接新的GRAPHICS.LIB就可編譯出不需要BGI的圖形軟件。

(4)在程序中initgraph()函數(shù)調(diào)用之前加上一句:registerbgidriver(EGAVGA_driver):該函數(shù)告訴連接程序在連接時把EGAVGA的驅(qū)動程序裝入到用戶的執(zhí)行程序中。11.3.5菜單設(shè)計技術(shù)

菜單在用戶編寫的程序中占據(jù)相當(dāng)一部分內(nèi)容。設(shè)計一個高質(zhì)量的菜單,不僅能使系統(tǒng)美觀,更主要的是能夠使操作者使用方便,避免一些誤操作帶來的嚴(yán)重后果。

1.選擇式菜單的設(shè)計

所謂選擇式菜單,就是在屏幕上出現(xiàn)一個菜單,操作者可根據(jù)菜單上所提供的數(shù)字或字母按相應(yīng)的鍵去執(zhí)行特定的程序,當(dāng)程序執(zhí)行完后又回到主菜單上。

這種菜單編制簡單,操作方便,使用靈活,尤其適用于大型管理程序。如果在自動批處理文件上加入這種菜單后,操作者可根據(jù)菜單上的提示,進(jìn)行相應(yīng)的操作,這樣可以簡化許多步驟,對一般微機用戶來說是比較適合的。

例11.6

選擇式菜單程序。

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

main()

{charch;

inti;

do{ /*system()函數(shù)是調(diào)用相應(yīng)模塊的函數(shù)*/

system("cls");

printf("\n\t1.IntoTurboC");

printf("\n\t2.Intoucdos");

printf("\n\t3.Intowps");

printf("\n\t4.Intohelp");

printf("\n\t0.Quit\n\n");

printf("\tPleaseselect:");

ch=getchar();

switch(ch)

{case'1':system("tc");break; /*調(diào)用tc.exe,可根據(jù)實際 調(diào)用情況修改*/

case'2':system("ucdos");break; /*調(diào)用*/

case'3':system("wps");break; /*調(diào)用wps.exe*/

case'4':system("help");break; /*調(diào)用help.exe*/

case'0':system("cls");exit(1); /*執(zhí)行清屏命令后退出*/

default:printf("\n\t***您沒有選擇!!!***\n");

delay(100000); /*延時*/

}

}while(1);

}

本例中,當(dāng)選擇某一項時,會對應(yīng)執(zhí)行一個程序模塊,在這里沒有具體對應(yīng)的模塊,如果讀者在使用過程中,可以將自己的程序編譯成相應(yīng)的可執(zhí)行文件來調(diào)用,或直接使用函數(shù)調(diào)用(將本例中的system()位置用其他函數(shù)調(diào)用來替換即可)。

2.下拉式菜單的設(shè)計

下拉式菜單是一個窗口菜單,它具有一個主菜單,其中包括幾個選擇項,主菜單的每一項又可以分為下一級菜單,這樣逐級下分,用一個個窗口的形式彈出在屏幕上,一旦操作完畢又可以從屏幕上消失,并恢復(fù)原來的屏幕狀態(tài),因此,在下拉式菜單的設(shè)計中更多地用到getimage()、putimage()函數(shù)。設(shè)計下拉式菜單的關(guān)鍵就是在下級菜單窗口彈出之前,要將被該窗口占用的屏幕區(qū)域保存起來,然后產(chǎn)生這一級菜單窗口,并可用光標(biāo)鍵選擇菜單中各項,用回車鍵來確認(rèn)。如果某選擇項還有下級菜單,則按同樣的方法再產(chǎn)生下一級菜單窗口。有興趣的讀者可以自己試著編寫下拉式菜單,此處不再贅述。11.3.6程序舉例

例11.7

簡單的時鐘程序舉例。

下面是一個簡單的時鐘程序,在屏幕上顯示出一個時鐘表盤和時、分、秒鐘,能隨著時間變化,并在表盤的下部顯示出一個文字的記時器。

#include<graphics.h>

#include<math.h>

#include<dos.h>

#definePI3.1415926

#definex0320 /*定義鐘表中心坐標(biāo)*/

#definey0240

inttable1[8]={-5,-160,5,-160,5,-130,-5,-130};/*定義時鐘刻 度形狀1*/

inttable2[8]={-5,-160,5,-160,2,-130,-2,-130};/*定義時鐘刻 度形狀2*/

voidbeep() /*實現(xiàn)發(fā)聲的函數(shù)*/

{sound(1000);

delay(500);

nosound();

}

voidwritetext() /*寫三維立體字函數(shù)*/

{inti;

char*s="MADEINCHINA!"; /*要顯示的立體字母*/

settextstyle(0,0,2); /*設(shè)置文本屬性:字號和字體*/

setcolor(14); /*定義字體為黃色*/

for(i=0;i<5;i++)outtextxy(210+i,430+i,s);/*在不同位置輸出 同一字符串,產(chǎn)生黃色立體效果*/

setcolor(RED); /*字義為紅色*/

outtextxy(210+i,430+i,s); /*輸出紅色字體*/

}

voiddrawpoint(int*data,intangle,intcolor)

/*畫多邊形的通 用函數(shù)*/

{intusedata[8]; /*存放多邊形4個頂點坐標(biāo),usedata[0]和 usedata[1]為第1個頂點的坐標(biāo)……usedata

[6]和usedata[7]為4個頂點*/

floatsinang,cosang;

inti;

sinang=sin((float)angle/180*PI); /*計算多邊形的坐標(biāo)弧度 變換*/

cosang=cos((float)angle/180*PI);

for(i=0;i<8;i+=2)/*計算多邊形各頂點的位置*/

{usedata[i]=x0+cosang*data[i]-sinang*data[i+1]+0.5;

usedata[i+1]=y0+s

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論