C必看高級編程技術(shù)_第1頁
C必看高級編程技術(shù)_第2頁
C必看高級編程技術(shù)_第3頁
C必看高級編程技術(shù)_第4頁
C必看高級編程技術(shù)_第5頁
已閱讀5頁,還剩90頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C必看高級編程技術(shù)屏幕文本輸出圖形程序設(shè)計硬件驅(qū)動鍵盤鼠標輸入方法編程其它高級編程技術(shù)一、屏幕文本輸出1.1文本方式的控制1.2窗口設(shè)置和文本輸出函數(shù)1.3清屏和光標操作函數(shù)1.4屏幕文本移動與存取函數(shù)1.5狀態(tài)查詢函數(shù)1.1.1文本方式控制函數(shù)文本方式就是顯示文本的模式,它的顯示單位是字符而不是圖形方式下的象素,在屏幕上顯示字符的位置坐標用行和列表示。缺省方式下,每屏為80列25行,TurboC規(guī)定屏的左上角為l行l(wèi)列,屏的右下角為25行80列。TurboC支持的文本顯示方式有5種,它們可以用文本顯示方式設(shè)置函數(shù)來進行設(shè)置。文本顯示方式設(shè)置函數(shù):

voidtextmode(intnewmode)其中newmode的值可分別為:0 40×25黑白顯示 1 40×25彩色顯示 2 80×25黑白顯示 3 80×25彩色顯示 7 80×25單色顯示 -1

上一次的顯示方式1.1.2文本方式顏色控制函數(shù)文本顏色設(shè)置函數(shù)voidtextcolor(intcolor)——控制文本顯示的前景色,即字符顯示的顏色,其參數(shù)color僅能選擇17種顏色,即值為0~16。文本背景顏色設(shè)置函數(shù)voidtextbackground(intcolor)——設(shè)置文本顯示的背景顏色,其參數(shù)color僅能選擇8種顏色,即值為0~7。文本屬性設(shè)置函數(shù)voidtextattr(intattr)——設(shè)置字符顯示的顏色,背景色,字符顯示是否閃爍,顯示屬性參數(shù)attr可用一個字節(jié)即8位來描述。1.1.3字符顯示亮度控制函數(shù)voidhighvideo(void)——用高亮度顯示字符。voidlowvideo(void)——用低亮度顯示字符。voidnormvideo(void)——將設(shè)置通常亮度顯示字符。1.2窗口設(shè)置和文本輸出函數(shù)在文本方式下,沒進行窗口設(shè)置時,即窗口設(shè)置缺省時,認為整個屏幕為顯示窗口,TurboC提供了窗口設(shè)置函數(shù)window(),可由用戶根據(jù)自己的需要來重新設(shè)定顯示窗口。當設(shè)定后,以后的控制臺I/O操作(即文本輸入輸出),就可均在此窗口中進行。1.2.1窗口設(shè)置函數(shù)voidwindow(intx1,inty1,intx2,inty2);其中(x1,y1)為窗口的左上角坐標,(x2,yz)為窗口的右下角坐標,這些坐標是以整個屏幕為參考坐標系。利用窗口函數(shù)可以在屏幕上定義多個不同窗口,以顯示不同的信息。1.2.2控制臺文本輸出函數(shù)printf(),putc(),puts(),putchar()和輸出函數(shù)以整個屏幕為窗口的,它們不受由window設(shè)置的窗口限制,也無法用函數(shù)控制它們輸出的位置。TurboC提供了三個文本輸出函數(shù),intcprintf(char*format,...);intcputs(char*str);intputch(intch);它們受窗口的控制,窗口內(nèi)顯示光標的位置,就是它開始輸出的位置。1.3.1清屏函數(shù)voidclrscr(void);清除窗口中的文本,并將光標移到當前窗口的左上角,即(1,1)處。

voidclreol(void);除當前窗口中從光標位置開始到本行結(jié)尾的所有字符,但不改變光標原來的位置。

voiddelline(void);刪除一行字符,該行是光標所在行。1.3.2光標操作函數(shù)voidgotoxy(intx,inty);把光標移到窗口內(nèi)的(x,y)處,x,y坐標是相對窗口而言。它多和cprintf函數(shù)配合,以指定輸出開始位置。1.4.1屏幕文本移動函數(shù)voidmovetext(intx1,inty1,intx2,inty2,intx3,inty3);該函數(shù)將把屏幕上左上角為(xl,y1),右下角為(x2,y2)的矩形內(nèi)文本拷貝到左上角為(x3,y3)的一個新矩形區(qū)內(nèi)。這里x,y坐標是以整個屏幕為窗口坐標系,即屏幕左上角為(1,1)。該函數(shù)與開設(shè)的窗口無關(guān),且原矩形區(qū)文本不變。1.4.2屏幕文本存取函數(shù)1、存文本函數(shù)——voidgettext(intxl,inty1,intx2,inty2,void*buffer);把左上角為(xl,y1),右下角為(x2,y2)的矩形區(qū)內(nèi)的文本存到由指針buffer指向的一個內(nèi)存緩沖區(qū)內(nèi)。2、取文本函數(shù)——voidputtext(intx1,inty1,intx2,inty2,void*buffer);把由buffer指針指向的緩沖區(qū)內(nèi)所存文本復(fù)制到屏幕上一矩形區(qū)內(nèi),該矩形區(qū)左上角為(x1,y1),右下角為(x2,y2)。1.5狀態(tài)查詢函數(shù)voidgettextinfo(structtext_info*f);這里的text_info是在conio.h頭文件中定義的一個結(jié)構(gòu);顯示當前屏幕的顯示方式,當前窗口的坐標、當前光標的位置,文本的顯示屬性等。第二章圖形程序設(shè)計TurboC為用戶提供了一個功能很強的畫圖軟件庫,它又稱為Borland圖形接口(BGI),它包括圖形庫文件(graphics.lib),圖形頭文件(graphics.h)和許多圖形顯示器(圖形終端)的驅(qū)動程序(如CGA.BGI、EGAVGA.BGI等)。及一些字符集的字體驅(qū)動程序(如goth.chr黑體字符集等)。編寫圖形程序時用到的一些圖形庫函數(shù)均在graphics.lib中,執(zhí)行這些函數(shù)時,所需的有關(guān)信息(如宏定義等)則包含在graphics.h頭文件中。2.1.1圖形顯示的坐標顯示器的屏幕如同一張坐標紙,在其上顯示圖形時,圖形上任一點的位置均有確定的坐標,即可用x,y坐標值來表示。2.1.2象素顯示器顯示的圖形均由一些圓點組成(其亮度、顏色不同),這些點稱為象素(或稱象點),它們是組成圖形的最小單位。象素的大小可以通過設(shè)置不同的顯示方式來改變。象素在屏幕上的位置則可由其所在的x,y坐標來決定。2.2圖形顯示器與適配器計算機中要顯示的字符和圖形均以數(shù)字形式存儲在存儲器中,而顯示器接收的應(yīng)是模擬信號。常用的顯示器有三條模擬紅綠蘭顏色的模擬信號輸入線,每條輸入線的電壓決定了顏色的亮度,只要能產(chǎn)生出可區(qū)分的電壓來,它們不同的組合,便可使顯示器顯示出不同的顏色來。插在PC微機插槽中的圖形卡(即適配器),其作用就是將要顯示的字符和圖形以數(shù)字形式存儲在卡上的視頻存儲器VRAM中,再將其變成視頻模擬信號送往相應(yīng)適配的顯示器進行顯示,也即適配器在計算機主機和顯示器之間起到了信息轉(zhuǎn)換和視頻發(fā)送作用。由于計算機配有的顯示器種類不同,因而適配器種類不同常用的幾種適配器1.單色顯示適配器(MDA);僅顯示一種顏色,僅支持80×25行的字符顯示。2.彩色圖形適配器(CGA);這是PC/XT等微機配用的顯示器圖形卡,它可以產(chǎn)生單色或彩色字符和圖形。3.增強型圖形適配器〔EGA);除支持CGA的四種顯示模式外,還增加了分辨率為640×200的16色顯示方式,

(EGAHI),也可顯示16色。4.視頻圖形陣列適配器(VGA);它是目前流行的PC微機顯示標準,它支持CGA,EGA的所有顯示方式,但自己還有640×480的高分辨顯示方式(VGAHI)、640×350的中分辨顯示方式(VGAMED)和640×200的低分辨顯示方式(VGALO),它們均可有16種顯示顏色可供選擇。常用的幾種適配器5.TVGA;它是目前市面上最流行的PC486,586微機配的顯示器標準,在圖形方式下,它可有640×400,640×480,800×600,1024×768及768×1024等分辨率,可選顏色達256種,在文本方式下,可支持25、30、43、60行,132列的字符顯示。它也兼容CGA、EGA、VGA的顯示方式,由于TurboC早于該產(chǎn)品出現(xiàn),因而上述增強了的顯示方式均不支持,但對于高級編程者,可通過對TVGA各專用寄存器直接編程來實現(xiàn)這些功能。常用的幾種適配器6.PVGA;它是paradiseVGA的縮寫,它由WesternDigital公司生產(chǎn),有的叫SVGA(香港Surperking公司生產(chǎn)的386微機上使用)。還有稱為EVGA(ExtendedVGA),它們和PVGA在軟硬件上均是兼容的。PVGA完全兼容CGA、EGA、VGA的所有工作方式,它還有自己一些特有的工作模式,與TVGA類似。7.XGA;XGA是IBM公司新推出的一種增強性圖形適配器,它是VGA的換代產(chǎn)品,具有更高的分辨率和性能,它有和CGA,EGA,VGA全兼容的工作方式,但顯示速度卻比VGA快一倍。常用的幾種適配器8.CVGA;這是國內(nèi)研制的帶有顯示漢字功能的VGA圖形適配器,它帶有漢字字庫,該適配器提供了和CGA、EGA、VGA全兼容的工作方式,還提供了在文本工作方式下的高分辨圖形顯示功能。在它的ROMBIOS中提供了INT10H的功能號為30H-38H的功能調(diào)用,因而提供了方便的漢字處理功能。2.3顯示器工作方式文本方式或稱字符顯示方式圖形顯示方式它們的主要差別是顯示存儲器(VRAM)中存的信息不同。字符方式時,VRAM存放要顯示字符的ASCII碼,用它作為地址,取出字符發(fā)生器ROM(固定存儲器)中存放的相應(yīng)字符的圖象(又稱字模),變成視頻信號在顯示器屏上進行顯示。圖形方式時,則要顯示的圖形的圖象直接存在VRAM中,VRAM中某地址單元存放的數(shù)就表示了相應(yīng)屏幕上某行和列上的象素及顏色。TurboC支持的適配器和圖形模式1.MCGA(多色圖形陣列);它和VGA是PS/2系列微機的主要適配器,MCGA功能上同CGA相似,它和CGA是部分兼容的,但有些功能又和VGA類似,可有640×480的二色模式。2.IBM8514;該適配器可插入PS/2微機中,它有較強的圖形功能,最高分辨率可達1024×768,可有256種顏色。3.HERC;大力神公司生產(chǎn)的一種單色適配器,是PC系列微機早期的第三種顯示標準(其它兩種MDA和CGA),它采用720×348高分辨單色顯示模式。4.EGAMONO;EGA單色適配器,它只有一種640×350單色顯示模式。2.5圖形系統(tǒng)的初始化即要用什么類型的圖形顯示適配器的驅(qū)動程序,采用什么模式的圖形方式(也就是相應(yīng)程序的入口地址),適配器驅(qū)動程序的尋找路徑名。注意:所用系統(tǒng)的顯示適配器一定要支持所選用的顯示模式,否則將出錯。2.5.1圖形系統(tǒng)的初始化函數(shù)voidfarinitgraph(intfar*driver,intfar*mode,charfar*path_for_driver);2.5.2圖形系統(tǒng)檢測函數(shù)voidfardetectgraph(intfar*graphdriver,intfar*graphmode);它完成對適配器的檢查并得到顯示器類型號和相應(yīng)的最高分辨率模式,若所設(shè)適配器不是規(guī)定的那些類型,則返回-2,表示適配器不存在。2.5.3清屏函數(shù)voidfarcleardevice(void);該函數(shù)作用范圍為整個屏幕。voidfarclearviewport(void);如果用函數(shù)setviewport定義一個圖視窗口,則可用清除圖視口函數(shù),它僅清除圖視口區(qū)域內(nèi)的內(nèi)容。2.5.3恢復(fù)顯示方式函數(shù)當畫圖程序結(jié)束,回到文本方式時,要關(guān)閉圖形系統(tǒng),回到文本方式,用voidfarclosegraph(void);為了不關(guān)閉圖形系統(tǒng),使相應(yīng)適配器的驅(qū)動程序和字符集(字庫)仍駐留在內(nèi)存,但又回到原來所設(shè)置的模式,則可用恢復(fù)工作模式函數(shù)voidfarrestorecrtmode(void);它也同時進行清屏操作。該函數(shù)常和另一設(shè)置圖形工作模式函數(shù)setgraphmode交互使用,使得顯示器工作方式在圖形和文本方式之間來回切換。2.6基本圖形函數(shù)圖形由點、線、面組成,TurboC提供了一些函數(shù),以完成這些操作。2.6.1畫點函數(shù)voidfarputpixel(intx,inty,intcolor);它表示在指定的x,y位置畫一點,點的顯示顏色由設(shè)置的color值決定,關(guān)于顏色的設(shè)置,將在設(shè)置顏色函數(shù)中介紹。該函數(shù)的相對應(yīng)函數(shù)是取象素值函數(shù)intfargetpixel(intx,inty);得到在(x,y)點位置上的象素的顏色值。2.6.2有關(guān)畫圖坐標位置的函數(shù)①移動畫筆到指定的(x,y)位置,移動過程不畫:voidfarmoveto(intx,inty);②畫筆從現(xiàn)行位置(x,y)處移到一位置增量處(x+dx,y+dx),移動過程不畫:voidfarmoverel(intdx,intdy);③得到當前畫筆所在位置intfargetx(void);得到當前畫筆的x位置intfargety(void);得到當前畫筆的y位置2.6.3畫線函數(shù)①兩點之間畫線函數(shù)。voidfarline(intx0,inty0,intx1,inty1);從(x0,y0)點到(x1,y1)點畫一直線。②從現(xiàn)行畫筆位置到某點畫線函數(shù)。voidfarlineto(intx,inty);將從現(xiàn)行畫筆位置到(x,y)點畫一直線。③從現(xiàn)行畫筆位置到一增量位置畫線函數(shù)voidfarlinerel(intdx,intdy);將從現(xiàn)行畫筆位置(x,y)到位置增量處(x+dx,y+dy)畫一直線。畫線程序舉例#include<graphics.h>main(){ intgraphdriver=VGA; intgraphmode=VGAHI; initgraph(&graphdriver,&graphmode,""); cleardevice(); moveto(100,20); lineto(100,80); moveto(200,20); lineto(100,80); line(100,90,200,90); linerel(0,20); moverel(-100,0); linerel(30,20); getch(); closegraph();}2.6.4畫矩形和條形圖函數(shù)①畫矩形函數(shù)voidfarrectangle(intxl,inty1,intx2,inty2);該函數(shù)將以(x1,y1)為左上角,(x2,y2)為右下角畫一矩形框。②畫條形圖函數(shù)voidbar(intx1,inty1,intx2,inty2);該函數(shù)將以(xl,y1)為左上角,(x2,y2)為右下角畫一實形條狀圖,沒有邊框,圖的顏色和填充模式可以設(shè)定。程序舉例編寫程序,由rectangle函數(shù)以(100,20)為左上角,(200,50)為右下角畫一矩形,接著由bar函數(shù)以(100,80)為左上角,(150,180)為右下角畫一實形條狀圖,用缺省顏色(白色)填充。#include<graphics.h>main(){intgraphdriver=DETECT;intgraphmode,x;initgraph(&graphdriver,&graphmode,””);cleardevice();rectangle(100,20,200,50);bar(100,80,150,180)5getch();closegraph();}2.6.5畫橢圓、圓和扇形圖函數(shù)①畫橢圓函數(shù)voidellipse(intx,inty,intstangle,intendangel,intxradius,intyradius);該函數(shù)將以(x,y)為中心,以xradius和yradius為x軸和y軸半徑,從起始角stangle開始到endangle角結(jié)束,畫一橢圓線。當stangle=0,endangle=360時,則畫出的是一個完整的橢圓,否則畫出的將是橢圓弧。②畫圓函數(shù)voidfarcircle(intx,inty,intradius);該函數(shù)將以(x,y)為圓心,radius為半徑畫個圓。③畫圓弧函數(shù)voidfararc(intx,inty,intstangle,intendangle,intradius);該函數(shù)將以(x,y)為圓心,radius為半徑,從stangle為起始角開始,到endangle為結(jié)束角畫一圓弧。④畫扇形圖函數(shù)voidfarpieslice(intx,inty,intstangle,intendangle,intradius);該函數(shù)將以(x,y)為圓心,radius為半徑,從stangle為起始角,endangle為結(jié)束角,畫一扇形圖,扇形圖的填充模式和填充顏色可以事先設(shè)定,否則以缺省模式進行。畫三維立體直方圖函數(shù)voidfarbar3d(intx1,inty1,intx2,inty2,intdepth,inttopflag);該函數(shù)參數(shù)名定義如圖2.14所示。當topflag非0時,畫出三維頂,否則將不畫出三維頂,depth決定了三維直方圖的長度。與填充函數(shù)有關(guān)的作圖函數(shù)①畫三維立體直方圖函數(shù)voidfarbar3d(intx1,inty1,intx2,inty2,intdepth,inttopflag);②畫橢圓扇形函數(shù)

viodfarsector(intx,inty,intstangle,intendang1e,intxradius,intyradius);該函數(shù)將以(x,y)為圓心,以xradius和yradius為x軸和y軸半徑,從起始角stang1e開始到endang1e角結(jié)束,畫一橢圓扇形圖,并按設(shè)置的填充模式和顏色填充。當stang1e為0,endangle為360時,則畫出一完整的橢圓圖。

③畫橢圓圖函數(shù)

voidfarfillellipse(intx,inty,intxradius,intyradius);”

該函數(shù)將以(x,y)為圓心,以xradius和yradius為x軸和y軸半徑,畫一橢圓圖,并以設(shè)定或缺省模式和顏色填充。④畫多邊形圖函數(shù)

voidfarfillpoly(intnumpoints,intfar*polypoints)

該函數(shù)將畫出一個頂點數(shù)為numpoints,各頂點坐標由polypoints給出的多邊形,也即邊數(shù)為polypoints-1,當為一封閉圖形時,numpohts應(yīng)為多邊形的頂點數(shù)加1,并且第一個頂點坐標應(yīng)和最后一個頂點的坐標相同。2.7顏色控制函數(shù)象素的顯示顏色,或者說畫線、填充面的顏色都可以用一些函數(shù)來設(shè)置,否則將采用缺省的值。顯示點、線、面的顏色,稱為前景色,而襯托它們的背景,稱為背景色。按照CGA、EGA、VGA圖形適配器的硬件結(jié)構(gòu),顏色可以通過對其內(nèi)部相應(yīng)的寄存器進行編程來改變,但不編程時,則取缺省值。顏色的設(shè)置,一般用所謂調(diào)色板來進行描述,它實際上對應(yīng)一些硬件的寄存器。調(diào)色板從C語言的角度看,調(diào)色板實際上就是一張顏色索引表,對CGA顯示器,在中分辨顯示方式下,有4種顯示模式,每一種模式對應(yīng)有一個調(diào)色板,可用調(diào)色板號區(qū)別。模式 調(diào)色板號 顏色值 0 1 23 CGAC0 0 背景色 綠 紅 黃 CGAC1 1 背景色 青 洋紅 白 CGAC2 2 背景色 淡綠 淡紅 棕 CGAC3 3 背景色 淡青 淡洋紅淡灰2.7.1顏色設(shè)置函數(shù)①前景顏色設(shè)置函數(shù):

voidfarsetcolor(intcolor);

該函數(shù)將使得前景以所選color顏色進行顯示,對CGA,當為中分辨模式時只能選0,1,2,3。②選擇背景顏色的函數(shù):

voidfarsetbkcolor(intcolor)該函數(shù)將使得背景色按所選16種中的一種color顏色進行顯示。2.8.1設(shè)定線型函數(shù)TurboC也提供了改變線的寬度、類型的函數(shù),其線的寬度當不設(shè)定時,取缺省值,即一個象素寬,當設(shè)定為3時,可取三個象素寬。當線的形狀不設(shè)定時,取缺省值,即實線。設(shè)定時,可有5種選擇,它們可用設(shè)定線型函數(shù)來進行設(shè)置:voidfarsetlinestyle(intlinestyle,unsignedupattern,intthickness);其中1inestyle為線型參數(shù);thickness為線的寬度參數(shù)。2.9.1填色函數(shù)voidfarsetfilestyle(intpattern,intcolor);該函數(shù)將用設(shè)定的color顏色和pattern圖模式對后面畫出的輪廓圖進行填充,這些圖輪廓是由待定函數(shù)畫出的。color實際上就是調(diào)色板寄存器索引號,pattern表示填充模式,2.9.2用戶自定義填充函數(shù)voidfarsetfillpattern(char*upattefn,intcolor);該函數(shù)設(shè)置用戶自定義可填充模式,以color指出的顏色對封閉圖形進行填充。color實際上就是調(diào)色板寄存器號,也可用顏色名代替。參數(shù)upattern是一個指向8個字節(jié)存儲區(qū)的指針,這8個字節(jié)表示了一個8×8象素點陣組成的填充圖模,它是由用戶自定義的,它將用來對封閉圖形填充。2.9.3得到填充模式和顏色的函數(shù)voidfarfillsettings(structfillsettingstypefar*fillinfo);它將得到當前的填充模式和顏色,這些信息存在結(jié)構(gòu)指針變量fillinfo指出的結(jié)構(gòu)中。2.9.4與填充函數(shù)有關(guān)的作圖函數(shù)畫條形圖函數(shù)bar和畫扇形函數(shù)pieslise,它們需要用setfillstyle函數(shù)設(shè)置填充模式和顏色,否則按缺省方式。其它:①畫三維立體直方圖函數(shù)voidfarbar3d(intx1,inty1,intx2,inty2,intdepth,inttopflag);該函數(shù)參數(shù)名定義:topflag非0時,畫出三維頂,否則將不畫出三維頂,depth決定了三維直方圖的長度。與填充函數(shù)有關(guān)的作圖函數(shù)

②畫橢圓扇形函數(shù)

viodfarsector(intx,inty,intstangle,intendang1e,intxradius,intyradius);該函數(shù)將以(x,y)為圓心,以xradius和yradius為x軸和y軸半徑,從起始角stang1e開始到endang1e角結(jié)束,畫一橢圓扇形圖,并按設(shè)置的填充模式和顏色填充。當stang1e為0,endangle為360時,則畫出一完整的橢圓圖。與填充函數(shù)有關(guān)的作圖函數(shù)③畫橢圓圖函數(shù)

voidfarfillellipse(intx,inty,intxradius,intyradius);”

該函數(shù)將以(x,y)為圓心,以xradius和yradius為x軸和y軸半徑,畫一橢圓圖,并以設(shè)定或缺省模式和顏色填充。④畫多邊形圖函數(shù)

voidfarfillpoly(intnumpoints,intfar*polypoints)

該函數(shù)將畫出一個頂點數(shù)為numpoints,各頂點坐標由polypoints給出的多邊形,也即邊數(shù)為polypoints-1,當為一封閉圖形時,numpohts應(yīng)為多邊形的頂點數(shù)加1,并且第一個頂點坐標應(yīng)和最后一個頂點的坐標相同。2.9.5可對任意封閉圖形填充的函數(shù)setfillstyle函數(shù),只能對由上述特定函數(shù)產(chǎn)生的圖形進行顏色填充,對任意封閉圖形均可進行填充的是函數(shù):

voidfarfloodfill(intx,inty,intborder);

該函數(shù)將對一封閉圖形進行填充,其顏色和模式將由設(shè)定的或缺省的圖模與顏色決定。其中參數(shù)(x,y)為封閉圖形中的任一點,border是封閉圖形的邊框顏色。編程時該函數(shù)位于畫圖形的函數(shù)之后,即要填充該圖形。2.10屏幕操作函數(shù)清屏函數(shù)cleardevice()存屏幕圖象到內(nèi)存區(qū):voidfargetimage(intx1,inty1,intx2,inty2,voidfar*bitmap);將把屏幕左上角為(x1,y1),右下角為(x2,y2)矩形區(qū)內(nèi)的圖象保存到指針bitmap指向的內(nèi)存區(qū)去。為了能開辟一個內(nèi)存緩沖區(qū),則必須首先要知道所存圖象占多少字節(jié),可用測定圖象所占字節(jié)數(shù)的函數(shù):unsignedfarimagesize(intx1,inty1,intx2,inty2);該函數(shù)將得到屏幕上左上角為(x1,y1),右下角為(x2,y2)矩形區(qū)內(nèi)圖象所占的字節(jié)數(shù)。將所存圖象顯示函數(shù)voidfarputimage(intx1,inty1,voidfar*bitmap,intop);該函數(shù)將把指針bitmap指向的內(nèi)存區(qū)中所裝圖象,與屏上現(xiàn)有左上角為(xl,y1)的矩形區(qū)內(nèi)圖象進行op規(guī)定的操作后顯示在屏上。2.10.2設(shè)置顯示頁函數(shù)存儲在顯示適配器上的圖象存儲器VRAM中的一滿屏圖象信息稱為一頁。每個頁一般為64K字節(jié),VRAM可以存儲要顯示的圖象幾個頁(視VRAM容量而定,最大可達8頁)因存儲圖象的頁顯示時,一次只能顯示一頁,因此必須設(shè)定某頁為當前顯示的頁(又稱可視頁),缺省時定為0頁在由用戶編輯圖形的頁稱為當前編輯頁(又稱激活的頁)缺省時定為0頁設(shè)置激活頁和顯示頁的函數(shù)如下:

voidfarsetactivepage(intpagenum);voidfarsetvisualpage(intpagenum);2.11.1圖視口設(shè)置函數(shù)

voidfarsetviewport(intxl,inty1,intx2,inty2,clipflag);

其中(x1,y1)為圖視口的左上角坐標,(x2,y2)為所設(shè)置的圖視口右下角坐標,它們都是以原屏幕物理坐標為參考的。clipflag參數(shù)若為非0,則所畫圖形超出圖視口的部分將被切除而不顯示出來。若clipflag為0,則超出圖視口的圖形部分仍將顯示出來。2.11.2圖視口清除與取信息函數(shù)1.圖視口清除函數(shù)voidfarclearviewport(void)該函數(shù)將清除圖視口內(nèi)的圖象。2.取圖視口信息函數(shù)voidfargetviewsettings(structviewporttypefar*viewport);

該函數(shù)將取得當前設(shè)置的圖視口的信息,它存于由結(jié)構(gòu)viewporttype定義的結(jié)構(gòu)變量viewport中2.12圖形方式下的文本輸出函數(shù)可以用printf(),puts(),putchar()函數(shù)輸出文本,但只能在屏上用白色顯示,無法選擇輸出的顏色。

圖形方式下的文本輸出函數(shù)1.當前位置文本輸出函數(shù)

voidfarouttex(charfar*textstring);該函數(shù)將在當前位置在屏上輸出由字符串指針textsering指出的文本字符串。2.定位文本輸出函數(shù)

voidfarouttextxy(intx,inty,charfar*textstring);該函數(shù)將在指定的(x,y)位置輸出字符串。3.文本輸出位置函數(shù)voidfarsettextjustify(inthoriz,intvert);該函數(shù)將確定輸出字位串時,如何定位(x,y)。3.1.1I/O接口的尋址方式PC機中的80x86CPU采用I/O獨立編址方式,即I/O接口地址和存儲器地址分別獨立編址。采用專門的I/O指令來對接口地址進行操作。存儲器地址和I/O接口地址可以重疊。由于兩者需采用不同的指令進行讀寫操作,不會由于地址相同而混淆。接口輸入函數(shù)intinport(intportid);intinportb(intportid);inport函數(shù)從指定的接口地址portid中讀入一個字(即l6位二進制數(shù)),而inportb則從指定的接口地址pontid中讀入一個字節(jié)(8位二進制數(shù))。如I/O接口的尋址方式中所述,當執(zhí)行這兩個函數(shù)后,它們均返回各自從接口地址所對應(yīng)的輸入設(shè)備中得到的16位或8位二進制數(shù)。由于,PC機數(shù)據(jù)總線是8位的,故inporb()比較常用,而inport(portid)實際上執(zhí)行了兩次inportb(),即inportb(portid)和inportb(portid+1)。例如:unsignedcharp;p=inportb(0x2F0);它將從2F0H接口地址中得到一個字節(jié)的數(shù),并賦給無符號變量p。unsignedintc;c=inport(0x2F0);它將從2F0H和2F1H接口地址中分別得到一個字節(jié)的數(shù),然后組合成一個16位的二進制數(shù)賦給變量c,其中2F0H接口中得到的數(shù)為低字節(jié),2F1H接口中得到的數(shù)為高字節(jié)。接口輸出函數(shù)intoutport(intportid,intvalue);intoutportb(intportidunsignedcharvalue);outport函數(shù)把一個16位二進制數(shù)value發(fā)送到口地址為portid的接口中去。對于PC機,實際上是將低字節(jié)數(shù)送到口地址為portid接口中去,將高字節(jié)送到口地址為portid+1的接口中去。outportb函數(shù)是將一個字節(jié)的數(shù)value送到口地址為portid的接口中去。例如:outportb(0x2F0,385);它將把整數(shù)385送往口地址為2F0H的接口中去。outport(0x2F2,4095);它將把4095送到口地址為2F2H和2F3H的接口中去,(化成二進制數(shù)的低8位送2F2H,高8位送2F3H)。3.2中斷服務(wù)程序的編寫中斷與中斷源:中斷,中斷源是指CPU在正常運行程序時,由于程序的預(yù)先安排或內(nèi)外部事件,引起CPU中斷正在運行的程序,而轉(zhuǎn)到為預(yù)先安排的事件或內(nèi)外部事件服務(wù)的程序中去,這些引起程序中斷的事件稱為中斷源。預(yù)先安排的事件,是指PC機的中斷指令,執(zhí)行到此,立即轉(zhuǎn)相應(yīng)的服務(wù)程序去執(zhí)行。內(nèi)部事件,是指系統(tǒng)板上出現(xiàn)的一些事件信號,中斷指令也可看作內(nèi)部事件。外部事件,是指某些接口設(shè)備所發(fā)出的請求中斷程序執(zhí)行的信號,這些信號稱為中斷請求信號。中斷中斷返回:中斷服務(wù)程序執(zhí)行完,返回原來執(zhí)行程序的中斷處(稱為斷點)繼續(xù)往下執(zhí)行,稱為中斷返回。中斷的優(yōu)先級:有時中斷請求信號(即中斷源)可能有好幾個,因此CPU響應(yīng)這些中斷就得有先后次序,這稱為中斷的優(yōu)先級。中斷的屏蔽:CPU首先響應(yīng)優(yōu)先級高的中斷,優(yōu)先級低的中斷,暫不響應(yīng),稱為掛起。有些中斷源產(chǎn)生的中斷,可以用編程的辦法使CPU不予理睬,這叫中斷的屏蔽。中斷CPU響應(yīng)中斷,轉(zhuǎn)去執(zhí)行中斷服務(wù)程序前,需將被中斷程序的現(xiàn)場信息保存下來,以便執(zhí)行完中斷服務(wù)程序后,接著從被中斷程序的斷點處繼續(xù)往下執(zhí)行?,F(xiàn)場信息是指程序計數(shù)器的內(nèi)容、CPU的狀態(tài)信息、執(zhí)行指令后的結(jié)果特征和一些通用寄存器的內(nèi)容,有些信息的保存和程序計數(shù)器的內(nèi)容等由機器硬件預(yù)先安排完成,稱為中斷處理的隱操作。有些信息保存是在中斷服務(wù)程序中預(yù)先安排。CPU響應(yīng)中斷時,由中斷源提供地址信息,引導(dǎo)程序轉(zhuǎn)移到中斷服務(wù)程序中去執(zhí)行。這個地址信息稱為中斷向量,它一般是和中斷源相對應(yīng)的,PC機采用類型號來標識中斷源。執(zhí)行下述指令時,將產(chǎn)生或者可能產(chǎn)生中斷,這些中斷稱為軟中斷。執(zhí)行下述指令時,將產(chǎn)生或者可能產(chǎn)生中斷,這些中斷稱為軟中斷。1.DIV(除)或IDIV(整除)指令當執(zhí)行這些除法指令時,若除數(shù)為0或商溢出,則產(chǎn)生中斷,這類中斷稱為0型中斷。2.INT指令當執(zhí)行中斷指令I(lǐng)NTn時,則產(chǎn)生n型中斷。TurboC用庫函數(shù)geninterrupt()geninterrupt宏為由intr_num給定的中斷觸發(fā)一個軟件陷井。3.INTO指令若指令序列執(zhí)行過程中,上條指令執(zhí)行的結(jié)果,使溢出標志位O=1,接著若執(zhí)行的是INTO指令,則引起內(nèi)部中斷,稱為4型中斷,若溢出標志位O=0,該指令將不起作用。4.單步執(zhí)行當標志位T=1時,每執(zhí)行一條指令,則引起一次中斷,使得指令的執(zhí)行,成為單步執(zhí)行方式,這種方式用于程序的調(diào)試,如DEBUG中的跟蹤命令T,就是將標志位T置1,進而去執(zhí)行一個單步中斷服務(wù)程序,單步執(zhí)行為1型中斷。CPU有兩條中斷請求線:非屏蔽中斷NMI和可屏蔽中斷INTR線,當這兩條線上收到中斷請求信號而引起的中斷,稱為硬中斷。1.非屏蔽中斷當NMI線上出現(xiàn)一個由低上跳的高電平中斷請求信號后(持續(xù)時間需大于兩個時鐘周期),不管標志寄存器I位的狀態(tài)如何,當前指令執(zhí)行完后,80x86CPU馬上轉(zhuǎn)入中斷處理。此種類型的中斷有三種來源:系統(tǒng)板上隨機存儲器RAM產(chǎn)生奇偶錯,協(xié)處理器插座上來的中斷請求(僅XT機),I/O通道檢查出錯等,這種中斷是在PC機的系統(tǒng)板上,用戶一般是不能用的。2.可屏蔽中斷當INTR線上出現(xiàn)高電平的中斷請求信號時(必須保持到當前執(zhí)行的指令結(jié)束為止),80x86是否響應(yīng)該中斷,取決于標志寄存器I位的狀態(tài),若I=1,則CPU處于開中斷,因而可以響應(yīng),若I=o,則CPU不響應(yīng)。I的狀態(tài),可以由匯編設(shè)置,若執(zhí)行開中斷指令STI,則I位被置1,TurboC有此功能的是庫函數(shù)enable(),若執(zhí)行關(guān)中斷指令CLI,則I位被清零。TurboC有此功能的庫函數(shù)是disable()。disable宏屏蔽中斷,只有從外設(shè)來的不可屏蔽中斷(NMI),仍然是允許的。enable宏開放中斷,可以允許任何設(shè)備中斷發(fā)生。鼠標及漢字庫內(nèi)容鼠標驅(qū)動程序主要功能鼠標驅(qū)動程序主要功能鼠標功能調(diào)用方法用TC通過INT33H中斷來編制基本函數(shù),有三種常用方法:嵌入?yún)R編程序,如:ASMCLI清中斷利用全程變量賦予寄存器值,然后通過函數(shù)geninterrupt()調(diào)用中斷實現(xiàn)利用聯(lián)合類型REGS,SREGS通過函數(shù)int86(),int86x()調(diào)用中斷,原型在dos.h鼠標的初始化InitMouse(){unionREGSregs; regs.x.ax=0; int86(0x33,®s,®s); if(regs.x.ax==0) returnfalse; elsereturntrue;}鼠標光標的隱藏HideCur(){unionREGSregs; if(visual){ regs.x.ax=2; int86(0x33,®s,®s); visual=false;}}鼠標光標的顯示ShowCur(){unionREGSregs; if(!visual){ regs.x.ax=1; int86(0x33,®s,®s); visual=true;}}鼠標光標的顯示與隱藏在鼠標驅(qū)動程序中,鼠標的顯示狀態(tài)用0值表示,隱藏用負值表示,每調(diào)用一次顯示功能則該值加一,每調(diào)用一次隱藏功能,則該值減一。這樣,在多次調(diào)用了驅(qū)動程序的隱藏鼠標光標功能后,再調(diào)用顯示鼠標光標功能時,將不能正常顯示鼠標光標。需要加入一個visual布爾型變量,來取代驅(qū)動程序中的數(shù)值。讀取鼠標的狀態(tài)Status(){ unionREGSregs; regs.x.ax=3; int86(0x33,®s,®s); x=regs.x.cx;y=regs.x.dx; status=regs.x.bx;}讀取鼠標的狀態(tài)其中X,Y為光標位置status&1左鍵狀態(tài),1為按下,0為未按status&2右鍵狀態(tài),1為按下,0為未按status&4中鍵狀態(tài),1為按下,0為未按要注意循環(huán)檢測時的抖動現(xiàn)象,可增加一些空循環(huán)或延時來清除剩余的按鍵信號。設(shè)置光標位置voidMoveMouse(intx,inty){ REGSregs; regs.x.ax=4; regs.x.cx=x; regs.x.dx=y; int86(0x33,®s,®s);}設(shè)置鼠標光標形狀設(shè)置鼠標光標需要三個方面信息:鼠標的外邊界:8*8點陣,16個整數(shù)鼠標的內(nèi)部形狀:8*8點陣,16個整數(shù)以及鼠標的熱點的相對坐標:intx,y其中外邊界和內(nèi)邊界連續(xù)存放,為長度為32的整型數(shù)組intmarks[32]設(shè)置鼠標光標形狀SetCurs(unsignedmasks[32],x,y){ unionREGSregs; structSREGSsregs; regs.x.ax=9; regs.x.bx=x;regs.x.cx=y;/*hotspot*/ regs.x.dx=(unsigned)masks; segread(&sregs);int86(0x33,®s,®s);}手的光標數(shù)據(jù)

溫馨提示

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

評論

0/150

提交評論