![計算機圖形學(xué)試驗參考指導(dǎo)書_第1頁](http://file4.renrendoc.com/view4/M01/14/04/wKhkGGZgmVWAUN6OAABcJK1Edkc533.jpg)
![計算機圖形學(xué)試驗參考指導(dǎo)書_第2頁](http://file4.renrendoc.com/view4/M01/14/04/wKhkGGZgmVWAUN6OAABcJK1Edkc5332.jpg)
![計算機圖形學(xué)試驗參考指導(dǎo)書_第3頁](http://file4.renrendoc.com/view4/M01/14/04/wKhkGGZgmVWAUN6OAABcJK1Edkc5333.jpg)
![計算機圖形學(xué)試驗參考指導(dǎo)書_第4頁](http://file4.renrendoc.com/view4/M01/14/04/wKhkGGZgmVWAUN6OAABcJK1Edkc5334.jpg)
![計算機圖形學(xué)試驗參考指導(dǎo)書_第5頁](http://file4.renrendoc.com/view4/M01/14/04/wKhkGGZgmVWAUN6OAABcJK1Edkc5335.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
《計算機圖形學(xué)》實驗指導(dǎo)書郗潤平編制西北工業(yè)大學(xué)計算機學(xué)院二○一一年四月修訂說明依照我院《計算機圖形學(xué)》教學(xué)大綱規(guī)定及課堂教學(xué)內(nèi)容,參閱其他院校本課程教學(xué)與實驗課內(nèi)容,并結(jié)合學(xué)生和實驗室狀況,特編制本實驗指引書供學(xué)生在上機實驗學(xué)時參照使用。本實驗大綱擇選與課程教學(xué)較為密切若干實驗,每個實驗分別給出了參照機時數(shù),實驗時可依照詳細機時安排狀況選做。在附錄中簡樸地簡介了OpenGL和DirectX3D兩個三維圖形開發(fā)平臺基本概念和有關(guān)重要函數(shù),供感興趣同窗入門學(xué)習(xí)參照使用。XRP于.3.15補充了MFC中幾種慣用DC使用闡明等;(附錄二1314)補充了VC下OpenGL編程框架細節(jié)。(附錄三)于.4.24補充MFC菜單使用;(附錄二10)補充了對話框使用;(附錄二11)鼠標拾取點示例。(附錄二12)于.4.26補充了工具條使用(附錄二13) 于.3.14增長三(二)9修改OnEraseBkgnd()函數(shù),禁止重繪背景,避免動畫時閃爍。 于Sydney.1.18目錄TOC\o"1-3"\h\u實驗一直線生成算法 1實驗二圓弧生成算法 2實驗三窗口菜單交互界面 2實驗四區(qū)域填充算法 3實驗五裁剪算法算法 3實驗六圖形軟件開發(fā)包/庫應(yīng)用 3實驗七曲線生成算法 4實驗八曲面生成算法 4實驗九二維圖形變換 5實驗十三維圖形變換 5實驗十一真實感圖形 6附錄 7一、C語言中圖形函數(shù)及其用法 7二、VC集成開發(fā)環(huán)境下基于MFC繪圖 16三、OpenGL繪圖 30四、DirectX3D繪圖 35五、實驗報告模板 39六、《計算機圖形學(xué)》上機實驗評分原則 40實驗一直線生成算法一、實驗教學(xué)目的與基本規(guī)定1.理解光柵圖形顯示屏工作原理和特點;2.學(xué)習(xí)C/VC環(huán)境下基本繪圖辦法;3.實踐與鞏固直線基本生成算法。
4.掌握直線掃描轉(zhuǎn)換算法原理及實現(xiàn);二、實驗課程內(nèi)容(2學(xué)時)基于光柵圖形顯示屏,在C環(huán)境中生成不同粗細和線型任意直線。1.理解光柵圖形顯示屏特點;2.熟悉C環(huán)境下圖形程序繪圖辦法;3.實踐DDA、中點及Bresenham基本算法,并至少用兩種基本算法生成任意直線;i.任意斜率:-1≤k<0,(50,400)(500,50);0≤k≤1,如(50,50)(300,200):1<|k|<∞,如(50,50)(300,400);k=∞,如(200,50)(200,400)。ii.任意起始點:如(200,500)(100,200),(300,200)(50,50)4.改進辦法,實現(xiàn)對直線實現(xiàn)線寬和線型(虛線、點劃線等)控制。三、實驗參照關(guān)于C環(huán)境下繪圖簡介請參見附錄一,如下實例為繪制一條直線(TC編譯環(huán)境),供上機實驗時參照使用。#include"graphics.h"#include"string.h"main(){ intx0=50,y0=50, x1=450,y1=450,color=3; //定義點(50,50),(450,450)和顏色color intx,y; intgdriver=DETECT,gmode; //定義圖形驅(qū)動程序和顯示模式 initgraph(&gdriver,&gmode,""); //圖形方式初始化 cleardevice(); //清屏 y=y0; for(x=x0;x<=x1;x++) { putpixel(x,y,color); //用colo顏色繪制點(x,y) y=y+1; } getch(); //讓畫面停住,等按一下鍵盤再繼續(xù) closegraph(); //關(guān)閉圖形方式 return(0);}注:VC集成開發(fā)環(huán)境下基于MFC繪圖可參照附錄二實驗二圓弧生成算法一、實驗教學(xué)目的與基本規(guī)定1.學(xué)習(xí)圓(弧)基本生成算法;2.理解光柵圖形顯示屏工作原理和特點;3.實踐圓(弧)基本生成算法;4.掌握圓弧掃描轉(zhuǎn)換算法原理及實現(xiàn);5.理解反走樣技術(shù)。二、實驗課程內(nèi)容(2學(xué)時)基于光柵圖形顯示屏,在C環(huán)境中生成任意圓弧,并實踐反走樣技術(shù)。1.鞏固C環(huán)境下繪圖辦法;2.用中點和Bresenham算法生成任意位置圓(弧);3.改進辦法,實現(xiàn)線寬和線型控制;4.運用反走樣技術(shù)改進直線和圓弧生成算法。實驗三窗口菜單交互界面一、實驗教學(xué)目的與基本規(guī)定1.理解窗口系統(tǒng)關(guān)于概念,學(xué)習(xí)有關(guān)知識;2.理解和學(xué)習(xí)菜單有關(guān)與知識;3.理解交互重要意義。二、實驗課程內(nèi)容(3學(xué)時)MS-Windows環(huán)境下窗口、菜單交互界面實現(xiàn)。三、實驗參照 Win32編程方式參照教材P108-128關(guān)于內(nèi)容,MFC編程方式可參照附錄二10-12。實驗四區(qū)域填充算法一、實驗教學(xué)目的與基本規(guī)定1.掌握區(qū)域填充基本算法原理;2.會使用字符圖形輸出。二、實驗課程內(nèi)容(4學(xué)時)1.多邊形掃描線、邊標志及掃描線種子填充算法(至少實現(xiàn)兩個算法);2.在屏幕上輸出矢量或點陣字符。三、實驗參照 參照教材關(guān)于內(nèi)容。實驗五裁剪算法算法一、實驗教學(xué)目的與基本規(guī)定熟悉裁剪算法基本原理。二、實驗課程內(nèi)容(2學(xué)時)實現(xiàn)直線Cohen-Sutherland、中點分割和參數(shù)化裁剪算法(至少實現(xiàn)兩種裁剪算法)。三、實驗參照 參照教材關(guān)于內(nèi)容。實驗六圖形軟件開發(fā)包/庫應(yīng)用一、實驗教學(xué)目的與基本規(guī)定1.會使用一種圖形軟件開發(fā)包;2.學(xué)習(xí)窗口下圖形界面設(shè)計;3.能使用圖形軟件開發(fā)包繪制簡樸圖形/形體。(為實驗十一做準備)二、實驗課程內(nèi)容(3學(xué)時)學(xué)習(xí)并實踐使用圖形軟件開發(fā)包(OpenGL或DirectX3D等)繪圖。1.熟悉圖形開發(fā)平臺程序設(shè)計過程;2.使用圖形庫繪制簡樸圖形/形體。三、實驗參照關(guān)于OpenGL或DirectX3D繪圖簡介請參見附錄三、四。實驗七曲線生成算法一、實驗教學(xué)目的與基本規(guī)定1.掌握曲線生成基本算法原理;2.能實現(xiàn)曲線生成;3.掌握課本所簡介圖形算法原理和實現(xiàn)。二、實驗課程內(nèi)容(4學(xué)時)實現(xiàn)Bezier曲線和B樣條曲線生成算法。1.Bezier曲線生成算法實現(xiàn)(參見教材P304~306):三次Bezier曲線及deCasteljau算法。2.B樣條曲線生成算法實現(xiàn)(參見教材P314~316):B樣條曲線分割,節(jié)點插入算法(選做)。三、實驗參照 參照教材關(guān)于內(nèi)容。實驗八曲面生成算法一、實驗教學(xué)目的與基本規(guī)定1.學(xué)習(xí)曲面生成、隱藏基本算法;2.理解z緩沖器算法應(yīng)用;3.掌握課本所簡介圖形算法原理和實現(xiàn)。
二、實驗課程內(nèi)容(4學(xué)時) 曲面隱藏線消除和z緩沖器應(yīng)用。 1.曲面隱藏線消除算法; 2.用z緩沖器算法繪出一種立方體真實感圖形。三、實驗參照 參照教材關(guān)于內(nèi)容。實驗九二維圖形變換一、實驗教學(xué)目的與基本規(guī)定1.掌握圖形變換基本算法原理;2.實現(xiàn)若干典型二維圖形變換算法。二、實驗課程內(nèi)容(4學(xué)時)1.生成前幾次實驗中基本圖形; 2.對生成基本圖形進行平移、旋轉(zhuǎn)、放縮、對稱等變換。實驗十三維圖形變換一、實驗教學(xué)目的與基本規(guī)定1.實習(xí)三維圖形坐標系之間變換;2.三維圖形幾何變換;3.掌握三維圖形坐標系之間變換算法及三維圖形幾何變換原理和實現(xiàn)。二、實驗課程內(nèi)容(4學(xué)時)實現(xiàn)三維圖形坐標系之間變換(世界坐標、物坐標、屏幕坐標)以及三維圖形幾何變換。三、實驗參照 參照教材關(guān)于內(nèi)容。實驗十一真實感圖形一、實驗教學(xué)目的與基本規(guī)定初步實現(xiàn)真實感圖形,并實踐圖形造型與變換等。二、實驗課程內(nèi)容(6學(xué)時)運用幾何造型,幾何、投影及透視變換、真實感圖形效果(消隱、紋理、光照等)關(guān)于知識實現(xiàn)。1.用給定地形高程數(shù)據(jù)繪制出地形圖;2.繪制一(套)房間,參數(shù)自定。三、實驗參照 參照教材及附錄三、四關(guān)于內(nèi)容。附錄一、C語言中圖形函數(shù)及其用法TurboC2.0/3.0具備豐富圖形功能,它提供了70各種圖形函數(shù)。在這里只簡介最慣用一某些,別的圖形函數(shù)及用法可參閱有關(guān)書籍。圖形函數(shù)均在頭文獻"graphics.h"中定義,因此在程序中調(diào)用這些圖形函數(shù)時,必要在程序文獻開頭寫上文獻包括命令:#include"graphics.h"。
1.圖形系統(tǒng)管理
PC機顯示屏有兩種工作模式,一種是圖形模式,此外一種是文本模式(缺省模式)。在文本方式下,屏幕分為80列、25行,在該方式下,圖形函數(shù)不能對的工作。因而在使用圖形函數(shù)繪圖之前,必要將屏幕顯示適配器設(shè)立為圖形模式,這就是普通所說"圖形方式初始化"。在繪圖工作完畢之后,又要使屏幕回到文本方式,以便進行文本方式下工作。
1)圖形方式初始化圖形方式初始化是通過函數(shù)initgraph()來完畢。其調(diào)用格式為:Initgraph(*gdriver,*gmode,*path);函數(shù)initgraph()功能是通過從磁盤上裝入一種圖形驅(qū)動程序來初始化圖形系統(tǒng),并將系統(tǒng)設(shè)立為圖形方式。調(diào)用該函數(shù)必要用三個參數(shù),其含義為:
gdriver是一種整型值,用來指定要裝入圖形驅(qū)動程序,如果給其賦值為DETECT(該值在頭文獻"graphics.h"已經(jīng)中定義),則系統(tǒng)自動檢測圖形適配器最高辨別率模式,并裝入相應(yīng)圖形驅(qū)動程序。gmode是一種整型值,用來設(shè)立圖形顯示模式。不同圖形驅(qū)動程序有不同圖形顯示模式;雖然是在同一種圖形驅(qū)動程序下,也也許會有幾種圖形顯示模式。圖形顯示模式?jīng)Q定了顯示辨別率、可同步顯示顏色多少、調(diào)色板設(shè)立方式以及存儲圖形一頁數(shù)。path是一種字符串,用來指明圖形驅(qū)動程序所在途徑。如果驅(qū)動程序就在顧客當前目錄下,則該參數(shù)可覺得空字符串,否則應(yīng)給出詳細途徑名。以上簡介了initgraph函數(shù)中三個參數(shù)含義。注意,前兩個參數(shù)事實上是整形指針,調(diào)用時應(yīng)加上地址運算符"&"。例:intgdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"");使用DETECT模式,由系統(tǒng)自動對硬件進行檢測,并把圖形顯示模式設(shè)立為檢測到驅(qū)動程序最高辨別率。2)關(guān)閉圖形方式 在運營圖形程序繪圖結(jié)束后,要回到文本方式,以進行其她工作,這時應(yīng)關(guān)閉圖形方式。關(guān)閉圖形方式要用函數(shù)closegraph()。其調(diào)用格式為: closegraph();函數(shù)closegraph()作用是:釋放所有圖形系統(tǒng)分派存儲區(qū),恢復(fù)到調(diào)用initgraph()之前狀態(tài)。函數(shù)closegraph()不需要參數(shù)。2.屏幕管理TurboC2.0提供了11個函數(shù)用于對屏幕和視圖區(qū)等進行控制管理。1)設(shè)立視圖區(qū) 在圖形模式下,可以用函數(shù)setviewport()在屏幕上定義一種視圖區(qū)(視圖區(qū)相稱于一種用于繪圖窗口)。視圖區(qū)位置用屏幕絕對坐標定義,并且可以把視圖區(qū)設(shè)立為剪裁和不剪裁兩種狀態(tài)。函數(shù)setviewport()調(diào)用格式為: setviewport(x1,y1,x2,y2,c);
函數(shù)調(diào)用中五個參數(shù)均為整型,其中: x1,y1:為視圖區(qū)左上角坐標。X2,y2:為視圖區(qū)右下角坐標。C:為裁剪狀態(tài)參數(shù)。當c=1時,則超過視圖區(qū)圖形某些被自動裁剪掉;當c=0時,則對超過視圖區(qū)圖形不作裁剪解決。注意:視圖區(qū)建立后來,所有圖形輸出坐標都是相對于當前視圖區(qū),即視圖區(qū)左上角為坐標(0,0)點,而與圖形在屏幕上位置無關(guān)。2)清除視圖區(qū)清除視圖區(qū)可以使用函數(shù)clearviewport()。它作用是清除掉當前視圖區(qū),將當前點位置設(shè)立于屏幕作上角(0,0)點。執(zhí)行后,原先設(shè)立視圖區(qū)將不復(fù)存在。函數(shù)調(diào)用格式為:clearviewport();3)清屏清除屏幕使用函數(shù)cleardevice()。它作用是及時清除全屏幕內(nèi)容,并將當前點位置設(shè)立為原點(0,0)。但是其她圖形系統(tǒng)設(shè)立保持不變,如線型,充填模式等;如果設(shè)立了視圖區(qū),則視圖區(qū)設(shè)立不變,涉及當前點位置設(shè)立在視圖區(qū)左上角。清屏函數(shù)調(diào)用格式為:cleardevice();3.繪圖函數(shù)繪圖函數(shù)是進行圖形操作基本。用象素點幾乎可以畫出任何圖形,但效率太低。為此TC提供了大量基本繪圖函數(shù),以以便圖形設(shè)計。
在使用繪圖函數(shù)時,要隨時注意畫圖"當前點位置",它是繪圖起始位置。也就是說,圖形總是從當前點開始畫。畫完一種圖形后,有時當前點位置不變,仍在本來位置;有時則要把當前點移到新位置。此外,為了從指定位置開始作圖,有時需要先變化當前點位置,然后再作圖。在調(diào)用繪圖函數(shù)時候要注意這些問題。
1)直線類函數(shù)用直線類函數(shù)繪制直線圖形,可以用兩種坐標:一種時絕對坐標;另一種是相對坐標。
Line()函數(shù) 用line()函數(shù)可以在指定兩點之間畫一條直線段。其調(diào)用格式為:line(x1,y1,x2,y2);
參數(shù)x1,y1,x2,y2均為整型,使用絕對坐標。其中(x1,y1)和(x2,y2)分別為直線兩個端點坐標。用line函數(shù)畫線時,其當前點位置不變。例如:已知三角形兩個頂點坐標分別為:(x1,y1)、(x2,y2)和(x3,y3),則用下面語句可以把該三點連成一種三角形:line(x1,y1,x2,y2);
line(x2,y2,x3,y3);
line(x3,y3,x1,y1);lineto()函數(shù)lineto()函數(shù)用于從當前點位置到指定位置畫一條直線,并變化當前點位置。在畫線到指定點同步也把當前點位置移到了指定點(即直線終點)。其調(diào)用格式為:lineto(x,y);
參數(shù)x,y位指定點坐標,均為整型。moveto()函數(shù)函數(shù)moveto()用于移動當前點位置,并不畫線。其調(diào)用格式為:moveto(x,y);
參數(shù)x,y用于指定新當前點位置坐標(用整型,使用絕對坐標)。調(diào)用成果是將當前點位置移到點(x,y)處。例如:moveto(400,10);
成果是將當前點位置移到了(400,10)處。moveto()函數(shù)和lineto()函數(shù)配合使用,可以在兩點之間畫直線。例如:moveto(400,10);
lineto(240,360);上面語句實現(xiàn)把當前點移到(400,10)處,然后從該點畫線到(240,360)處。畫線結(jié)束后,當前點位置在(240,360)處。linerel()函數(shù) linerel()函數(shù)用相對坐標畫線。其功能是從當前點位置開始畫線到指定點位置,該指定點位置坐標不是以絕對坐標形式給出,而是以其相對于當前點(即直線起點)位置坐標增量給出(相對坐標)。其調(diào)用格式為: linerel(dx,dy);
參數(shù)是相對于直線起點坐標增量。Linerel()函數(shù)變化當前點位置到指定點處。moverel()函數(shù) moverel()函數(shù)功能與moveto()函數(shù)相似,但它使用是相對坐標,它使當前點位置在x和y方向上分別移動一種增量。其調(diào)用格式為:moverel(dx,dy);
參數(shù)dx,dy為整型,是相對于當前點位置增量。下面舉幾種實際繪圖例子,來闡明上面這些函數(shù)在使用上差別:例1:用line函數(shù)過四點畫一種矩形。#include"graphics.h"
#include"stdio.h"
main()
{intgdriver=DETECT,,gmode;
initgraph(&gdriver,&gmode,"");
cleardevice();
line(100,100,100,400);
line(100,400,300,400);
line(300,400,300,100);
line(300,100,100,100);
getch();
closegraph();}2)圓弧類函數(shù)circle()函數(shù) 函數(shù)circle()用于以指定圓心和半徑方式畫圓。其調(diào)用格式為circle(x,y,r);
參數(shù)x,y,r均為整型。其中x,y為指定圓心坐標,r為圓半徑。例如:
circle(300,200,100);調(diào)用成果是:以點(300,200)為圓心,以100為半徑畫一種整圓。arc()函數(shù) arc()函數(shù)用于畫圓弧。其調(diào)用格式為:arc(x,y,args,ange,r);
函數(shù)調(diào)用時所需五個參數(shù)均為整型。其中:
x,y為圓弧所在圓圓心坐標。angs,ange分別為圓弧起始角和終結(jié)角(單位為度),r為圓弧半徑。例如:
arc(300,200,90,180,200)成果是以點(300,200)為圓心,200為半徑,從90度到180度畫了四分之一圓弧。當圓弧起始角angs=0,終結(jié)角angs=360時,則可以畫出一種整圓。ellipse()函數(shù) 函數(shù)ellipes()用于畫橢圓弧或橢圓。其調(diào)用格式為:ellipse(x,y,angs,ange,xr,yr);
函數(shù)參數(shù)均為整型。其中:
x,y為橢圓中心坐標,angs,ange分別為橢圓弧起始角和終結(jié)角(單位為度),xr,yr分別為橢圓水平軸半軸和垂直軸半軸。如果args=0,ange=360,則可以畫出一種完整橢圓。此外:
xr>yr:則畫出長軸為水平方向橢圓或橢圓??;
xr<yr:則畫出長軸為垂直方向橢圓或橢圓??;
xr=yr:則可以畫出圓或圓弧。例2:調(diào)用函數(shù)ellipse畫出一種橢圓群。#include"graphics.h"
#include"stdio.h"
main()
{inta=150,i;
intgdriver=EDTECT,gmode;
initgraph(&gdriver,&gmode,"");
cleardevice()
for(i=10;i<=140;i+=10);
ellips(320,240,0,360,a-i,i);
getch();
closegraph();}3)多邊形rectangel()函數(shù) 函數(shù)rectangle()用于繪制矩形。其調(diào)用格式為:rectangle(x1,y1,x2,y2);
參數(shù)x1,y1,x2,y2均為整型。函數(shù)功能是以點(x1,y1)為矩形左上角點,以點(x2,y2)為矩形右下角點,畫一種矩形。drawpoly()函數(shù) 函數(shù)drawpoly()可用于畫一條多邊折線或者一種多邊形。其調(diào)用格式為:drawpoly(nps,*pxy);
它有兩個參數(shù)。第一種參數(shù)nps是一種整型數(shù)據(jù),它表時所畫多邊折線頂點數(shù),第二個參數(shù)pxy是一種整型數(shù)組數(shù)組名,該數(shù)組中存儲了nps個頂點坐標值序列。例如,有一種名為d_poly數(shù)組中存儲了4個頂點坐標為[x1,y1,x2,y2,x3,y3,x4,y4],則調(diào)用方式為:drawpoly(4,d_poly);如果最后一種點坐標與第一種點坐標相似,則運用drawpoly()函數(shù)便可以畫出一種封閉多邊形。此時,坐標點數(shù)目應(yīng)當是多邊形頂點數(shù)加1,即讓最后一種頂點和第一種點重疊。例如,有一種名為d_poly數(shù)組中存儲了6個頂點坐標為[x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x1,y1],則調(diào)用方式為:drawpoly(6,d_poly);便可以畫出一種具備5個頂點封閉多邊形。4.圖形屬性控制圖形屬性控制涉及控制顏色和線型。顏色有背景色和前景色之分。背景色指屏幕顏色(即繪圖時底色),前景色指繪圖時圖形線條所用顏色。任何繪圖函數(shù)都是在當前顏色(涉及背景色和前景色)和線型狀態(tài)下進行繪圖。前面所舉例子中沒有提當前顏色和線型,是由于用了系統(tǒng)缺省值(系統(tǒng)缺省值是:背景色為黑色,前景色為白色,線型為實線)。如果繪圖時要使用系統(tǒng)缺省值以外顏色和線型,則可以運用圖形屬性控制函數(shù)另行設(shè)立。
setbkcolor()函數(shù) 函數(shù)setbkcolor()用于設(shè)立繪圖時背景色。調(diào)用格式為:setbkcolor(color);
參數(shù)color為一種整型數(shù)據(jù),代表所取顏色,可以用整型常數(shù)(0~15),也可以用符號常數(shù)。例如,要把背景色設(shè)立成淺藍,可以如下調(diào)用:setbkcolor(9);;9表達淺藍。setcolor()函數(shù) 函數(shù)setcolor()用于設(shè)立前景顏色,即繪圖用顏色。調(diào)用格式為:setcolor(color);
參數(shù)color含義和用法同setbkcolor()函數(shù)。下面例程序可以演示16種顏色。
例3:顯示16種顏色#include"graphics.h"
#include"stdio.h"
main(){intcb,cf;
intgdriver=DETECT,gmode;
initgraph(&drive,&gmode,"");
cleardevice();
for(cb=0;cb<=15;cb++)
{setbkcolor(cb);
for(cf=0;cf<=15;cf++)
{setcolor(cf);
circle(100+cf*25,240,100);}
getch();
}getch();
closegraph();}setlinestyle()函數(shù) 函數(shù)setlinestyle()用于設(shè)立當前繪圖所用線型和寬度,這些設(shè)立限于對
直線類圖形有效。其調(diào)用格式如下: setlinestyle(sty,pat,b);該函數(shù)所用三個函數(shù)含義如下:sty為整型值,用來定義所畫直線類型(0~4);pat為無符號整型數(shù),該參數(shù)在需要顧客自定義線型時使用,如果是使用系統(tǒng)定義線型,則該參數(shù)可取0值;b為整型數(shù),指定所畫直線粗細,以象素為單位(1或3)當函數(shù)setlinestyle第一種參數(shù)為USERBIT-LINE(或4)時,可以由顧客自己定義直線類型。例4:編寫程序,顯示系統(tǒng)預(yù)定義四種線型。#include"graphics.h"
#include"stdiio.h"
main()
{inti,j,c,x=50,y=50,k=1;
intgdrive=DETECT,gmode;
printf("inputcolornumber.\n")
scanf("%d",&c);
initgraph(&gdriver,&gmode,"");
cleardevice();
setbkcolor(11);
setcolor(c);
for(j=1;j<=2;j++);
{
for(i=0;i<4;i++)
{
setlinestyle(i,0,k);
rectangle(x,y,x+210,y+80);
x=x+110;
y=y+40;
}
k=3;
x=50;
y=250;
}
getch();
closegraph();}5.充填setfillstyle()函數(shù) 函數(shù)setfillstyle()用來設(shè)立當前充填模式和充填顏色,以便用于充填一種指定封閉區(qū)域。其調(diào)用格式為:setfillstyle(pattern,color);
參數(shù)pattern用于指定充填模式(取值:0~11),第二個參數(shù)color指定充填用顏色。
Floodfill()函數(shù) 函數(shù)floodfill()實行對一指定區(qū)域進行充填操作,其充填模式和顏色已由setfillstyle()函數(shù)指定。其調(diào)用格式為:floodfill(x,y,bcolor);參數(shù)x,y指位于充填區(qū)域內(nèi)任意一點坐標,該點作為充填起始點。bcoloor為充填區(qū)域邊界顏色。例5:下面例程序演示充填狀況。#include"graphics.h"
#include"stdio.h"
main()
{
inti,c,x=5,y=6;
intgdriver=DETECT,gmode;
printf("inputcolornumber.\n");
scanf("%d",&c);
initgraph(&gdriver,&gmode,"");
cleardevice();
setbkcolor(9);
for(i=c;i<c+8;i++)
{
setcolor(i);
rectangle(x,y,x+140,y+104);
x=x+70;
y=y+52;
setfillstyle(1,i);
floodfill(x,y,i);
}
getch();
closegraph();
}6.圖形方式下文本輸出settextstyle(font,direction,csize)函數(shù)。設(shè)立字符顯示風(fēng)格。函數(shù)三個參數(shù)含義如下font:是一種整型數(shù)據(jù),用于指明所要使用文字字體(0表達8*8位圖字體;1表達三重矢量字體;2表達小號矢量字體;3表達無襯線矢量字體;4表達哥特矢量字體)。direction:是一種整型數(shù)據(jù),表達指定文本輸出方向(0表達從左向右輸出;1表達從上向下輸出)。csize:是一種整型數(shù)據(jù),表達字符大?。▽嶋H是一種放大系數(shù),表達對8*8點陣字符放大倍數(shù),取值范疇是1~10)。outtext(char*text);在當前位置輸出一種文本字符串。
outtextxy(intx,inty,char*text);在x,y位置輸出一種文本字符串。綜合舉例
例6:漁網(wǎng)圖案繪制#include"graphics.h"
#include"stdio.h"
main()
{intx,y,x1,y1,x0=320,y0=50;
inti,j,n=5,r=20;
intgdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"");
cleardevice();
setbkcolor(9);
for(i=0;i<2*n;i++)
{x1=x0-i*r;
y1=y0+i*r;
for(j=0;j<=n-1;j++)
{x=x1+2*j*r;y=y1+2*j*r;
arc(x,y,180,270,r);
arc(x,y+2*r,0,90,r);}}x1=x0-2*r;
y1=y0;
for(i=0;i<2*n;i++)
{x1=x1+r;
y1=y1+r;
for(j=0;j<=n-1;j++)
{x=x1-2*j*r;y=y1+2*j*r;
arc(x,y,90,180,r);
arc(x-2*r,y,270,360,r);}}getch();
closegraph();}例7:圖形模式下文本輸出#include"graphics.h"
#include"stdio.h"
#include"dos.h"
main()
{inti,t,x=300,y=50;
intgdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"");
cleardevice();
setbkcolor(9);
setcolor(4);
for(i=1;i<=10;i++)
{x=x-15;
y=y+15;
settextstyle(1,0,i);
cleardevice();
outtextxy(x,y,"itisok");
delay(200);/*時間延遲*/}getch();
closegraph();}二、VC集成開發(fā)環(huán)境下基于MFC繪圖0.MFC簡介MFC(MicrosoftFoundationClassLibrary)中各種類結(jié)合起來構(gòu)成了一種應(yīng)用程序框架,它目就是讓程序員在此基本上來建立Windows下應(yīng)用程序,這是一種相對SDK來說更為簡樸辦法。由于總體上,MFC框架定義了應(yīng)用程序輪廓,并提供了顧客接口原則實現(xiàn)辦法,程序員所要做就是通過預(yù)定義接口把詳細應(yīng)用程序特有東西填入這個輪廓。MicrosoftVisualC++提供了相應(yīng)工具來完畢這個工作:AppWizard可以用來生成初步框架文獻(代碼和資源等);資源編輯器用于協(xié)助直觀地設(shè)計顧客接口;ClassWizard用來協(xié)助添加代碼到框架文獻;最后,編譯,則通過類庫實現(xiàn)了應(yīng)用程序特定邏輯。MFC提供了一種Windows應(yīng)用程序開發(fā)模式,對程序控制重要是由MFC框架完畢,并且MFC也完畢了大某些功能,預(yù)定義或?qū)崿F(xiàn)了許多事件和消息解決,等等。框架或者由其自身解決事件,不依賴程序員代碼;或者調(diào)用程序員代碼來解決應(yīng)用程序特定事件。MFC是C++類庫,程序員就是通過使用、繼承和擴展恰當類來實現(xiàn)特定目。例如,繼承時,應(yīng)用程序特定事件由程序員派生類來解決,不感興趣由基類解決。實現(xiàn)這種功能基本是C++對繼承支持,對虛擬函數(shù)支持,以及MFC實現(xiàn)消息映射機制。1.運用VC工程向?qū)Ы⒁环N工程工程名可覺得班號+學(xué)號+姓名+實驗序號,如8_04888_張三_1,這里以test為示例,如圖1所示。圖1建立工程2.點擊“OK”擬定后,如圖2所示圖2選取單文檔3.選取“Singledocument”后,點擊“Finish”,如圖3所示圖3確認4.點擊“OK”擬定后,在左則選取“ClassView”項,點擊開“testclass”前“+”,再點擊“CTestView”類前“+”,雙擊“OnDraw(CDC*pDC)”,如圖4所示圖4編寫代碼5.在OnDraw()函數(shù)中使用pDC對象進行繪圖,如 pDC->SetPixel(x,yy,255);設(shè)立(x,yy)象素點顏色為255??稍谄渲屑尤胱约捍a,如DDA程序如下: intx,yy;floatdx,dy,k,y; intx0=1,y0=1,x1=500,y1=400; COLORREFcolor=RGB(100,25,108); //定義一種RGB顏色常量dx=x1-x0;dy=y1-y0; k=dy/dx;y=y0;for(x=x0;x<=x1;x++){ yy=(int)(y+0.5); pDC->SetPixel(x,yy,color255); y=y+k;}如圖4所示。此外,也可以在這里調(diào)用自己聲明定義好函數(shù),詳見7-9。6.點擊菜單“Build”中“BuildAll”編譯程序,如圖5所示,無錯誤后可執(zhí)行(Ctrl+F5)。圖5編譯或執(zhí)行7.聲明一種CTestView類成員函數(shù):雙擊CTestView類可打開TestView.h文獻,如圖6所示,可在public后聲明函數(shù)voidDDALine(intx1x0,inty1y0,intx2x1,inty2y1,COLORREFintcolor);圖6成員函數(shù)聲明8.返回TestView.CPP文獻定義函數(shù)voidCTestView::DDALine(intx1x0,inty1y0,intx2x0,inty2y0,COLORREFintcolor){加入自己程序代碼。}圖7自定義函數(shù)9.在OnDraw(CDC*pDC)中調(diào)用定義好函數(shù),如DDALine(100,100,400,500,200);圖8自定義成員函數(shù)調(diào)用10.MFC菜單實現(xiàn)i.設(shè)立菜單項 在VC集成開發(fā)環(huán)境界面左側(cè)工作區(qū),打開“Resourse”中“Menu”,選取默認菜單資源“IDR_MAINFRAME”,添加菜單項,并定義標題、ID及提示等屬性,如圖9所示。圖9ii.添加命令函數(shù) 按Ctrl+W快捷鍵進入MFC類向?qū)Вx取View類、剛才定義好菜單項ID、COMMAND消息,如圖10所示。然后點擊“AddFunction…”按鈕,再單擊“OK”添加成員函數(shù),如圖11所示。圖10MFC類向?qū)D11添加成員函數(shù)iii.編輯相應(yīng)函數(shù) 點擊“EditCode”按鈕進入相應(yīng)函數(shù)編輯區(qū)域,可編寫相應(yīng)程序代碼,也可調(diào)用定義DDA函數(shù),如圖12所示。圖12編寫菜單響應(yīng)函數(shù)通過編輯即可選取添加菜單項執(zhí)行相應(yīng)程序代碼/函數(shù),如圖13。圖13執(zhí)行菜單項重復(fù)以上環(huán)節(jié)可添加其他菜單項。11.MFC對話框輸入/輸出i.設(shè)立對話框 在VC集成開發(fā)環(huán)境界面左側(cè)工作區(qū),打開“Resourse”中“Dialog”,在其上單擊鼠標右鍵,在POP菜單上選取資源“Insert…”,添加對話框“”,點擊“N新建”按鈕項,并定義標題、ID及提示等屬性,如圖9所示。圖14添加對話框ii.添加對話框控件添加靜態(tài)文字和文本輸入框,如圖15所示,并設(shè)立文本輸入框ID分別為IDC_X1、IDC_Y1、IDC_X2和IDC_Y1。圖15添加對話框控件iii.對話框類及成員變量定義按Ctrl+W進入類設(shè)計向?qū)?,點OK添加對話框類,并命名為Dialog1如圖16,并點擊OK按鈕確認。圖16定義對話框類選取類向?qū)е小癕emberVariables”選項來設(shè)立成員變量,選中控件IDC_X1后,點擊右側(cè)“AddVariable…”,如圖17設(shè)立變量名稱為m_pt1_X及變量類型int后,點擊“OK”確認,此時可設(shè)立變量輸入值有效范疇(初始值在對話框構(gòu)造函數(shù)中設(shè)立)。同樣設(shè)立控件IDC_Y1、IDC_X2和IDC_Y1變量名稱為m_pt1_Y、m_pt2_X和m_pt2_Y,變量類型均設(shè)立為int型。圖17定義成員變量iv.使用對話框在View類.CPP文獻中包括對話類,并定義對話框?qū)ο骴lg。在菜單選項響應(yīng)函數(shù)中加入dlg.doModel()來執(zhí)行定義好對話框,并添寫獲取對話框中輸入數(shù)據(jù)語句,如圖18所示。圖18使用對話框此時可編譯運營程序,點擊相應(yīng)菜單選項即可執(zhí)行對話框內(nèi)容。12.鼠標拾取點 運用類向?qū)?Ctrl+W),在View類中添加WM_LBUTTONUP消息,如圖19。圖19添加鼠標左鍵消息然后點“EditCode”按鈕進入代碼編寫區(qū),輸入如下代碼: if(ipt%2!=0) //區(qū)別點擊先后兩點 { point1=point;//記錄點1 OnDDALine(point0.x,point0.y,point1.x,point1.y); //兩點繪線 } else point0=point;//記錄點0 ipt=ipt+1; //點擊計數(shù)器加一 在相應(yīng)view.CPP文獻前增長變量聲明 Intipt=0; //鼠標點擊計數(shù)器 CPointpoint0,point1; //點擊一對點坐標當前就可以編譯運營,實現(xiàn)用鼠標左鍵拾取兩點繪線了。13.工具條使用 在VC集成開發(fā)環(huán)境界面左側(cè)工作區(qū),打開“Resourse”中“Toolbar”,可選取默認菜單資源“IDR_MAINFRAME”,繪制新圖標項,如圖20所示。圖20工具欄新圖標繪制雙擊工具欄中繪制好圖標按鈕,在彈出對話框中為其選取相應(yīng)命令函數(shù),如圖21所示。保存編譯后即可實現(xiàn)工具新添加圖標按鈕執(zhí)行所選取命令函數(shù)。圖21工具欄標相應(yīng)函數(shù)設(shè)立134.VC、MFC與繪圖關(guān)于內(nèi)容1)點與顏色等 CPointpoint; //定義點變量,包括x和y兩個值 COLORREFrgb; //定義RGB顏色變量 COLORREFGetPixel(intx,inty); //獲取像素點RBG顏色值 Invalidate(); //發(fā)送重新繪制消息2)幾種設(shè)備描述定義與使用示例HDChdc=::GetDC(m_hWnd);SetPixel(hdc,x,y,RGB(125,34,180));::ReleaseDC(m_hWnd,hdc);//::GetDC和::ReleaseDC應(yīng)配對使用,否則也許會導(dǎo)致錯誤CDC*pDC=GetDC();pDC->SetPixel(x,y,255);ReleaseDC(pDC);CClientDCdc(this);CWindowDCdc(this);
CWindowDCdc(GetDesktopWindow());//獲得整個桌面句柄,某些桌面特效程序使用CPaintDCdc(this); dc.SetPixel(x,y,RGB(25,34,128));3)幾種設(shè)備闡明Windows應(yīng)用程序通過為指定設(shè)備(屏幕,打印機等)創(chuàng)立一種設(shè)備描述表(DeviceContext,DC)在DC表達邏輯意義“畫布”上進行圖形繪制。DC是一種包括設(shè)備信息數(shù)據(jù)構(gòu)造,它包括了物理設(shè)備所需各種狀態(tài)信息。Win32程序在繪制圖形之前需要獲取DC句柄HDC,并在不繼續(xù)使用時釋放掉。在c++編程中常會見到HDC、CDC、CClientDC、CPaintDC、CWindowDC這樣類。
HDC是DC句柄,API中一種類似指針數(shù)據(jù)類型。.
CDC是MFCDC一種類,CDC等設(shè)備上下分類,都具有一種類成員變量:m_nHdc,即HDC類型句柄。CDC及其派生類繼承視圖:CObject
public|CDC
public||CClientDC
public||CPaintDC
public||CWindowDC
public||CMetaFileDC
(注意:除CMetaFileDC以外三個派生類用于圖形繪制.)CDC類定義了一種設(shè)備描述表有關(guān)類,其對象提供成員函數(shù)操作設(shè)備描述表進行工作,如顯示屏,打印機,以及顯示屏描述表有關(guān)窗口客戶區(qū)域。通過CDC成員函數(shù)可進行一切繪圖操作。CDC提供成員函數(shù)進行設(shè)備描述表基本操作,使用繪圖工具,選取類型安全圖形設(shè)備構(gòu)造(GDI),以及色彩,調(diào)色板。除此之外還提供成員函數(shù)獲取和設(shè)立繪圖屬性,映射,控制視口,窗體范疇,轉(zhuǎn)換坐標,區(qū)域操作,裁減,劃線以及繪制簡樸圖形(橢圓,多邊形等)。成員函數(shù)也提供繪制文本,設(shè)立字體,打印機換碼,滾動,解決元文獻。其派生類:
1.PaintDC:封裝BeginPaint和EndPaint兩個API調(diào)用。(1)用于響應(yīng)窗口重繪消息(WM_PAINT)是繪圖輸出。
(2)CPaintDC在構(gòu)造函數(shù)中調(diào)用BeginPaint()獲得設(shè)備上下文,在析構(gòu)函數(shù)中調(diào)用EndPaint()釋放設(shè)備上下文。EndPaint()除了釋放設(shè)備上下文外,還負責(zé)從消息隊列中清除WM_PAINT消息。因而,在解決窗口重畫時,必要使用CPaintDC,否則WM_PAINT消息無法從消息隊列中清除,將引起不斷窗口重畫。
(3)CPaintDC也只能用在WM_PAINT消息解決之中。2.CClientDC(客戶區(qū)設(shè)備上下文):解決顯示屏描述表有關(guān)窗體客戶區(qū)域。
用于客戶區(qū)輸出,與特定窗口關(guān)聯(lián),可以讓開發(fā)者訪問目的窗口中客戶區(qū),其構(gòu)造函數(shù)中包括了GetDC,析構(gòu)函數(shù)中包括了ReleaseDC。3.CWindowDC:解決顯示屏描述表有關(guān)整個窗體區(qū)域,涉及了框架和控件(子窗體)。(1)可在非客戶區(qū)繪制圖形,而CClientDC,CPaintDC只能在客戶區(qū)繪制圖形。
(2)坐標原點是在屏幕左上角,CClientDC,CPaintDC下坐標原點是在客戶區(qū)左上角。
(3)關(guān)聯(lián)一特定窗口,容許開發(fā)者在目的窗口任何一某些進行繪圖,包括邊界與標題,這種DC同WM_NCPAINT消息一起發(fā)送。4.CMetaFileDC:與元文獻有關(guān)設(shè)備描述表關(guān)聯(lián)。MFC類使用以便諸多,由于它們都在構(gòu)造函數(shù)和析構(gòu)函數(shù)調(diào)用了響應(yīng)函數(shù)進行DC獲取和釋放.下面說下某些細點知識點
CClientDC,CWindowDC區(qū)別不大,可以說CWindowDC包括了CClientDC就拿記事本來說
CClientDC就只是白白咱們可以編輯文字那個區(qū)域是客戶區(qū)
CWindowDC除了上面說白白區(qū)域,還涉及菜單欄和工具欄等
CClientDC和CWindowDC與CPaintDC區(qū)別大點
在DC獲取方面CClientDC和CWindowDC使用是并只能是GetDC和ReleaseDC
CPaintDC使用是并只能是BeginPaint和EndPaint
CPaintDC只能用在響應(yīng)WM_PAINT事件
CClientDC,CWindowDC只能用在響應(yīng)非WM_PAINT事件如下內(nèi)容待進一步整頓(僅供參照)VC中如何創(chuàng)立各種工具條在實際軟件開發(fā)中,咱們經(jīng)常需要創(chuàng)立各種自定義工具條,并且要象原則工具條那樣,容許顧客通過鼠標將自定義工具條移動到框架其他地方,還可以依照需要顯示或是隱藏該工具條。通過實踐,咱們在VisualC++6.0中編程實現(xiàn)了創(chuàng)立自定義工具條,從而在應(yīng)用程序中可并存各種工具條。
1.在VisualC++6.0中用AppWizard以默認方式創(chuàng)立SDI或MDI應(yīng)用程序工程,工程名稱為MyBars。
2.在ResourceView中選取“Toolbar”并點擊右鍵,通過選取“InsertToolbar”新建一工具條,其ID值設(shè)為ID_MYTOOLBAR。在該工具條上添加兩個位圖按鈕,并雙擊每個位圖按鈕,設(shè)立其ID值分別為ID_MYTOOLBAR_CIRCLE和ID_MYTOOLBAR_RECT。
3.在MainFrame.h文獻中CMainFrame類定義前面定義一種映射工具條按鈕圖像和程序命令I(lǐng)D數(shù)組,這是一種UINT類型數(shù)組:
staticUINTBASED_CODEMy_Buttons[]=
{//要和工具條中位圖順序同樣
ID_TOOLBAR_CIRCLE,
ID_TOOLBAR_RECT};
4.在CMainFrame類中添加一工具條對象指針m_pMyToolBar:
classCMainFrame:publicCFrameWnd
{……
protected:
CStatusBarm_wndStatusBar;
CToolBarm_wndToolBar;
CToolBarm_pMyToolBar;
//新添加工具條對象指針
……}
5.在CMainFrame::OnCreate函數(shù)中添加代碼創(chuàng)立和初始化工具條,并建立所需連接關(guān)系,代碼如下:
intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct)
{……
//創(chuàng)立和初始化工具條對象
m_pMyToolBar=newCToolBar();
m_pMyToolBar-〉Create(this,WS_CHILD|WS_VISIBLE|CBRS_TOP,0x9100);
//將按鈕圖象和工具條對象連接起來
m_pMyToolBar-〉LoadBitmap(IDR_MYTOOLBAR);
//將映射數(shù)組My_Buttons和工具條對象連接起來
m_pMyToolBar-〉SetButtons(My_Buttons,sizeof(My_Buttons)/sizeof(UINT));
//容許顧客通過鼠標將工具條移動到框架其他地方
m_pMyToolBar-〉EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(m_pMyToolBar);
return0;}
6.通過View-〉ClassWizard為工具條按鈕ID值添加消息響應(yīng)解決函數(shù),例如為ID_TOOLBAR_CIRCLE添加解決函數(shù)如下所示:
voidCMainFrame::OnToolbarCircle()
{AfxMessageBox("Circle");//可改為詳細關(guān)于代碼}
這樣,咱們就創(chuàng)立了一種新工具條(如圖1),上面有兩個按鈕,點擊按鈕將會執(zhí)行關(guān)于操作,并且顧客還可以將工具條任意拖動到框架其他地方。
圖1
工具條建立之后,就被連接到應(yīng)用程序框架窗口上,咱們普通還要容許顧客依照需要顯示或隱藏該工具條。下面代碼就可實現(xiàn)這種規(guī)定:
intnShow=SW_SHOWNORMAL;//想要隱藏則設(shè)立為SW_HIDE
m_pMyToolBar-〉ShowWindow(nShow);//顯示或隱藏工具條
RecalcLayout();//告知框架窗口,重新計算工具條位置
以上程序在VisualC++6.0中調(diào)試通過。
VC++實現(xiàn)工具條上原則控件動態(tài)添加工具條作為大多數(shù)原則Windows應(yīng)用程序一種重要構(gòu)成某些,使其成為增進人機界面和諧一種重要工具。通過工具條極大以便了顧客對程序操作,但是在由MicrosoftVisualC++開發(fā)環(huán)境所創(chuàng)立應(yīng)用程序框架中工具條只是一種簡樸按鈕集合,在功能上也僅僅是起到了菜單快捷方式作用,而沒有做到象VC、Word等軟件工具條那樣,提供各種不同類型原則控件如組合框、編輯框等。特別是組合框在添加到工具條上后,可將原本需要在彈出對話框中完畢交互操作在工具條上就可以進行,從而在很大限度上改進了應(yīng)用程序界面和諧限度。本文就此給出一種在普通應(yīng)用程序工具條上動態(tài)創(chuàng)立組合框、編輯框等原則控件普通辦法,并使應(yīng)用程序可以響應(yīng)由這些控件所觸發(fā)&&事件。組合框添加組合框是添加到工具條中最常用一種原則控件,彌補了列表框控件占用較大空間和編輯控件數(shù)據(jù)輸入啰嗦等弊端,可以在工具條有限區(qū)域內(nèi)提供所有備選數(shù)據(jù),顧客普通狀況下只需通過鼠標操作即可實現(xiàn)對數(shù)據(jù)選用。因而,多數(shù)狀況下都是需要向工具條添加組合框控件來改進程序界面和諧限度。由于是在工具條上動態(tài)創(chuàng)立組合框控件,而工具條又非原則客戶區(qū),因而動態(tài)創(chuàng)立過程就存在一定困難。這里解決方式是先在VC資源視圖中為工具條添加一種空按鈕IDC_COMBOX,然后通過CToolBar類SetButtonInfo()&&函數(shù)來對此空白按鈕進行設(shè)立,其目是為背面將要創(chuàng)立組合框在工具條上占據(jù)一塊空間,然后再通過CToolBar類GetItemRect()&&函數(shù)得到通過修改后按鈕區(qū)域坐標,該坐標值在背面創(chuàng)立動態(tài)組合框時將指定在工具條什么地方創(chuàng)立一種多大組合框。通過這些準備工作后,接下來組合框在工具條上動態(tài)創(chuàng)立過程則完全同在客戶區(qū)中解決,即以CComboBox類Create()&&函數(shù)動態(tài)完畢。依照前面設(shè)計思路不難寫出實當代碼。顯然,這某些代碼應(yīng)當與工具條創(chuàng)立代碼一起添加到主框架類創(chuàng)立&&函數(shù)OnCreate()中,下面結(jié)合注釋給出某些核心代碼:……
//工具條m_wndToolBar創(chuàng)立代碼
……
//設(shè)立組合框?qū)挾?,四個參數(shù)依次為控件在工具條中索引號、ID號、風(fēng)格、寬度
m_wndToolBar.SetButtonInfo(8,IDC_COMBOX,TBBS_SEPARATOR,160);
//得到組合框位置
m_wndToolBar.GetItemRect(8,&rect);
//設(shè)立組合框下拉高度
rect.bottom+=100;
//創(chuàng)立組合框,四個參數(shù)依次為窗口風(fēng)格、組合框位置、父窗口、ID號
m_combobox.Create(CBS_DROPDOWN|WS_VISIBLE|WS_TABSTOP|CBS_AUTOHSCROLL,rect,&m_wndToolBar,IDC_COMBOX);
//在組合框中加入字符串
m_combobox.AddString("第一條記錄");
m_combobox.AddString("第二條記錄");
//選中第1條記錄
m_combobox.SetCurSel(0);對組合框&&事件響應(yīng)通過上述編碼,已經(jīng)在工具條上空白按紐處動態(tài)創(chuàng)立出了一種組合框,但是僅僅創(chuàng)立出組合框還是不夠,為了能通過此組合框?qū)崿F(xiàn)同顧客交互還必要編寫有關(guān)代碼,使其嫩夠響應(yīng)由組合框發(fā)出&&事件消息。普通狀況下對此類控件&&事件響應(yīng)解決是通過ClassWizard類向?qū)硗戤?,但由于此處是通過CComboBox類Create()&&函數(shù)動態(tài)創(chuàng)立,因而只能手動添加&&事件響應(yīng)代碼。對于組合框,其比較慣用兩個&&事件消息是在選中一條記錄時發(fā)出CBN_SELCHANGE&&事件和在對組合框內(nèi)文字進行編輯時產(chǎn)生CBN_EDITCHANGE&&事件,下面就以這兩個&&事件為例對其進行解說,至于其她消息解決過程可參照其進行。一方面在頭文獻中給出消息響應(yīng)&&函數(shù)聲明://{{AFX_MSG(CAddToToolBarView)
afx_msgvoidOnSelchangeCombo();//響應(yīng)CBN_SELCHANGE消息&&函數(shù)
afx_msgvoidOnEditchangeCombo();//響應(yīng)CBN_EDITCHANGE消息&&函數(shù)
//}}AFX_MSG
然后在實現(xiàn)文獻中完畢消息映射:
BEGIN_MESSAGE_MAP(CAddToToolBarView,CView)
//{{AFX_MSG_MAP(CAddToToolBarView)
ON_CBN_SELCHANGE(IDC_COMBOX,OnSelchangeCombo)
ON_CBN_EDITCHANGE(IDC_COMBOX,OnEditchangeCombo)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
最后在消息解決&&函數(shù)中完畢對&&事件解決過程:
voidCAddToToolBarView::OnSelchangeCombo()
{
CStringcs;
CMainFrame*frame=(CMainFrame*)AfxGetMainWnd();
frame->m_combobox.GetLBText(frame->m_combobox.GetCurSel(),cs);
AfxMessageBox(cs);
}
voidCAddToToolBarView::OnEditchangeCombo()
{
CMainFrame*frame=(CMainFrame*)AfxGetMainWnd();
CStringcs;
frame->m_combobox.GetWindowText(cs);
}
從上述解決過程可以看出,對于在工具條上動態(tài)創(chuàng)立控件所發(fā)出&&事件響應(yīng)解決過程同手工解決消息響應(yīng)過程是非常相似。對于其她控件解決前面關(guān)于組合框控件在工具條上動態(tài)創(chuàng)立簡介是比較有代表性,其她原則控件解決過程與之相比并沒有什么太大變化,只是由于控件類別不同而在空間創(chuàng)立和對控件自身解決過程上有所不同,其思路則是完全一致。下面再給出編輯框在工具條創(chuàng)立過程。通過對這兩段代碼比較可以對控件在工具條動態(tài)創(chuàng)立過程有一種更好結(jié)識:……
//工具條m_wndToolBar創(chuàng)立代碼
……
//設(shè)立組合框?qū)挾?,四個參數(shù)依次為控件在工具條中索引號、ID號、風(fēng)格、寬度
m_wndToolBar.SetButtonInfo(9,IDC_EDIT,TBBS_SEPARATOR,160);
//得到組合框位置
m_wndToolBar.GetItemRect(9,&rect);
//創(chuàng)立組合框,四個參數(shù)依次為窗口風(fēng)格、組合框位置、父窗口、ID號
m_edit.Create(WS_VISIBLE|WS_TABSTOP,rect,&m_wndToolBar,IDC_EDIT);本文重要通過運用VC資源視圖來先可視化編輯原則控件在工具條中位置,然后再把原則控件作為工具條一種子窗口進行動態(tài)創(chuàng)立?;谶@種思想,可以很以便地在工具條中進行其她類似解決。本文所述代碼MicrosoftVisualC++6.0編譯通過。三、OpenGL繪圖OpenGL英文全稱是“OpenGraphicsLibrary”即“開放圖形程序接口”,它是計算機工業(yè)原則應(yīng)用程序接口,重要用于開發(fā)二維和三維圖形應(yīng)用程序。OpenGL是一套底層三維圖形API,之因此稱之為底層API,是由于它沒有提供幾何實體圖元,不能直接用以描述場景。但通過某些轉(zhuǎn)換程序,可以很以便將AutoCAD、3DS等圖形設(shè)計軟件制作DFX和3DS模型文獻轉(zhuǎn)換成OpenGL頂點數(shù)據(jù)。OpenGL是與硬件無關(guān)軟件接口,使用它圖形軟件生產(chǎn)廠商再不用為各種不同機型開發(fā)設(shè)計不同軟件,只要操作系統(tǒng)使用了OpenGL適配器就可以達到相似效果,它是一種開放圖形庫,當前在Windows、MacOS、OS/2、Unix/X-Windows等系統(tǒng)下均可使用,且僅在窗口有關(guān)某些(系統(tǒng)有關(guān))略有差別,因而具備良好可移植性,同步調(diào)用辦法簡潔明了,深受好評,應(yīng)用廣泛。OpenGL能在網(wǎng)絡(luò)環(huán)境下以客戶機/服務(wù)器模式工作,充分發(fā)揮集群運算威力,是專業(yè)圖形解決、科學(xué)計算等高品位應(yīng)用領(lǐng)域原則圖形庫。(一)OpenGL基本知識OpenGL是一種開放式圖形軟件開發(fā)包,它采用C語言風(fēng)格,提供大量函數(shù)來進行圖形方面解決,普通編程使用函數(shù)庫涉及:
OpenGL圖形庫函數(shù)以gl開頭,可以實現(xiàn)比較簡樸繪制功能,核心函數(shù)共115個。這些函數(shù)可以運營在當前任何主流操作系統(tǒng)中。繪制基本幾何圖元函數(shù)如繪制圖元函數(shù)glBegain()、glEnd()、glNormal*()、glVertex*()。矩陣操作、幾何變換和投影變換函數(shù)如矩陣入棧函數(shù)glPushMatrix()、矩陣出棧函數(shù)glPopMatrix()、裝載矩陣函數(shù)glLoadMatrix()、矩陣相乘函數(shù)glMultMatrix(),當前矩陣函數(shù)glMatrixMode()和矩陣原則化函數(shù)glLoadIdentity(),幾何變換函數(shù)glTranslate*()、glRotate*()和glScale*(),投影變換函數(shù)glOrtho()、glFrustum()和視口變換函數(shù)glViewport()等等。顏色、光照和材質(zhì)函數(shù)如設(shè)立顏色模式函數(shù)glColor*()、glIndex*(),設(shè)立光照效果函數(shù)glLight*()、glLightModel*()和設(shè)立材質(zhì)效果函數(shù)glMaterial()等等。顯示列表函數(shù)重要有創(chuàng)立、結(jié)束、生成、刪除和調(diào)用顯示列表函數(shù)glNewList()、glEndList()、glGenLists()、glCallList()和glDeleteLists()紋理映射函數(shù)重要有一維紋理函數(shù)glTexImage1D()、二維紋理函數(shù)glTexImage2D()、設(shè)立紋理參數(shù)、紋理環(huán)境和紋理坐標函數(shù)glTexParameter*()、glTexEnv*()和glTetCoord*()等。特殊效果函數(shù)融合函數(shù)glBlendFunc()、反走樣函數(shù)glHint()和霧化效果glFog*()。光柵化、象素操作函數(shù)如象素位置glRasterPos*()、線型寬度glLineWidth()、多邊形繪制模式glPolygonMode(),讀取象素glReadPixel()、復(fù)制象素glCopyPixel()等。選取與反饋函數(shù)重要有渲染模式glRenderMode()、選取緩沖區(qū)glSelectBuffer()和反饋緩沖區(qū)glFeedbackBuffer()等。初始化名字棧glInitNames()、壓入名字glPushName()),彈出名字glPopName(),替代棧頂名字glLoadName()曲線與曲面繪制函數(shù)生成曲線或曲面函數(shù)glMap*()、glMapGrid*(),求值器函數(shù)glEvalCoord*()glEvalMesh*()。狀態(tài)設(shè)立與查詢函數(shù)重要有g(shù)lGet*()、glEnable()、glGetError()等。OpenGL實用庫函數(shù)以glu開頭,其函數(shù)功能更高檔某些,如繪制復(fù)雜曲線曲面、高檔坐標變換、多邊形分割等,共有43個。這些函數(shù)可以運營在當前任何主流操作系統(tǒng)中。輔助紋理貼圖函數(shù)有g(shù)luScaleImage()、gluBuild1Dmipmaps()、gluBuild2Dmipmaps()。坐標轉(zhuǎn)換和投影變換函數(shù)定義投影方式函數(shù)gluPerspective()、gluOrtho2D()、gluLookAt(),拾取投影視景體函數(shù)gluPickMatrix(),投影矩陣計算gluProject()和gluUnProject()等等。多邊形鑲嵌工具有g(shù)luNewTess()、gluDeleteTess()、gluTessCallback()、gluBeginPolygon()gluTessVertex()、gluNextContour()、gluEndPolygon()等等。二次曲面繪制工具重要有繪制球面、錐面、柱面、圓環(huán)面gluNewQuadric()、gluSphere()、gluCylinder()、gluDisk()、gluPartialDisk()、gluDeleteQuadric()等等。非均勻有理B樣條繪制工具重要用來定義和繪制Nurbs曲線和曲面,涉及gluNewNurbsRenderer()、gluNurbsCurve()、gluBeginSurface()、gluEndSurface()、gluBeginCurve()、gluNurbsProperty()等函數(shù)。錯誤反饋工具獲取出錯信息字符串gluErrorString().OpenGL輔助庫函數(shù)以aux開頭,它們是某些特殊函數(shù),涉及簡樸窗口管理、輸入事件解決、某些復(fù)雜三維物體繪制等函數(shù),共有31個,此類函數(shù)由glaux.dll來負責(zé)解釋執(zhí)行。OpenGL中輔助庫不能在所有OpenGL平臺上運營,只能在Win32平臺下運營。在跨平臺編程實例和演示中,aux很大限度上已經(jīng)被glut庫取代。窗口初始化和退出函數(shù)auxInitDisplayMode()和auxInitPosition()。窗口解決和時間輸入函數(shù)auxReshapeFunc()、auxKeyFunc()和auxMouseFunc()。顏色索引裝入函數(shù)auxSetOneColor()。三維物體繪制函數(shù)涉及了兩種形式網(wǎng)狀體和實心體,如繪制立方體auxWireCube()和auxSolidCube()。這里以網(wǎng)狀體為例,長方體auxWireBox()、環(huán)形圓紋面auxWireTorus()、圓柱auxWireCylinder()、二十面體auxWireIcosahedron()、八面體auxWireOctahedron()、四周體auxWireTetrahedron()、十二面體auxWireDodecahedron()、圓錐體auxWireCone()和茶壺auxWireTeapot()。背景過程管理函數(shù)auxIdleFunc()。程序運營函數(shù)auxMainLoop()。OpenGL實用工具開發(fā)庫函數(shù)以glut開頭,它們提供更為復(fù)雜繪制功能,比aux功能強大,此類函數(shù)由glut.dll來負責(zé)解釋執(zhí)行。窗口操作函數(shù)窗口初始化、窗口大小、窗口位置等函數(shù)glutInit()glutInitDisplayMode()glutInitWindowSize()glutInitWindowPosition()等?;卣{(diào)函數(shù)響應(yīng)刷新消息、鍵盤消息、鼠標消息、定期器函數(shù)等,GlutDisplayFunc()glutPostRedisplay()glutReshapeFunc()glutTimerFunc()glutKeyboardFunc()glutMouseFunc()。創(chuàng)立復(fù)雜三維物體這些和aux庫函數(shù)功能相似。創(chuàng)立網(wǎng)狀體和實心體。如glutSolidSphere()、glutWireSphere()等。在此不再論述。菜單函數(shù)創(chuàng)立添加菜單函數(shù)GlutCreateMenu()、glutSetMenu()、glutAddMenuEntry()、glutAddSubMenu()和glutAttachMenu()。程序運營函數(shù)glutMainLoop()。Windows專用函數(shù)庫以wgl開頭,負責(zé)OpenGL與Windows窗口系統(tǒng)連接,共有6個。
Win32函數(shù)無專用前綴,事實上為API函數(shù),共5個,用來解決例如象素格式選取及雙緩沖等功能。
OpenGL提供函數(shù)普通是以客戶機/服務(wù)器模式來運營,即執(zhí)行繪制圖形功能應(yīng)用程序作為客戶機,而OpenGL函數(shù)庫(事實上是某些動態(tài)鏈接庫,例如opengl32.dll,glu.dll等)作為服務(wù)器,當應(yīng)用程序發(fā)出繪制祈求時,服務(wù)器負責(zé)對這些繪制祈求進行解釋,然后把這些解決過祈求發(fā)送給圖形顯示硬件,這樣就實現(xiàn)了繪圖目。此外由于它這種特有運營機制也實現(xiàn)了網(wǎng)絡(luò)透明性,即當應(yīng)用程序與核心圖形庫不在同一臺機器上時,其程序代碼完全跟它們在同一臺機器上同樣,節(jié)約了通訊開銷。
那么在Windows操作平臺下,如何使用OpenGL圖形庫函數(shù)來開發(fā)應(yīng)用程序呢?咱們懂得,使用GDI(圖形設(shè)備接口)開發(fā)應(yīng)用程序時,一方面需要獲得一種DeviceContext(設(shè)備描述表,簡稱DC),然后才干在這個DC下完畢繪圖工作,這一過程就類似于現(xiàn)實生活中紙和筆關(guān)系,DC就是紙,而象刷子、畫筆這樣GDI對象就是筆。從Windows內(nèi)部運營機制來分析,DC應(yīng)當理解為狀態(tài)保持器,就是它可以并且必要保存當前系統(tǒng)狀態(tài),這些狀態(tài)涉及:當前畫筆、刷子等GDI詳細類型(顏色、粗細等),當前調(diào)色板類型以及系統(tǒng)其她信息。當顧客開始在DC上進行繪制工作時,系統(tǒng)就會先查看DC中相應(yīng)當前狀態(tài)值,然后運用這些狀態(tài)值進行圖形繪制,如果顧客但愿變化當前狀態(tài)值,那么可以通過SelectObject這樣Win32函數(shù)來將指定狀態(tài)或者對象選入DC即可。
事實上基于OpenGL應(yīng)用程序也是這樣,只是這里不是直接在DC上進行繪制工作,而是通過RenderContext(渲染描述表或者繪制描述表,簡稱為RC)這樣一種橋梁在DC上進行繪制工作,對于程序來說事實上可以理解為就是在RC上繪制圖形。此外只要RC不被釋放(有效),那么就可以進行繪制工作;相比之下,DC卻需要不斷創(chuàng)立和釋放。
因此要使用OpenGL圖形庫進行圖形應(yīng)用開發(fā),一方面要獲得RC,然后要將其設(shè)立為“當前RC”,背面所有繪制工作都是在“當前RC”下面進行,直到“當前RC”無效為止。(二)VC環(huán)境下OpenGL程序框架在當前眾多Windows應(yīng)用程序開發(fā)工具中,微軟公司VC6.0已經(jīng)成為OpenGL圖形應(yīng)用首選開發(fā)工具。而要使用OpenGL圖形庫來開發(fā)2D/3D應(yīng)用程序,就必要解決程序框架問題。由前面簡介基本知識可以清晰看到,不能直接象運用GDI開發(fā)圖形程序那樣使用OpenGL,下面簡樸地簡介一下VC環(huán)境中單文檔應(yīng)用程序狀況下開發(fā)框架,其環(huán)節(jié)為:1.使用VC中MFCAppWizard創(chuàng)立應(yīng)用程序框架,在文檔和視圖類中,視圖負責(zé)窗口中內(nèi)容顯示,因而所有OpenGL繪制工作應(yīng)放在視圖類中進行;2.在stdafx.h中添加OpenGL頭文獻#include"gl/gl.h"#include"gl/glu.h"#include"gl/glaux.h"選取菜單ProjectSettings(Alt+F7)Link,在Object/librarymodules中添加OpenGL庫文獻opengl32.libglu32.libglaux.lib也可以在stdafx.h中用如下語句在程序中添加#pragmacomment(lib,"opengl32.lib") //OpenGL32連接庫#pragmacomment(lib,"glu32.lib") //GLu32連接庫#pragmacomment(lib,"glaux.lib") //GLaux連接庫3.
選取菜單ViewClassWizard(Ctrl+W),運用ClassWizard給視圖類添加如下成員函數(shù)響應(yīng)WM_CREATE消息OnCreate函數(shù);響應(yīng)WM_SIZE消息OnSize函數(shù);響應(yīng)WM_DESTROY消息OnDestroy函數(shù);響應(yīng)WM_ERASEBKGND消息OnEraseBKgnd函數(shù);重載OnInitialUpdate函數(shù)。并在視圖類頭文獻中添加如下兩公有變量成員 CDC*m_pDC; //OpenGL設(shè)備描述表 HGLRCm_hRC; //OpenGL繪制描述表4.一方面在視圖類PreCreateWindow函數(shù)內(nèi)設(shè)立窗口類型,為子窗口或兄弟窗口裁剪客戶區(qū),防止在窗口重疊時把圖形繪制到子窗口和兄弟窗口。實當代碼如下:cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;5.然后在視圖類OnCreate函數(shù)下面進行OpenGL初始化工作,這某些是此框架里最重要代碼,詳細涉及:獲取視圖設(shè)備描述表、設(shè)立適當象素格式和調(diào)色板、創(chuàng)立繪制描述表并將其設(shè)立為當前RC。這某些代碼基本上所有程序都一致,這一步完畢后即可進行圖形繪制工作。其實當代碼見下intCTerrainTestView::OnCreate(LPCREATESTRUCTlpCreateStruct)
{ m_pDC=newCClientDC(this);//獲取客戶區(qū)設(shè)備描述表 //初始化象素格式以及選用適當格式來創(chuàng)立RC PIXELFORMATDESCRIPTORpfd={ sizeof(PIXELFORMATDESCRIPTO
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 攪拌罐車租賃合同
- 三農(nóng)產(chǎn)品電商平臺運營與管理作業(yè)指導(dǎo)書
- 農(nóng)業(yè)投資項目評估與分析作業(yè)指導(dǎo)書
- 頒獎活動策劃書
- 2025年三明貨車上崗證理論模擬考試題庫
- 2025年松原貨運資格證考試
- 2025年臨夏貨運從業(yè)資格證模擬考試題
- 2025年婁底貨運運輸駕駛員從業(yè)資格證考試試題
- 電力設(shè)備采購合同(2篇)
- 2024年領(lǐng)軍高考生物一輪復(fù)習(xí)專題01走近細胞含解析
- T型引流管常見并發(fā)癥的預(yù)防及處理
- 2024-2025學(xué)年人教新版九年級(上)化學(xué)寒假作業(yè)(九)
- 內(nèi)業(yè)資料承包合同個人與公司的承包合同
- 【履職清單】2024版安全生產(chǎn)責(zé)任體系重點崗位履職清單
- 2022年全國醫(yī)學(xué)博士英語統(tǒng)一考試試題
- 學(xué)校工作總結(jié)和存在的不足及整改措施
- 《工業(yè)自動化技術(shù)》課件
- (績效考核)鉗工技能鑒定考核試題庫
- 2024年江蘇農(nóng)牧科技職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試題庫參考答案
- 知識圖譜與大模型融合實踐研究報告
- 215kWh工商業(yè)液冷儲能電池一體柜用戶手冊
評論
0/150
提交評論