版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、畢業(yè)設(shè)計(論文)一種矢量圖形工具的設(shè)計與實現(xiàn)論文作者姓名:申請學(xué)位專業(yè):申請學(xué)位類別:指導(dǎo)教師姓名(職稱):論文提交日期:一種矢量圖形工具的設(shè)計與實現(xiàn)摘 要矢量圖形系統(tǒng)的開發(fā)是利用vc+開發(fā)地理信息系統(tǒng)(gis系統(tǒng))的重點和難點。利用vc+進(jìn)行矢量圖形系統(tǒng)的開發(fā)主要是利用vc+的設(shè)備環(huán)境dc提供的功能進(jìn)行圖形繪制和采用面向?qū)ο蟮姆椒▉斫M織和管理矢量圖形數(shù)據(jù)。該論文分析了矢量圖形系統(tǒng)的基本結(jié)構(gòu),采用了面向?qū)ο蟮乃枷?,設(shè)計了圖形對象的類繼承層次,其中基類對象又派生出直線、圓弧(圓)和曲線,文本等類,給出了矢量圖形系統(tǒng)類的組織結(jié)構(gòu)。并且從整體功能結(jié)構(gòu)到單獨的類的具體實現(xiàn)和視圖的實現(xiàn),鼠標(biāo)交互繪制,圖
2、形操作,圖形選中、移動、刪除等各個方面開發(fā)實現(xiàn)了一個基本的矢量圖形工具系統(tǒng)。完成了處理點、線、圓、面、標(biāo)注文本等圖形元素的功能,并具有處理圖例(即圖形塊)的能力;具有相對完善的圖形操作功能,方便的圖形i/o功能,以及圖形移動、刪除的功能。關(guān)鍵詞:面向?qū)ο?;圖形操作;i/o;the design and realization of a vector graphics toolabstractthe vector graphics system is one of the most important and difficult parts for gis(geographical inform
3、ation system) development with vc+. the vector graphics system mainly includes implementing different drawing functions under the environment provided by vc + + 6.0, organizing and managing vector-based graphic data by means of object-based methods.the idea of object-oriented is introduced in this p
4、aper, the geographic elements in the system are classified into line, arc(circle) ,curve and text. the basic classes framework is proposed by analyzing the basic structure of the vector graphics system. a basic vector graphics tool system is designed and realized from the kind of organization, the v
5、iews realization, the mouses alternately draws up, the graphics operation, the graph selected, migration, deletion, and so on. different drawing functions are implemented, including spot, line, circle, surface and note text. the system has the ability of processing chart of symbols (namely graph blo
6、ck). the realizations of relative consummation graphics operation function and facilitates graph i/o function is given, as well as graph migration, deletion function.key words : object-oriented; graph operation; i/o;目 錄論文總頁數(shù):25頁1引言11.1課題背景及研究的目的和意義11.2矢量圖形系統(tǒng)11.3課題研究方法12總體設(shè)計思想22.1整體功能模塊的設(shè)計22.2功能模塊說明2
7、3矢量圖形結(jié)構(gòu)33.1基類的組織33.2視圖的實現(xiàn)53.2.1實際坐標(biāo)與邏輯坐標(biāo)的轉(zhuǎn)換53.2.2圖形元素的繪制功能63.3圖形操作方面63.3.1屏幕狀態(tài)的記錄63.3.2邊界矩形73.3.3點選的判斷和特殊顯示73.3.4圖形的移動93.4提高圖形重畫速度94矢量圖形工具系統(tǒng)的設(shè)計104.1類的實現(xiàn)104.2鼠標(biāo)交互繪制134.3重畫技術(shù)134.3.1圖形重畫134.3.2重畫上屏、首屏和顯示全圖154.4圖形移動和選中后操作174.4.1圖形點選功能174.4.2圖形移動205系統(tǒng)測試21結(jié) 論22參考文獻(xiàn)23致 謝24聲 明251 引言1.1 課題背景及研究的目的和意義gis技術(shù)已經(jīng)成
8、為it的重要組成部分。利用gis技術(shù)開發(fā)的以多媒體,網(wǎng)絡(luò)化,自動化為特色的信息處理,信息管理,指揮調(diào)度和決策支撐系統(tǒng),已經(jīng)在各領(lǐng)域發(fā)揮著重大作用。gis將普通管理信息系統(tǒng)(mis)與矢量圖形系統(tǒng)結(jié)合在了一起,克服了普通mis的局限性,大大提高了系統(tǒng)的直觀性和可操作性,同時提供了普通mis所不能解決的功能,如空間信息統(tǒng)計,空間信息計算,網(wǎng)絡(luò)分析等。矢量圖形系統(tǒng)是gis的重要組成部分,也是開發(fā)gis時的重點所在。在不同領(lǐng)域應(yīng)用gis,其需要的矢量圖形系統(tǒng)的功能是有差別的。建立一個城市信息管理gis時,要求矢量圖形系統(tǒng)要有豐富的圖形元素,豐富的線形,巨大的存儲容量,完善的輸入和輸出功能,強(qiáng)大的地圖編
9、輯功能,甚至需要三維顯示和處理能力;而有些管理型gis所需要的矢量圖形系統(tǒng),可能只需要具有簡單地處理二維普通圖形元素的功能。1.2 矢量圖形系統(tǒng)一個基本的矢量圖形系統(tǒng)一般需要如下的功能:1. 相對完善的圖形元素,應(yīng)具備處理點,線,面,網(wǎng)絡(luò)等圖形元素的能力,這類圖形系統(tǒng)在很大程度上能夠滿足普通的管理型gis的矢量圖形系統(tǒng)的要求。提高矢量顯示圖形的功能在很大程度上能夠改善矢量圖形界面的質(zhì)量。2. 相對完善的圖形操作功能。應(yīng)具備圖形的放縮,移動等各種操作功能。3. 相對完善的圖形輸入和輸出功能。應(yīng)具備鼠標(biāo)交互繪制功能,圖形數(shù)據(jù)交互輸入等功能;4. 定制和使用線形;5. 具有子圖填充功能;6. 具有圖
10、層,顏色,線形等的設(shè)置功能;7. 具有較大的存儲容量。處理圖形元素的容量應(yīng)該能夠達(dá)到一般實用要求。1.3 課題研究方法面向?qū)ο蟮某绦蛟O(shè)計,是目前程序設(shè)計的主流方法,在本設(shè)計中,將利用面向?qū)ο蟮某绦蛟O(shè)計和c+類的組織方法,組織建立一個基本矢量圖形的圖形元素類。組織實現(xiàn)的矢量圖形系統(tǒng),能夠處理點類、線類、面類、網(wǎng)絡(luò)點等類別的圖形元素,其中點類圖形元素有包括直線,圓,圓弧,多邊形,標(biāo)注文本等圖形元素,針對每類圖形元素組織建立起對其進(jìn)行管理的c+類,并把每個圖形元素作為一個獨立的對象來管理。本系統(tǒng)的開發(fā)要求采用vc開發(fā)平臺,實現(xiàn)一個用于gis的基本矢量圖形系統(tǒng)。因此,本次畢業(yè)設(shè)計在mfc appwiz
11、ard 產(chǎn)生的應(yīng)用程序draw的基礎(chǔ)上,具體組織一個基本矢量圖形系統(tǒng)的開發(fā)。該過程涉及與矢量圖形系統(tǒng)設(shè)計有關(guān)的類及其主要操作。從矢量圖形系統(tǒng)的類組織,文檔管理,視圖組織,圖形交互繪制,圖形操作,圖形選中,圖形旋轉(zhuǎn),圖形移動,圖形刪除等各個方面。2 總體設(shè)計思想2.1 整體功能模塊的設(shè)計矢量圖形工具需要實現(xiàn)的基本功能包括文件的打開保存、圖形的編輯、基本圖形元素的繪制、圖形的選擇和重畫,本課題設(shè)計的矢量圖形工具系統(tǒng)的功能圖如圖1。圖1 系統(tǒng)功能圖2.2 功能模塊說明 文件菜單菜單下拉選項有新建、打開、保存三個基本功能,可以新建新的客戶區(qū)、打開已經(jīng)存在的文件、保存希望保留的圖形。 編輯菜單下拉菜單里
12、面的撤消選項可以撤消上一步的操作,同時選中圖形后可以進(jìn)行復(fù)制和粘貼的操作。 鼠標(biāo)繪制利用鼠標(biāo)交互的功能把直線、圓、填充圓、圓弧、連續(xù)直線、多邊形區(qū)域和標(biāo)注文本的操作直觀化,只要選中你想要的操作就可以在窗口進(jìn)行相應(yīng)的繪制。 選中操作基本的矢量圖形系統(tǒng)應(yīng)該具有鼠標(biāo)點選圖形的功能,選中圖形后可以進(jìn)行簡單的拖動、刪除等基本功能。同樣的,可以選中也就可以放棄選中。被選中的圖形,會以特殊的方式顯示出來。 圖形操作圖形繪制過程中用來解決重畫、放大、擺動、顯示全屏的操作,這在圖形工具的系統(tǒng)中是很重要的。3 矢量圖形結(jié)構(gòu)3.1 基類的組織對各類圖形元素進(jìn)行分析,可以發(fā)現(xiàn)各類圖形元素具有一些相同的屬性和操作功能,
13、如圖形元素的顏色、線型線寬所在層等屬性和得到一個圖形元素是否做了刪除標(biāo)志等操作。把這些圖形元素中共性的東西(屬性和操作),組織存放在一個圖形元素基類(cdraw)中,具體的圖形元素由這個基類來派生。如圖2。圖2 基類的繼承class cdraw:public cobject /圖形元素基類cdraw,由cobject類派生protected:short m_colorpen; /筆色short m_colorbrush; /填充顏色float m_linewide; /線寬short m_linetype; /線型float m_xscale; /線型橫向參數(shù)short m_layer; /所
14、處圖層int m_id_only; /圖形元素唯一標(biāo)識號bool b_delete; /是否處于刪除狀態(tài)public:cdraw();cdraw (short colorpen,short colorbrush,float linewide,short linetype,float xscale,short layer,int id_only,bool delete)virtual cdraw();1) 點類圖形元素組織點類圖形元素,其基本特性是各個圖形相互獨立,且每個圖形元素具有有限個固定的特征點。直線的基類是cdraw,在直線類的構(gòu)造函數(shù)中,共有包括11個參數(shù),并利用前7個參數(shù)調(diào)用基類cd
15、raw的構(gòu)造函數(shù),對基類的成員變量進(jìn)行初始化,而在本身的構(gòu)造函數(shù)中對直線類cline自身的四個參數(shù)(直線的起點和終點)進(jìn)行了初始化。對圓類的創(chuàng)建方法與直線類cline類似,圓除了具有圖形元素的基本特征外,還有自身的幾何特性,可以用圓心和半徑作為特征參數(shù)表示圓的幾何特性。圓是圓弧的一個特例,當(dāng)圓弧的弧度等于2時就是圓。所以可以從一個圓類派生得到一個圓弧類。矢量圖形中可以有大量的標(biāo)注文本,標(biāo)注文本除了具有圖形元素的基本特性外,還具有位置、字體及標(biāo)注內(nèi)容等自身的信息。ctext類也有兩個構(gòu)造函數(shù),第二個構(gòu)造參數(shù)有多個參數(shù),并利用多個參數(shù)對類的成員變量進(jìn)行初始化。在構(gòu)造函數(shù)中,調(diào)用了基類cdraw的構(gòu)
16、造函數(shù)對基類cdraw的成員變量進(jìn)行初始化。2) 線類圖形元素組織線類圖形元素包括很多種,如連續(xù)直線、混合線、樹狀線等,在本設(shè)計中,以最簡單的連續(xù)直線為例進(jìn)行討論,對于其他類型線的實現(xiàn)方法,可根據(jù)連續(xù)直線的實現(xiàn)方法來開發(fā)。連續(xù)直線除了具有圖形元素基類所具有的屬性外,從圖形的幾何特征上,連續(xù)直線是由很多頂點組成的,而且頂點數(shù)目是不確定的。一條連續(xù)直線可能只有兩個頂點,也可能有幾千個頂點。所以,需要定義一個結(jié)構(gòu)來存儲連續(xù)直線的一個頂點坐標(biāo)。3) 面類圖形元素的組織面類圖形元素一般是由閉合線圍成的區(qū)域。根據(jù)圍成面的邊界不同,有不同形式的面,如圓形區(qū)域、橢圓形區(qū)域、復(fù)合線區(qū)域、多邊形區(qū)域等。最常用的面
17、是多邊形區(qū)域,其邊界由一條連續(xù)直線組成。因為另外各種類型面的邊界一般都可以用連續(xù)直線來近似描述,所以,本設(shè)計只討論多邊形區(qū)域的實現(xiàn)方法。在描述多邊形區(qū)域時,最主要的是要描述邊界頂點坐標(biāo)。描述面的邊界頂點坐標(biāo)時,有不同的描述方法,一種方法是將邊界由幾段連續(xù)直線來描述。另外一種描述方法是直接存儲區(qū)域的邊界頂點坐標(biāo),即把區(qū)域的整個邊界作為一條連續(xù)直線來存儲。這種方法的缺點是造成坐標(biāo)的重復(fù)存儲;優(yōu)點是具有較強(qiáng)的獨立性,不用考慮組成區(qū)域的連續(xù)直線段。在本設(shè)計中,采用直接存儲邊界坐標(biāo)的方式。用這種方式組織多邊形區(qū)域時,組織方式與連續(xù)直線類似。所以,可以由連續(xù)直線類cpline派生出一個cplinergn類
18、,來對多邊形區(qū)域進(jìn)行管理。3.2 視圖的實現(xiàn)3.2.1 實際坐標(biāo)與邏輯坐標(biāo)的轉(zhuǎn)換坐標(biāo)系取屏幕的左下角的點作為圖形屏幕的基點??蛻魠^(qū)的左下角的坐標(biāo)定義為(m_xstart,m_ystart),并確定一個變量blc作為邏輯坐標(biāo)和實際坐標(biāo)的比例關(guān)系。為了實現(xiàn)實際坐標(biāo)與邏輯坐標(biāo)的轉(zhuǎn)換,在視圖類cdrawdoc中定義如下的四個轉(zhuǎn)換函數(shù):public:void dptovp(float x, float y, int *x,int *y);void vptodp(int x, int y, float *x, float *y);int dltovl(float l);float vltodl(int l
19、);函數(shù)vptodp 用來將邏輯坐標(biāo)轉(zhuǎn)換成實際坐標(biāo),參數(shù)(x,y)是一個點的邏輯坐標(biāo),參數(shù)(*x ,*y)返回轉(zhuǎn)換后的實際坐標(biāo)值。函數(shù)dltovl用來將實際坐標(biāo)長度轉(zhuǎn)換成邏輯坐標(biāo)長度,參數(shù)l是一個實際坐標(biāo)長度,函數(shù)返回邏輯坐標(biāo)表示的長度值。為了在應(yīng)用程序draw的其他類中能夠使用四個坐標(biāo)轉(zhuǎn)換函數(shù),可以定義四個全局函數(shù)來實現(xiàn)轉(zhuǎn)換操作功能,在實現(xiàn)文件drawview.cpp中,定義四個全局函數(shù)如下:void dptovp(float x, float y, int *x, int *y);void vptodp(int x, int y, float *x, float *y );int dlto
20、vl(float l);int vltodl(int l);如果在某個實現(xiàn)文件中使用這四個全局轉(zhuǎn)換函數(shù),只需在這個實現(xiàn)文件中的開始處加入全局函數(shù)的外部引用:extern void dptovp (float x, float y, int *x, int *y);extern void vptodp (int x, int y, float *x, float *y);extern int dltovl (float l);extern int vltodl (int l);3.2.2 圖形元素的繪制功能利用虛函數(shù)實現(xiàn)各種圖形元素的繪制功能。在圖形元素基類cdraw中,抽象定義一個進(jìn)行繪制操作
21、的虛函數(shù)。因為在應(yīng)用程序 draw中,不用cdraw類直接來創(chuàng)建對象,所以可以將虛函數(shù)定義成純虛函數(shù):public:virtual void draw(cdc* pdc,int m_drawmode,int m_drawmodel,short backcolor)=0;在各種圖形元素類cline、ccircle、carc、ctext、cpline、cplinergn中,重載虛函數(shù)draw:public:virtual void draw(cdc* pdc , int m_drawmode, int m_drawmodel ,short backcolor);3.3 圖形操作方面3.3.1 屏幕
22、狀態(tài)的記錄對圖形屏幕進(jìn)行分析就會發(fā)現(xiàn),一個圖形屏幕是由三個參數(shù)來確定的:屏幕左下角原點的實際橫縱坐標(biāo)m_xstart、m_ystart和顯示比例blc,只要記錄下這三個參數(shù),就可以記錄下這一屏幕的狀態(tài)。為了實現(xiàn)記錄屏幕狀態(tài)的功能,在文檔類cdrawdoc中定義一個結(jié)構(gòu)數(shù)組來存儲歷史圖形屏幕。在cdrawdoc類中定義以下兩個變量:public:int m_currentscreen; /當(dāng)前屏幕的序號int m_maxscreen; /最多能存儲的屏幕數(shù)screenstruct* m_screen; /記錄屏幕參數(shù)的結(jié)構(gòu)數(shù)組typedef structfloat blc; /顯示比例float
23、 sx; /屏幕左下角橫坐標(biāo)float sy; /屏幕左下角縱坐標(biāo)screenstruct;在文檔類cdrawdoc中定義一個函數(shù),來完成存儲一個圖形屏幕狀態(tài)的操作功能:public:void addscreen(float startx, float starty, float blc);3.3.2 邊界矩形通過得到每一類圖形元素(如直線、連續(xù)直線)的邊界矩形,然后根據(jù)視圖屏幕的大?。ㄟ壿嬜鴺?biāo))進(jìn)行計算,得到屏幕的參數(shù)m_xstart,m_ystart,blc,從而實現(xiàn)顯示全圖的功能。在圖形元素的基類cdraw中定義一個虛函數(shù):public:virtual void getrect(floa
24、t *minx,float *miny,float *maxx,float *maxy)=0;函數(shù)getrect用來計算圖形元素的邊界矩形,(*minx ,*miny)和(*maxx ,*maxy )這四個指針參數(shù)用來返回邊界矩形的最小和最大坐標(biāo)。在由cdraw類派生的各個圖形元素類中重載虛函數(shù)getrect,即在各個類中加入以下定義代碼:public:virtual void getrect(float *minx,float *miny,float *maxx,float *maxy);3.3.3 點選的判斷和特殊顯示點選圖形元素時,問題的關(guān)鍵在于如何判斷一個點是否在一個圖形元素上,也就是
25、要確定每一類圖形元素的選中區(qū)域。1) 有效距離確定有效距離的方法是:首先確定在視圖屏幕上有效距離的大?。ㄈ鏽個像素),也就是說,不管在什么比例的情況下,選中的圖形元素都以在屏幕上與要選圖形元素的距離小于n個像素為標(biāo)準(zhǔn)。用像素為單位進(jìn)行計算時不方便,于是就求出n個像素在當(dāng)時顯示比例下的實際距離,這個實際距離就是點選圖形元素時的有效距離。只要鼠標(biāo)按中點到某圖形元素的實際距離小于這個有效距離,就算選中了這個圖形。有效距離的大小為:n*blc。/即n個像素的實際長度2) 各圖形元素選中的判斷 直線和連續(xù)直線因為直線是沒有寬度的,所以,直線的點選判斷實際上是要判斷一個點與一條直線的距離是否在一定的距離范
26、圍之內(nèi)。問題的實質(zhì)就是,如何確定這個判斷選中的距離范圍和怎樣計算一個點與一條直線的距離。為了完成計算點到直線距離的功能,定義了一個函數(shù)pointline在圖形元素基類cdraw中,使之在直線和連續(xù)直線類中都可以用到:public:float pointline(float xx,float yy,float x1,float y1,float x2,float y2); 圓和填充圓圓的選中區(qū)域非常簡單,如果有效距離為j1,計算得到的鼠標(biāo)按中點到圓心的距離為jl1,選中區(qū)域就是:|jl1-circle.r|jl;即按中點到圓的距離小于jl。對于填充圓,選中區(qū)域則是:jl1=jl; 圓弧圓弧的選中
27、區(qū)域同圓類似,首先要確定按中點是否在圓弧所在的圓上。即按中點到圓心的距離jl1符合:|jl1-circle.r|draw(pdc,0,0,m_bcolor);m_mapmode=pdc-setmapmode(1);這樣在以當(dāng)前的屏幕參數(shù)(m_xstart ,m_ystart ,blc)繪制圖形前,把視圖屏幕的左下角和右上角的實際坐標(biāo)計算出來。4 矢量圖形工具系統(tǒng)的設(shè)計4.1 類的實現(xiàn)1) 面向?qū)ο蟮奈臋n組織機(jī)制管理矢量圖形系統(tǒng)圖形數(shù)據(jù)的方法即文檔管理機(jī)制。在本設(shè)計的開發(fā)中,采用一套完全面向?qū)ο蟮奈臋n組織機(jī)制。這種機(jī)制就是通過圖形元素類創(chuàng)建很多圖形元素對象,每個圖形元素對象作為一個整體來組織存儲
28、空間的分配、存取等各種管理功能。然后通過建立一種存儲機(jī)制,來管理指向所有圖形元素對象的指針,達(dá)到管理所有圖形元素對象的目的。這種文檔管理機(jī)制具有組織簡單、結(jié)構(gòu)化和移植性好,以及比較容易利用vc+程序設(shè)計語言的開發(fā)功能等優(yōu)點。缺點是需要較大的內(nèi)存空間。管理一個矢量圖形系統(tǒng)文檔的思路是:每個圖形元素是圖形元素類創(chuàng)建的一個對象,在創(chuàng)建這個對象時得到指向這個對象的指針,建立一個對象指針數(shù)組來管理這些指針,以達(dá)到管理所有圖形元素對象的目的。在vc+下可以較容易地實現(xiàn)對指向圖形元素對象的指針的組織和管理。在mfc中有一個類模班ctypedptrarray,可以用它來創(chuàng)建一個管理類指針的對象。例如,可以定義
29、一個管理cline類指針的對象如下:ctypedptrarraym_linearray;其他各圖形類的管理類指針對象和cline類指針的對象類似:ctypedptrarraym_circlearray;ctypedptrarraym_arcarray;ctypedptrarraym_textarray;ctypedptrarraym_plinearray;ctypedptrarraym_plinergnarray;2) 增加圖形元素在應(yīng)用程序draw中增加一個圖形元素對象(如一條直線)時,需要進(jìn)行以下兩個步驟的操作:創(chuàng)建一個圖形元素對象,并用圖形元素的實際數(shù)據(jù)初始化這個圖形元素對象。如增加一條
30、直線時,需要創(chuàng)建一個cline對象,并用這條直線的實際數(shù)據(jù)(起終點、所在圖層、顏色等)初始化這個cline對象的成員變量。把指向新創(chuàng)建的圖形元素對象的指針,增加到文檔類中管理圖形元素對象指針的對象中。如增加一條cline對象后,需要把指向這個cline對象的指針增加到文檔類的m_linearray對象中。為了實現(xiàn)增加各類圖形元素的功能,在文檔類cdrawdoc 中定義幾個函數(shù),分別來完成增加各類圖形元素的操作功能cline* addline(short colorpen,short colorbrush,float linewide,short linetype,short layer,int
31、 id_only,float x1,float y1,float x2,float y2);ccircle* addcircle(short colorpen,short colorbrush,float linewide,short linetype,short layer,int id_only,float circlex,float circley,float circler,bool bfill);carc* addarc(short colorpen,short colorbrush,float linewide,short linetype,short layer,int id_o
32、nly,float circlex,float circley,float circler,float angle1,float angle2);ctext* addtext(short colorpen,short colorbrush,float linewide,short linetype,short layer,int id_only,float startx,float starty,float angle1,float angle2,float textheight,float textwide,float offwide,unsigned char textfont,int t
33、extlong,cstring text);cpline* addpline(short colorpen,short colorbrush,float linewide,short linetype,short layer,int id_only,int numble,pointstruct *pointlist);cplinergn* addplinergn(short colorpen,short colorbrush,float linewide,short linetype,short layer,int id_only,int numble,pointstruct *pointli
34、st,bool btransparent,bool bfill);這6個函數(shù)分別用來實現(xiàn)增加一條直線、一個圓、一個圓弧、一個標(biāo)注文本、一條連續(xù)直線和一個多邊形區(qū)域的功能。函數(shù)返回指向新增圖形元素對象的指針。3) 得到指向圖形元素對象的指針在一個矢量圖形系統(tǒng)中,有大量的圖形元素,指向圖形元素對象的指針被保存在文檔類對應(yīng)的cobarray 對象中。在系統(tǒng)的操作過程中,為了實現(xiàn)對圖形元素的各種操作功能,需要得到指向指定圖形元素對象的指針,為此,在文檔類cdrawdoc 中定義一個函數(shù)getgraph如下:public:cdraw* getgraph(short lb, int index );在實現(xiàn)
35、文件drawdoc.cpp中,加入函數(shù)的具體實現(xiàn)代碼。4) 刪除圖形元素對象為了能夠從cobarray 對象中刪除一個指定圖形元素對象指針,在文檔類cdrawdoc中定義一個成員函數(shù):public:void deletegraph(short lb, int index);在實現(xiàn)文件drawdoc.cpp中,加入函數(shù)的具體實現(xiàn)代碼。5) 得到各類圖形元素的數(shù)目為了能夠隨時得到文檔中各類圖形元素對象的數(shù)目,在文檔類cdrawdoc中,定義一個成員函數(shù)如下:public:int getgraphnumb(short lb);在實現(xiàn)文件drawdoc.cpp中,加入函數(shù)的具體實現(xiàn)代碼。6) 得到存儲
36、各類圖形元素cobarray 對象數(shù)組的最大下標(biāo)在對各個圖形元素類的所有圖形元素進(jìn)行操作時,需要得到存儲在各個cobarray對象中的最大數(shù)組下標(biāo),然后對各個數(shù)組項實現(xiàn)遍歷操作。為了得到存儲在各個cobarray 對象中的最大數(shù)組下標(biāo),在文檔類cdrawdoc中定義一個函數(shù)如下:public:int getgraphupperbound(short lb);在實現(xiàn)文件drawdoc.cpp中,加入函數(shù)的具體實現(xiàn)代碼。7) 得到某個識別號的圖形元素對象指針在cobarray 數(shù)組中的存放位置public:int getgraphindex(short lb,int id);在實現(xiàn)文件drawdo
37、c.cpp中,加入函數(shù)的具體實現(xiàn)代碼。8) 得到圖形元素的唯一識別號在應(yīng)用程序draw中,采用同類圖形元素具有惟一識別號的方法,即每一類別的圖形元素具有不同的成員變量m_id_only。為了得到每類圖形元素的惟一識別號,在文檔類cdrawdoc中定義一個成員函數(shù):public:int getgraphid(short lb);函數(shù)getgraphid用來得到要增加的各類圖形元素的惟一識別號,參數(shù)lb用來表示圖形類別。在實現(xiàn)文件drawdoc.cpp中,加入函數(shù)的實現(xiàn)代碼。4.2 鼠標(biāo)交互繪制vc+提供了足夠的窗口消息和已經(jīng)保護(hù)的消息處理函數(shù)解決這個問題。在應(yīng)用程序draw中實現(xiàn)鼠標(biāo)交互繪制圖形
38、元素時,將主要用到以下三個鼠標(biāo)操作:鼠標(biāo)移動:onmousemove(uint nflags ,cpoint point) wm_mousemove按下左鍵: onlbuttondown(uint nflags.cpoint point) wm_lbuttond按下右鍵:onrbuttondown(uint nflags.cpoint point) wm_rbuttondown在用鼠標(biāo)交互繪制一個圖形元素時,在已經(jīng)開始繪圖的情況下,不希望還能進(jìn)行別的操作,以避免造成系統(tǒng)流程和變量初始化等方面的錯誤。vc+提供了兩個成員函數(shù)來滿足以上的功能需求:cwnd:setcapture(); /捕捉所有的
39、鼠標(biāo)輸入cwnd:releasecapture(); /釋放鼠標(biāo)捕捉在用鼠標(biāo)交互繪制圖形元素時,為了直觀的看到所繪制的圖形,一般采用拖動圖形的方法。用鼠標(biāo)交互繪制一個圖形元素后,要在屏幕上馬上顯示出這個圖形元素的實際形態(tài),必須將圖形元素以實際的形態(tài)重畫。因為在vc+的r2_not繪制模式下,線條不是彩色的,拖動的圖形都不是用圖形元素的實際顏色。必須對圖形元素以實際形態(tài)進(jìn)行重畫。在矢量圖形系統(tǒng)設(shè)計中,一般采用cclientdc對象,在交互繪制圖形元素操作完成后,即時在視圖中重畫這個新增的圖形元素。4.3 重畫技術(shù)4.3.1 圖形重畫在很多情況下,需要將當(dāng)前視圖屏幕全屏重畫。所謂圖形重畫,就是把當(dāng)
40、前視圖屏幕重新繪制一次,實際上也就是讓視圖類的函數(shù)ondraw(cdc* pdc)重新執(zhí)行一次。根據(jù)需要重畫的區(qū)域的不同,圖形重畫可以分為全屏重畫和局部重畫。1. 全屏重畫全屏重畫有兩種方式:在視圖類函數(shù)的實現(xiàn)代碼中,用以下代碼來激活重畫機(jī)制:cdrawdoc* pdoc=getdocument();pdoc-updateallviews(this);函數(shù)updateallviews使屬于當(dāng)前文檔對象的所有視圖重畫。如果應(yīng)用程序采用的是單文檔結(jié)構(gòu),系統(tǒng)只有一個視圖,執(zhí)行此命令時使這個視圖失效并重畫,即激發(fā)視圖類的ondraw執(zhí)行;如果應(yīng)用程序采用的是多文檔結(jié)構(gòu),一個文檔對象可能具有多個視圖,u
41、pdateallviews可使屬于這個文檔對象的所有視圖都重新繪制。在視圖類函數(shù)的實現(xiàn)代碼中,用以下代碼激活重畫機(jī)制:invalidate();invalidate函數(shù)使當(dāng)前視圖屏幕的客戶區(qū)失效,從而激活圖形重畫。invalidate函數(shù)與updateallviews函數(shù)的不同點是,它只能使當(dāng)前視圖重畫,而與其同文檔的其他視圖并不重畫。要實現(xiàn)圖形重畫功能,需要對視圖類cdrawview的ongraphredraw函數(shù)進(jìn)行修改。修改后的代碼如下:void cdrawview:ongraphredraw()cdrawdoc* pdoc=getdocument();pdoc-updateallvie
42、ws(this);invalidate();ongraphredraw函數(shù)首先得到指向當(dāng)前文檔對象的指針,然后調(diào)用updateallviews函數(shù)重畫此文檔對象所有的視圖,參數(shù)this是指向當(dāng)前視圖對象的指針。2. 局部重畫在很多情況下,往往只希望將當(dāng)前視圖屏幕的一部分區(qū)域進(jìn)行重畫,即局部重畫。在vc+中,以下兩個函數(shù)可以完成此功能。1) invalidaterect函數(shù)的定義為:void invalidaterect(lpcrect lprect ,bool berase=true);函數(shù)invalidaterect 可使視圖中一個指定的矩形區(qū)域重畫。這個函數(shù)的調(diào)用方法與函數(shù)invalida
43、te 類似。參數(shù)lprect 中存儲著視圖中需要重畫的區(qū)域,參數(shù)berase用于指定當(dāng)區(qū)域重畫時,背景是否擦除,當(dāng)berase為true時,背景被擦除,當(dāng)berase為false,背景保持不變。2) invalidatergn函數(shù)invalidatergn函數(shù)的定義為:void invalidatergn(crgn* prgn, bool berase=true);函數(shù)invalidatergn的功能和使用方法與函數(shù)invalidatergn類似,惟一不同的是函數(shù)invalidatergn是使一個指定的區(qū)域重畫。參數(shù)prgn是指向一個crgn對象的指針。invalidatergn函數(shù)可以使一個
44、已經(jīng)初始化的crgn對象所指定的區(qū)域重畫。以下代碼可使crgn對象rgn指定的區(qū)域重畫:invalidatergn(&rgn);4.3.2 重畫上屏、首屏和顯示全圖1) 重畫上屏要實現(xiàn)重畫上屏的操作功能,只需把m_currentscreen的值減去1,從結(jié)構(gòu)數(shù)組m_screen中取出屏幕參數(shù)重畫圖形即可。在實現(xiàn)文件drawview.cpp中,將“重畫上屏”菜單項的消息處理函數(shù)ongraphup的實現(xiàn)代碼修改如下:void cdrawview:ongraphup()cdrawdoc* pdoc=(cdrawdoc*)getdocument();if(pdoc-m_currentscreen0)/
45、如果當(dāng)前不是首屏,當(dāng)前圖形屏幕序號減1pdoc-m_currentscreen-;/得到上一屏幕的圖形參數(shù)并重畫圖形m_xstart=p_screenpdoc-m_currentscreen.sx;m_ystart=p_screenpdoc-m_currentscreen.sy;blc=p_screenpdoc-m_currentscreen.blc;invalidate(); /重畫圖形p_screen是cdrawview類中定義的指向文檔對象中的結(jié)構(gòu)數(shù)組m_screen的指針,它在視圖類cdrawview中定義:screenstruct *p_screen;在實現(xiàn)文件drawview.cp
46、p中,在重載的虛函數(shù)onactiveview中對p_screen進(jìn)行初始化,將它指向當(dāng)前文檔對象中的結(jié)構(gòu)數(shù)組m_screen:void cdrawview:onactivateview(bool bactivate, cview* pactivateview, cview* pdeactiveview) p_view=this;cdrawdoc* pdoc=(cdrawdoc*)getdocument();p_screen=pdoc-m_screen;cview:onactivateview(bactivate, pactivateview, pdeactiveview);2) 重畫首屏對于重
47、畫首屏的功能來說,只要取出存儲在結(jié)構(gòu)數(shù)組m_screen中的首屏參數(shù),并對視圖重畫即可。修改實現(xiàn)文件drawview.cpp中的消息處理函數(shù)ongraphfirst,得到實現(xiàn)代碼如下:void cdrawview:ongraphfirst() /重畫首屏/ todo: add your command handler code herecdrawdoc* pdoc=getdocument();if(pdoc-m_currentscreen=0)return ;m_xstart=p_screen0.sx;m_ystart=p_screen0.sy;blc=p_screen0.blc;pdoc-a
48、ddscreen(m_xstart,m_ystart,blc);invalidate();3) 顯示全圖得到邊界矩形在矢量圖形系統(tǒng)中,有一種情況是,圖形中所有的圖形元素都在視圖屏幕的一個角上,只占圖幅的一小部分。這是就需要一個操作功能,調(diào)整視圖屏幕左下角原點的實際坐標(biāo)(m_xstart ,m_ystart)和顯示比例blc,使所有的圖形元素正好能夠繪制到視圖屏幕中(在屏幕上留有一部分邊界區(qū)域),顯示全圖功能就是為完成此功能而設(shè)置的。實現(xiàn)顯示全圖功能的思路是,通過得到每一類圖形元素(如直線、連續(xù)直線)的邊界矩形,然后根據(jù)視圖屏幕的大?。ㄟ壿嬜鴺?biāo))進(jìn)行計算,得到屏幕的參數(shù)m_xstart,m_ys
49、tart,blc。所以,解決問題的關(guān)鍵在于得到各類圖形元素的邊界矩形。在3.3.2節(jié)中我們已經(jīng)介紹了邊界矩形的實現(xiàn)方法,把所有圖形元素的邊界矩形坐標(biāo)進(jìn)行比較,就可以得到所有圖形元素的邊界矩形。為了實現(xiàn)這個功能,在文檔類cdrawdoc中定義一個函數(shù):public:bool getrect(float *m_xmin,float *m_ymin,float *m_xmax,float *m_ymax);指針參數(shù)用來返回邊界矩形的最小和最大坐標(biāo),當(dāng)能計算得到邊界矩形時,函數(shù)返回true,否則,函數(shù)返回false。在實現(xiàn)文件drawdoc.cpp中,加入這個函數(shù)的實現(xiàn)代碼。在函數(shù)getrect中,首先對記錄最小值和最大值的變量初始化,然后對所有的直線連續(xù)直線圓圓弧標(biāo)注文本多邊形區(qū)域網(wǎng)絡(luò)點等類圖形元素進(jìn)行循環(huán),得到每個圖形元素的邊界矩形,并比較運算得到所有圖形元素的邊界矩形。當(dāng)至少有一個圖形元素時,函數(shù)返回true,沒有任何圖形元素時,函數(shù)返回false。顯示全屏在得到所有圖形元素的邊界矩形后,就可以調(diào)整視圖屏幕的基點和比例,使當(dāng)前視圖正好能夠繪制下所有的圖形元素。在實現(xiàn)文件drawview.cpp中,對菜單項“重畫全屏”的消息處理函數(shù)ongraphall進(jìn)行修改:void cdrawview:ongraphall()
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 34912-2024工業(yè)鍋爐系統(tǒng)節(jié)能設(shè)計指南
- 果園經(jīng)營權(quán)轉(zhuǎn)讓合同模板
- 個人與公司間借款協(xié)議書范本2024年
- 婚前財產(chǎn)協(xié)議書公證流程
- 展覽延期協(xié)議書范本
- 自由職業(yè)者合作工作室合伙協(xié)議
- 房屋中介服務(wù)協(xié)議書樣式
- 設(shè)計合同補充協(xié)議范本
- 瀝青運輸合同模板
- 建筑施工合同補充協(xié)議模板
- 超星爾雅學(xué)習(xí)通《媒體創(chuàng)意經(jīng)濟(jì)玩轉(zhuǎn)互聯(lián)網(wǎng)時代》章節(jié)測試答案
- KF思維技術(shù)-在合作中解決問題與決策完整課件
- 2023年傳染病防治知識考試試題及答案
- Windows server WEB服務(wù)器搭建與應(yīng)用說課公開課一等獎省優(yōu)質(zhì)課大賽獲獎?wù)n件
- 高考作文寫作句子素材:動漫臺詞(附適用主題與示例)
- 主題班會-同學(xué)情教學(xué)課件
- 泌尿系統(tǒng)完整結(jié)構(gòu)培訓(xùn)課件
- (中職)Office 辦公軟件應(yīng)用W11-3詩詞-實訓(xùn)任務(wù)+評分標(biāo)準(zhǔn)
- 規(guī)培體表腫物切除術(shù)
- 履帶吊使用安全技術(shù)規(guī)程
- 漢語詞性專題練習(xí)(附答案)
評論
0/150
提交評論