版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 一種矢量圖形工具的設(shè)計(jì)與實(shí)現(xiàn)</p><p><b> 摘 要</b></p><p> 矢量圖形系統(tǒng)的開(kāi)發(fā)是利用VC++開(kāi)發(fā)地理信息系統(tǒng)(GIS系統(tǒng))的重點(diǎn)和難點(diǎn)。利用VC++進(jìn)行矢量圖形系統(tǒng)的開(kāi)發(fā)主要是利用VC++的設(shè)備環(huán)境DC提供的功能進(jìn)行圖形繪制和采用面向?qū)ο蟮姆椒▉?lái)組織和管理矢量圖形數(shù)據(jù)。</p><p>
2、 該論文分析了矢量圖形系統(tǒng)的基本結(jié)構(gòu),采用了面向?qū)ο蟮乃枷?,設(shè)計(jì)了圖形對(duì)象的類繼承層次,其中基類對(duì)象又派生出直線、圓弧(圓)和曲線,文本等類,給出了矢量圖形系統(tǒng)類的組織結(jié)構(gòu)。并且從整體功能結(jié)構(gòu)到單獨(dú)的類的具體實(shí)現(xiàn)和視圖的實(shí)現(xiàn),鼠標(biāo)交互繪制,圖形操作,圖形選中、移動(dòng)、刪除等各個(gè)方面開(kāi)發(fā)實(shí)現(xiàn)了一個(gè)基本的矢量圖形工具系統(tǒng)。完成了處理點(diǎn)、線、圓、面、標(biāo)注文本等圖形元素的功能,并具有處理圖例(即圖形塊)的能力;具有相對(duì)完善的圖形操作功能,方便的
3、圖形I/O功能,以及圖形移動(dòng)、刪除的功能。</p><p> 關(guān)鍵詞:面向?qū)ο?;圖形操作;I/O;</p><p> The Design and Realization of a Vector Graphics Tool</p><p><b> Abstract</b></p><p> The Vector
4、 Graphics system is one of the most important and difficult parts for GIS(Geographical Information System) development with VC++. The Vector Graphics system mainly includes implementing different drawing functions under
5、the environment provided by VC + + 6.0, organizing and managing vector-based graphic data by means of object-based methods.</p><p> The idea of object-oriented is introduced in this paper, the geographic el
6、ements 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
7、designed and realized from the kind of organization, the view’s realization, the mouse’s alternately draws up, the graphics operation, the graph selected, migration, deletion, and so on. Different drawing f</p>&l
8、t;p> Key words : Object-oriented; Graph operation; I/O;</p><p><b> 目 錄</b></p><p><b> 論文總頁(yè)數(shù):25頁(yè)</b></p><p><b> 1引言1</b></p><
9、;p> 1.1課題背景及研究的目的和意義1</p><p> 1.2矢量圖形系統(tǒng)1</p><p> 1.3課題研究方法1</p><p> 2總體設(shè)計(jì)思想2</p><p> 2.1整體功能模塊的設(shè)計(jì)2</p><p> 2.2功能模塊說(shuō)明2</p><p
10、> 3矢量圖形結(jié)構(gòu)3</p><p> 3.1基類的組織3</p><p> 3.2視圖的實(shí)現(xiàn)5</p><p> 3.2.1實(shí)際坐標(biāo)與邏輯坐標(biāo)的轉(zhuǎn)換5</p><p> 3.2.2圖形元素的繪制功能6</p><p> 3.3圖形操作方面6</p><p&
11、gt; 3.3.1屏幕狀態(tài)的記錄6</p><p> 3.3.2邊界矩形7</p><p> 3.3.3點(diǎn)選的判斷和特殊顯示7</p><p> 3.3.4圖形的移動(dòng)9</p><p> 3.4提高圖形重畫(huà)速度9</p><p> 4矢量圖形工具系統(tǒng)的設(shè)計(jì)10</p>
12、<p> 4.1類的實(shí)現(xiàn)10</p><p> 4.2鼠標(biāo)交互繪制13</p><p> 4.3重畫(huà)技術(shù)13</p><p> 4.3.1圖形重畫(huà)13</p><p> 4.3.2重畫(huà)上屏、首屏和顯示全圖15</p><p> 4.4圖形移動(dòng)和選中后操作17</p&g
13、t;<p> 4.4.1圖形點(diǎn)選功能17</p><p> 4.4.2圖形移動(dòng)20</p><p><b> 5系統(tǒng)測(cè)試21</b></p><p><b> 結(jié) 論22</b></p><p><b> 參考文獻(xiàn)23</b><
14、;/p><p><b> 致 謝24</b></p><p><b> 聲 明25</b></p><p><b> 引言</b></p><p> 課題背景及研究的目的和意義</p><p> GIS技術(shù)已經(jīng)成為IT的重要組成部分
15、。利用GIS技術(shù)開(kāi)發(fā)的以多媒體,網(wǎng)絡(luò)化,自動(dòng)化為特色的信息處理,信息管理,指揮調(diào)度和決策支撐系統(tǒng),已經(jīng)在各領(lǐng)域發(fā)揮著重大作用。</p><p> GIS將普通管理信息系統(tǒng)(MIS)與矢量圖形系統(tǒng)結(jié)合在了一起,克服了普通MIS的局限性,大大提高了系統(tǒng)的直觀性和可操作性,同時(shí)提供了普通MIS所不能解決的功能,如空間信息統(tǒng)計(jì),空間信息計(jì)算,網(wǎng)絡(luò)分析等。</p><p> 矢量圖形系統(tǒng)是GIS
16、的重要組成部分,也是開(kāi)發(fā)GIS時(shí)的重點(diǎn)所在。在不同領(lǐng)域應(yīng)用GIS,其需要的矢量圖形系統(tǒng)的功能是有差別的。建立一個(gè)城市信息管理GIS時(shí),要求矢量圖形系統(tǒng)要有豐富的圖形元素,豐富的線形,巨大的存儲(chǔ)容量,完善的輸入和輸出功能,強(qiáng)大的地圖編輯功能,甚至需要三維顯示和處理能力;而有些管理型GIS所需要的矢量圖形系統(tǒng),可能只需要具有簡(jiǎn)單地處理二維普通圖形元素的功能。</p><p><b> 矢量圖形系統(tǒng)<
17、/b></p><p> 一個(gè)基本的矢量圖形系統(tǒng)一般需要如下的功能:</p><p> 相對(duì)完善的圖形元素,應(yīng)具備處理點(diǎn),線,面,網(wǎng)絡(luò)等圖形元素的能力,這類圖形系統(tǒng)在很大程度上能夠滿足普通的管理型GIS的矢量圖形系統(tǒng)的要求。提高矢量顯示圖形的功能在很大程度上能夠改善矢量圖形界面的質(zhì)量。</p><p> 相對(duì)完善的圖形操作功能。應(yīng)具備圖形的放縮,移動(dòng)等各
18、種操作功能。</p><p> 相對(duì)完善的圖形輸入和輸出功能。應(yīng)具備鼠標(biāo)交互繪制功能,圖形數(shù)據(jù)交互輸入等功能;</p><p><b> 定制和使用線形;</b></p><p><b> 具有子圖填充功能;</b></p><p> 具有圖層,顏色,線形等的設(shè)置功能;</p>
19、<p> 具有較大的存儲(chǔ)容量。處理圖形元素的容量應(yīng)該能夠達(dá)到一般實(shí)用要求。</p><p><b> 課題研究方法</b></p><p> 面向?qū)ο蟮某绦蛟O(shè)計(jì),是目前程序設(shè)計(jì)的主流方法,在本設(shè)計(jì)中,將利用面向?qū)ο蟮某绦蛟O(shè)計(jì)和C++類的組織方法,組織建立一個(gè)基本矢量圖形的圖形元素類。組織實(shí)現(xiàn)的矢量圖形系統(tǒng),能夠處理點(diǎn)類、線類、面類、網(wǎng)絡(luò)點(diǎn)等類別的圖形
20、元素,其中點(diǎn)類圖形元素有包括直線,圓,圓弧,多邊形,標(biāo)注文本等圖形元素,針對(duì)每類圖形元素組織建立起對(duì)其進(jìn)行管理的C++類,并把每個(gè)圖形元素作為一個(gè)獨(dú)立的對(duì)象來(lái)管理。</p><p> 本系統(tǒng)的開(kāi)發(fā)要求采用VC開(kāi)發(fā)平臺(tái),實(shí)現(xiàn)一個(gè)用于GIS的基本矢量圖形系統(tǒng)。因此,本次畢業(yè)設(shè)計(jì)在MFC AppWizard 產(chǎn)生的應(yīng)用程序Draw的基礎(chǔ)上,具體組織一個(gè)基本矢量圖形系統(tǒng)的開(kāi)發(fā)。該過(guò)程涉及與矢量圖形系統(tǒng)設(shè)計(jì)有關(guān)的類及其主
21、要操作。從矢量圖形系統(tǒng)的類組織,文檔管理,視圖組織,圖形交互繪制,圖形操作,圖形選中,圖形旋轉(zhuǎn),圖形移動(dòng),圖形刪除等各個(gè)方面。</p><p><b> 總體設(shè)計(jì)思想</b></p><p><b> 整體功能模塊的設(shè)計(jì)</b></p><p> 矢量圖形工具需要實(shí)現(xiàn)的基本功能包括文件的打開(kāi)保存、圖形的編輯、基本圖形
22、元素的繪制、圖形的選擇和重畫(huà),本課題設(shè)計(jì)的矢量圖形工具系統(tǒng)的功能圖如圖1。</p><p><b> 圖1 系統(tǒng)功能圖</b></p><p><b> 功能模塊說(shuō)明</b></p><p><b> 文件菜單</b></p><p> 菜單下拉選項(xiàng)有新建、打開(kāi)、保存三
23、個(gè)基本功能,可以新建新的客戶區(qū)、打開(kāi)已經(jīng)存在的文件、保存希望保留的圖形。</p><p><b> 編輯菜單</b></p><p> 下拉菜單里面的撤消選項(xiàng)可以撤消上一步的操作,同時(shí)選中圖形后可以進(jìn)行復(fù)制和粘貼的操作。</p><p><b> 鼠標(biāo)繪制</b></p><p> 利用鼠標(biāo)
24、交互的功能把直線、圓、填充圓、圓弧、連續(xù)直線、多邊形區(qū)域和標(biāo)注文本的操作直觀化,只要選中你想要的操作就可以在窗口進(jìn)行相應(yīng)的繪制。</p><p><b> 選中操作</b></p><p> 基本的矢量圖形系統(tǒng)應(yīng)該具有鼠標(biāo)點(diǎn)選圖形的功能,選中圖形后可以進(jìn)行簡(jiǎn)單的拖動(dòng)、刪除等基本功能。同樣的,可以選中也就可以放棄選中。被選中的圖形,會(huì)以特殊的方式顯示出來(lái)。</
25、p><p><b> 圖形操作</b></p><p> 圖形繪制過(guò)程中用來(lái)解決重畫(huà)、放大、擺動(dòng)、顯示全屏的操作,這在圖形工具的系統(tǒng)中是很重要的。</p><p><b> 矢量圖形結(jié)構(gòu)</b></p><p><b> 基類的組織</b></p><p
26、> 對(duì)各類圖形元素進(jìn)行分析,可以發(fā)現(xiàn)各類圖形元素具有一些相同的屬性和操作功能,如圖形元素的顏色、線型線寬所在層等屬性和得到一個(gè)圖形元素是否做了刪除標(biāo)志等操作。把這些圖形元素中共性的東西(屬性和操作),組織存放在一個(gè)圖形元素基類(CDraw)中,具體的圖形元素由這個(gè)基類來(lái)派生。如圖2。</p><p><b> 圖2 基類的繼承</b></p><p> c
27、lass CDraw:public CObject //圖形元素基類CDraw,由CObject類派生</p><p><b> {</b></p><p> protected:</p><p> short m_ColorPen; //筆色</p><p> short m_ColorBrush; //
28、填充顏色</p><p> float m_LineWide; //線寬</p><p> short m_LineType; //線型</p><p> float m_xScale; //線型橫向參數(shù)</p><p> short m_Layer; //所處圖層</p><p> int m_id
29、_only; //圖形元素唯一標(biāo)識(shí)號(hào)</p><p> BOOL b_Delete; //是否處于刪除狀態(tài)</p><p><b> public:</b></p><p><b> CDraw();</b></p><p> CDraw (short ColorPen,short Co
30、lorBrush,float LineWide,short LineType,float xScale,short Layer,int id_only,BOOL Delete)</p><p> virtual ~CDraw();</p><p><b> };</b></p><p><b> 點(diǎn)類圖形元素組織</b&g
31、t;</p><p> 點(diǎn)類圖形元素,其基本特性是各個(gè)圖形相互獨(dú)立,且每個(gè)圖形元素具有有限個(gè)固定的特征點(diǎn)。</p><p> 直線的基類是CDraw,在直線類的構(gòu)造函數(shù)中,共有包括11個(gè)參數(shù),并利用前7個(gè)參數(shù)調(diào)用基類CDraw的構(gòu)造函數(shù),對(duì)基類的成員變量進(jìn)行初始化,而在本身的構(gòu)造函數(shù)中對(duì)直線類CLine自身的四個(gè)參數(shù)(直線的起點(diǎn)和終點(diǎn))進(jìn)行了初始化。</p><p&
32、gt; 對(duì)圓類的創(chuàng)建方法與直線類CLine類似,圓除了具有圖形元素的基本特征外,還有自身的幾何特性,可以用圓心和半徑作為特征參數(shù)表示圓的幾何特性。</p><p> 圓是圓弧的一個(gè)特例,當(dāng)圓弧的弧度等于2時(shí)就是圓。所以可以從一個(gè)圓類派生得到一個(gè)圓弧類。</p><p> 矢量圖形中可以有大量的標(biāo)注文本,標(biāo)注文本除了具有圖形元素的基本特性外,還具有位置、字體及標(biāo)注內(nèi)容等自身的信息。CT
33、ext類也有兩個(gè)構(gòu)造函數(shù),第二個(gè)構(gòu)造參數(shù)有多個(gè)參數(shù),并利用多個(gè)參數(shù)對(duì)類的成員變量進(jìn)行初始化。在構(gòu)造函數(shù)中,調(diào)用了基類CDraw的構(gòu)造函數(shù)對(duì)基類CDraw的成員變量進(jìn)行初始化。</p><p><b> 線類圖形元素組織</b></p><p> 線類圖形元素包括很多種,如連續(xù)直線、混合線、樹(shù)狀線等,在本設(shè)計(jì)中,以最簡(jiǎn)單的連續(xù)直線為例進(jìn)行討論,對(duì)于其他類型線的實(shí)現(xiàn)方
34、法,可根據(jù)連續(xù)直線的實(shí)現(xiàn)方法來(lái)開(kāi)發(fā)。</p><p> 連續(xù)直線除了具有圖形元素基類所具有的屬性外,從圖形的幾何特征上,連續(xù)直線是由很多頂點(diǎn)組成的,而且頂點(diǎn)數(shù)目是不確定的。一條連續(xù)直線可能只有兩個(gè)頂點(diǎn),也可能有幾千個(gè)頂點(diǎn)。所以,需要定義一個(gè)結(jié)構(gòu)來(lái)存儲(chǔ)連續(xù)直線的一個(gè)頂點(diǎn)坐標(biāo)。</p><p><b> 面類圖形元素的組織</b></p><p&g
35、t; 面類圖形元素一般是由閉合線圍成的區(qū)域。根據(jù)圍成面的邊界不同,有不同形式的面,如圓形區(qū)域、橢圓形區(qū)域、復(fù)合線區(qū)域、多邊形區(qū)域等。最常用的面是多邊形區(qū)域,其邊界由一條連續(xù)直線組成。因?yàn)榱硗飧鞣N類型面的邊界一般都可以用連續(xù)直線來(lái)近似描述,所以,本設(shè)計(jì)只討論多邊形區(qū)域的實(shí)現(xiàn)方法。</p><p> 在描述多邊形區(qū)域時(shí),最主要的是要描述邊界頂點(diǎn)坐標(biāo)。描述面的邊界頂點(diǎn)坐標(biāo)時(shí),有不同的描述方法,一種方法是將邊界由幾段
36、連續(xù)直線來(lái)描述。</p><p> 另外一種描述方法是直接存儲(chǔ)區(qū)域的邊界頂點(diǎn)坐標(biāo),即把區(qū)域的整個(gè)邊界作為一條連續(xù)直線來(lái)存儲(chǔ)。這種方法的缺點(diǎn)是造成坐標(biāo)的重復(fù)存儲(chǔ);優(yōu)點(diǎn)是具有較強(qiáng)的獨(dú)立性,不用考慮組成區(qū)域的連續(xù)直線段。</p><p> 在本設(shè)計(jì)中,采用直接存儲(chǔ)邊界坐標(biāo)的方式。用這種方式組織多邊形區(qū)域時(shí),組織方式與連續(xù)直線類似。所以,可以由連續(xù)直線類CPline派生出一個(gè)CPlineRgn
37、類,來(lái)對(duì)多邊形區(qū)域進(jìn)行管理。</p><p><b> 視圖的實(shí)現(xiàn)</b></p><p> 實(shí)際坐標(biāo)與邏輯坐標(biāo)的轉(zhuǎn)換</p><p> 坐標(biāo)系取屏幕的左下角的點(diǎn)作為圖形屏幕的基點(diǎn)??蛻魠^(qū)的左下角的坐標(biāo)定義為(m_xStart,m_yStart),并確定一個(gè)變量blc作為邏輯坐標(biāo)和實(shí)際坐標(biāo)的比例關(guān)系。</p><p&g
38、t; 為了實(shí)現(xiàn)實(shí)際坐標(biāo)與邏輯坐標(biāo)的轉(zhuǎn)換,在視圖類CDrawDoc中定義如下的四個(gè)轉(zhuǎn)換函數(shù):</p><p><b> Public:</b></p><p> Void DPtoVP(float x, float y, int *X,int *Y);</p><p> Void VPtoDP(int x, int y, float *X
39、, float *Y);</p><p> Int DLtoVL(float l);</p><p> Float VLtoDL(int l);</p><p> 函數(shù)VPtoDP 用來(lái)將邏輯坐標(biāo)轉(zhuǎn)換成實(shí)際坐標(biāo),參數(shù)(x,y)是一個(gè)點(diǎn)的邏輯坐標(biāo),參數(shù)(*X ,*Y)返回轉(zhuǎn)換后的實(shí)際坐標(biāo)值。</p><p> 函數(shù)DLtoVL用來(lái)將實(shí)際
40、坐標(biāo)長(zhǎng)度轉(zhuǎn)換成邏輯坐標(biāo)長(zhǎng)度,參數(shù)l是一個(gè)實(shí)際坐標(biāo)長(zhǎng)度,函數(shù)返回邏輯坐標(biāo)表示的長(zhǎng)度值。</p><p> 為了在應(yīng)用程序Draw的其他類中能夠使用四個(gè)坐標(biāo)轉(zhuǎn)換函數(shù),可以定義四個(gè)全局函數(shù)來(lái)實(shí)現(xiàn)轉(zhuǎn)換操作功能,在實(shí)現(xiàn)文件drawview.cpp中,定義四個(gè)全局函數(shù)如下:</p><p> Void DPtoVP(float x, float y, int *X, int *Y);</p&
41、gt;<p> Void VPtoDP(int x, int y, float *X, float *Y );</p><p> Int DLtoVL(float l);</p><p> Int VLtoDL(int l);</p><p> 如果在某個(gè)實(shí)現(xiàn)文件中使用這四個(gè)全局轉(zhuǎn)換函數(shù),只需在這個(gè)實(shí)現(xiàn)文件中的開(kāi)始處加入全局函數(shù)的外部引用:&l
42、t;/p><p> Extern Void DPtoVP (float x, float y, int *X, int *Y);</p><p> Extern Void VPtoDP (int x, int y, float *X, float *Y);</p><p> Extern Int DLtoVL (float l);</p><p
43、> Extern Int VLtoDL (int l);</p><p><b> 圖形元素的繪制功能</b></p><p> 利用虛函數(shù)實(shí)現(xiàn)各種圖形元素的繪制功能。在圖形元素基類CDraw中,抽象定義一個(gè)進(jìn)行繪制操作的虛函數(shù)。因?yàn)樵趹?yīng)用程序 Draw中,不用CDraw類直接來(lái)創(chuàng)建對(duì)象,所以可以將虛函數(shù)定義成純虛函數(shù):</p><p&
44、gt;<b> Public:</b></p><p> Virtual void Draw(CDC* pDC,int m_DrawMode,int m_DrawModel,short BackColor)=0;</p><p> 在各種圖形元素類Cline、CCircle、CArc、CText、CPline、CPlineRgn中,重載虛函數(shù)Draw:</
45、p><p><b> public:</b></p><p> virtual void Draw(CDC* pDC , int m_DrawMode, int m_DrawModel ,short BackColor);</p><p><b> 圖形操作方面</b></p><p><b
46、> 屏幕狀態(tài)的記錄</b></p><p> 對(duì)圖形屏幕進(jìn)行分析就會(huì)發(fā)現(xiàn),一個(gè)圖形屏幕是由三個(gè)參數(shù)來(lái)確定的:屏幕左下角原點(diǎn)的實(shí)際橫縱坐標(biāo)m_xStart、m_yStart和顯示比例blc,只要記錄下這三個(gè)參數(shù),就可以記錄下這一屏幕的狀態(tài)。</p><p> 為了實(shí)現(xiàn)記錄屏幕狀態(tài)的功能,在文檔類CDrawDoc中定義一個(gè)結(jié)構(gòu)數(shù)組來(lái)存儲(chǔ)歷史圖形屏幕。在CDrawDoc類
47、中定義以下兩個(gè)變量:</p><p><b> Public:</b></p><p> int m_CurrentScreen; //當(dāng)前屏幕的序號(hào)</p><p> int m_MaxScreen; //最多能存儲(chǔ)的屏幕數(shù)</p><p> ScreenStruct* m_Screen; /
48、/記錄屏幕參數(shù)的結(jié)構(gòu)數(shù)組</p><p> Typedef struct</p><p><b> {</b></p><p> Float blc; //顯示比例</p><p> Float sx; //屏幕左下角橫坐標(biāo)</p><p> Float sy; //屏幕
49、左下角縱坐標(biāo)</p><p> }ScreenStruct;</p><p> 在文檔類CDrawDoc中定義一個(gè)函數(shù),來(lái)完成存儲(chǔ)一個(gè)圖形屏幕狀態(tài)的操作功能:</p><p><b> Public:</b></p><p> Void AddScreen(float StartX, float StartY,
50、float blc);</p><p><b> 邊界矩形</b></p><p> 通過(guò)得到每一類圖形元素(如直線、連續(xù)直線)的邊界矩形,然后根據(jù)視圖屏幕的大小(邏輯坐標(biāo))進(jìn)行計(jì)算,得到屏幕的參數(shù)m_xStart,m_yStart,blc,從而實(shí)現(xiàn)顯示全圖的功能。</p><p> 在圖形元素的基類CDraw中定義一個(gè)虛函數(shù):</
51、p><p><b> Public:</b></p><p> Virtual void GetRect(float *minx,float *minY,float *maxX,float *maxY)=0;</p><p> 函數(shù)GetRect用來(lái)計(jì)算圖形元素的邊界矩形,(*minX ,*minY)和(*maxX ,*maxY )這四個(gè)指針
52、參數(shù)用來(lái)返回邊界矩形的最小和最大坐標(biāo)。</p><p> 在由CDraw類派生的各個(gè)圖形元素類中重載虛函數(shù)GetRect,即在各個(gè)類中加入以下定義代碼:</p><p><b> Public:</b></p><p> Virtual void GetRect(float *minx,float *minY,float *maxX,fl
53、oat *maxY);</p><p> 點(diǎn)選的判斷和特殊顯示</p><p> 點(diǎn)選圖形元素時(shí),問(wèn)題的關(guān)鍵在于如何判斷一個(gè)點(diǎn)是否在一個(gè)圖形元素上,也就是要確定每一類圖形元素的選中區(qū)域。</p><p><b> 有效距離</b></p><p> 確定有效距離的方法是:首先確定在視圖屏幕上有效距離的大小(如n個(gè)
54、像素),也就是說(shuō),不管在什么比例的情況下,選中的圖形元素都以在屏幕上與要選圖形元素的距離小于n個(gè)像素為標(biāo)準(zhǔn)。用像素為單位進(jìn)行計(jì)算時(shí)不方便,于是就求出n個(gè)像素在當(dāng)時(shí)顯示比例下的實(shí)際距離,這個(gè)實(shí)際距離就是點(diǎn)選圖形元素時(shí)的有效距離。只要鼠標(biāo)按中點(diǎn)到某圖形元素的實(shí)際距離小于這個(gè)有效距離,就算選中了這個(gè)圖形。有效距離的大小為:n*blc。//即n個(gè)像素的實(shí)際長(zhǎng)度</p><p> 各圖形元素選中的判斷</p>
55、<p><b> 直線和連續(xù)直線</b></p><p> 因?yàn)橹本€是沒(méi)有寬度的,所以,直線的點(diǎn)選判斷實(shí)際上是要判斷一個(gè)點(diǎn)與一條直線的距離是否在一定的距離范圍之內(nèi)。問(wèn)題的實(shí)質(zhì)就是,如何確定這個(gè)判斷選中的距離范圍和怎樣計(jì)算一個(gè)點(diǎn)與一條直線的距離。</p><p> 為了完成計(jì)算點(diǎn)到直線距離的功能,定義了一個(gè)函數(shù)PointLine在圖形元素基類CDra
56、w中,使之在直線和連續(xù)直線類中都可以用到:</p><p><b> Public:</b></p><p> float PointLine(float xx,float yy,float x1,float y1,float x2,float y2);</p><p><b> 圓和填充圓</b></p>
57、;<p> 圓的選中區(qū)域非常簡(jiǎn)單,如果有效距離為j1,計(jì)算得到的鼠標(biāo)按中點(diǎn)到圓心的距離為jl1,選中區(qū)域就是:</p><p> |jl1-circle.r|<jl;</p><p> 即按中點(diǎn)到圓的距離小于jl。</p><p> 對(duì)于填充圓,選中區(qū)域則是:</p><p><b> jl1<=
58、jl;</b></p><p><b> 圓弧</b></p><p> 圓弧的選中區(qū)域同圓類似,首先要確定按中點(diǎn)是否在圓弧所在的圓上。即按中點(diǎn)到圓心的距離jl1符合:</p><p> |jl1-circle.r|<jl;</p><p> 因?yàn)閳A弧不是封閉的,還要確定按中點(diǎn)相對(duì)于圓心的弧度是
59、否在圓弧的弧度范圍內(nèi),可以通過(guò)CArc類中的成員函數(shù)IsInArc函數(shù)來(lái)確定。</p><p><b> 多邊形區(qū)域</b></p><p> 圖形元素多邊形區(qū)域和標(biāo)注文本(四邊形)都屬于這種情況。最簡(jiǎn)單的多邊形區(qū)域就是沒(méi)有旋轉(zhuǎn)的矩形(如水平標(biāo)注的文本就是這種情況),判斷一個(gè)點(diǎn)是否在這種矩形中的算法非常簡(jiǎn)單。VC++的CRgn類提供了一個(gè)成員函數(shù)來(lái)實(shí)現(xiàn)這個(gè)操作功能
60、。CRgn類封裝了一些進(jìn)行區(qū)域操作的函數(shù),可以直接解決按中點(diǎn)是否在多邊形區(qū)域中的問(wèn)題。</p><p> 選中圖形元素的特殊顯示</p><p> 為了讓用戶知道是否選中了圖形元素,可以用實(shí)現(xiàn)圖形元素的特殊顯示的方法來(lái)實(shí)現(xiàn),實(shí)際上就是用不同的形式重新繪制這個(gè)圖形元素。在矢量圖形Draw中,要求選中線類圖形元素時(shí),用虛線表示;選中區(qū)域類圖形元素時(shí),就用虛邊線、變色或反色顯示。各個(gè)圖形元素
61、類的繪制函數(shù)Draw中,有一個(gè)參數(shù)DrawModel,是用來(lái)確定圖形元素顯示方式的,可以對(duì)Draw函數(shù)進(jìn)行修改,增加更多的顯示方式。</p><p><b> 圖形的移動(dòng)</b></p><p> 圖形移動(dòng)指的是將圖形元素在橫向和縱向上移動(dòng)一定的偏移量,得到移動(dòng)后圖形元素的坐標(biāo)。圖形移動(dòng)操作功能的機(jī)理非常簡(jiǎn)單,只需將各類圖形元素的特征點(diǎn)做相應(yīng)的坐標(biāo)移動(dòng)即可。在圖形
62、元素基類CDraw中定義一個(gè)純虛函數(shù):</p><p><b> Public:</b></p><p> virtual void Move(float x_Move ,float y_Move )=0;</p><p> //參數(shù)x_Move和y_Move分別是橫向和縱向的偏移量。</p><p><b&
63、gt; 提高圖形重畫(huà)速度</b></p><p> 在提高圖形重畫(huà)速度時(shí),首先要得到視圖屏幕即客戶區(qū)的大小。在應(yīng)用程序Draw中,在視圖類CDrawView中有兩個(gè)變量m_hScreen和m_wScreen分別用來(lái)存儲(chǔ)當(dāng)前視圖的高度和寬度(邏輯坐標(biāo))。在進(jìn)行圖形繪制前,把視圖屏幕矩形有邏輯坐標(biāo)轉(zhuǎn)換成實(shí)際坐標(biāo)。</p><p> 定義以下四個(gè)全局變量,用來(lái)傳遞要繪制視圖的左
64、下角和右上角的實(shí)際坐標(biāo)。在實(shí)現(xiàn)文件drawdoc.cpp中,增加全局變量的定義:</p><p> Float xMinScreen , yMinScreen , xMaxScreen , yMaxScreen;</p><p> 為了在實(shí)現(xiàn)文件drawview.cpp中使用這些變量,在實(shí)現(xiàn)文件drawview.cpp中增加對(duì)這些全局變量的引用:</p><p>
65、; Extern float xMinScreen ,yMinScreen , xMaxScreen , yMaxScreen</p><p> 這四個(gè)全局變量在每次調(diào)用OnDraw函數(shù)實(shí)現(xiàn)視圖的繪制功能前被初始化。在實(shí)現(xiàn)文件drawview.cpp中的繪制函數(shù)CDrawView::OnDraw(CDC* pDC)中加入代碼,實(shí)現(xiàn)在每次繪制前得到視圖屏幕邊界的實(shí)際坐標(biāo):</p><p>
66、; void CDrawView::OnDraw(CDC* pDC)</p><p><b> {</b></p><p> CDrawDoc* pDoc = GetDocument();</p><p> ASSERT_VALID(pDoc);</p><p> // TODO: add draw code
67、for native data here</p><p> xMinScreen=m_xStart;</p><p> yMinScreen=m_yStart;</p><p> xMaxScreen=xMinScreen+blc*m_wScreen;</p><p> yMaxScreen=yMinScreen+blc*m_hScr
68、een;</p><p> DrawBack(pDC);</p><p> pDoc->Draw(pDC,0,0,m_bColor);</p><p> m_MapMode=pDC->SetMapMode(1);</p><p><b> }</b></p><p> 這樣在
69、以當(dāng)前的屏幕參數(shù)(m_xStart ,m_yStart ,blc)繪制圖形前,把視圖屏幕的左下角和右上角的實(shí)際坐標(biāo)計(jì)算出來(lái)。</p><p> 矢量圖形工具系統(tǒng)的設(shè)計(jì)</p><p><b> 類的實(shí)現(xiàn)</b></p><p> 面向?qū)ο蟮奈臋n組織機(jī)制</p><p> 管理矢量圖形系統(tǒng)圖形數(shù)據(jù)的方法即文檔管理機(jī)
70、制。在本設(shè)計(jì)的開(kāi)發(fā)中,采用一套完全面向?qū)ο蟮奈臋n組織機(jī)制。這種機(jī)制就是通過(guò)圖形元素類創(chuàng)建很多圖形元素對(duì)象,每個(gè)圖形元素對(duì)象作為一個(gè)整體來(lái)組織存儲(chǔ)空間的分配、存取等各種管理功能。然后通過(guò)建立一種存儲(chǔ)機(jī)制,來(lái)管理指向所有圖形元素對(duì)象的指針,達(dá)到管理所有圖形元素對(duì)象的目的。這種文檔管理機(jī)制具有組織簡(jiǎn)單、結(jié)構(gòu)化和移植性好,以及比較容易利用VC++程序設(shè)計(jì)語(yǔ)言的開(kāi)發(fā)功能等優(yōu)點(diǎn)。缺點(diǎn)是需要較大的內(nèi)存空間。</p><p>
71、 管理一個(gè)矢量圖形系統(tǒng)文檔的思路是:每個(gè)圖形元素是圖形元素類創(chuàng)建的一個(gè)對(duì)象,在創(chuàng)建這個(gè)對(duì)象時(shí)得到指向這個(gè)對(duì)象的指針,建立一個(gè)對(duì)象指針數(shù)組來(lái)管理這些指針,以達(dá)到管理所有圖形元素對(duì)象的目的。</p><p> 在VC++下可以較容易地實(shí)現(xiàn)對(duì)指向圖形元素對(duì)象的指針的組織和管理。在MFC中有一個(gè)類模班CTypedPtrArray,可以用它來(lái)創(chuàng)建一個(gè)管理類指針的對(duì)象。例如,可以定義一個(gè)管理CLine類指針的對(duì)象如下:&l
72、t;/p><p> CTypedPtrArray<CObArray,Cline*>m_LineArray;</p><p> 其他各圖形類的管理類指針對(duì)象和Cline類指針的對(duì)象類似:</p><p> CTypedPtrArray<CObArray,CCircle*>m_CircleArray;</p><p>
73、 CTypedPtrArray<CObArray,CArc*>m_ArcArray;</p><p> CTypedPtrArray<CObArray,CText*>m_TextArray;</p><p> CTypedPtrArray<CObArray,CPline*>m_PLineArray;</p><p> CTy
74、pedPtrArray<CObArray,CPlineRgn*>m_PLineRgnArray;</p><p><b> 增加圖形元素</b></p><p> 在應(yīng)用程序Draw中增加一個(gè)圖形元素對(duì)象(如一條直線)時(shí),需要進(jìn)行以下兩個(gè)步驟的操作:</p><p> ?、賱?chuàng)建一個(gè)圖形元素對(duì)象,并用圖形元素的實(shí)際數(shù)據(jù)初始化這個(gè)圖
75、形元素對(duì)象。如增加一條直線時(shí),需要?jiǎng)?chuàng)建一個(gè)CLine對(duì)象,并用這條直線的實(shí)際數(shù)據(jù)(起終點(diǎn)、所在圖層、顏色等)初始化這個(gè)CLine對(duì)象的成員變量。</p><p> ?、诎阎赶蛐聞?chuàng)建的圖形元素對(duì)象的指針,增加到文檔類中管理圖形元素對(duì)象指針的對(duì)象中。如增加一條CLine對(duì)象后,需要把指向這個(gè)CLine對(duì)象的指針增加到文檔類的m_LineArray對(duì)象中。</p><p> 為了實(shí)現(xiàn)增加各類圖
76、形元素的功能,在文檔類CDrawDoc 中定義幾個(gè)函數(shù),分別來(lái)完成增加各類圖形元素的操作功能</p><p> CLine* AddLine(short ColorPen,short ColorBrush,float LineWide,short LineType,short Layer,int id_only,float X1,float Y1,float X2,float Y2);</p>&
77、lt;p> CCircle* AddCircle(short ColorPen,short ColorBrush,float LineWide,short LineType,short Layer,int id_only,float CircleX,float CircleY,float CircleR,BOOL bFill);</p><p> CArc* AddArc(short ColorPen,
78、short ColorBrush,float LineWide,short LineType,short Layer,int id_only,float CircleX,float CircleY,float CircleR,float Angle1,float Angle2);</p><p> CText* AddText(short ColorPen,short ColorBrush,float Line
79、Wide,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 TextLong,CString Text);</p><p> CPlin
80、e* AddPLine(short ColorPen,short ColorBrush,float LineWide,short LineType,short Layer,int id_only,int Numble,PointStruct *PointList);</p><p> CPlineRgn* AddPLineRgn(short ColorPen,short ColorBrush,float Lin
81、eWide,short LineType,short Layer,int id_only,int Numble,PointStruct *PointList,BOOL bTransparent,BOOL bFill);</p><p> 這6個(gè)函數(shù)分別用來(lái)實(shí)現(xiàn)增加一條直線、一個(gè)圓、一個(gè)圓弧、一個(gè)標(biāo)注文本、一條連續(xù)直線和一個(gè)多邊形區(qū)域的功能。函數(shù)返回指向新增圖形元素對(duì)象的指針。</p><p&
82、gt; 得到指向圖形元素對(duì)象的指針</p><p> 在一個(gè)矢量圖形系統(tǒng)中,有大量的圖形元素,指向圖形元素對(duì)象的指針被保存在文檔類對(duì)應(yīng)的CObArray 對(duì)象中。在系統(tǒng)的操作過(guò)程中,為了實(shí)現(xiàn)對(duì)圖形元素的各種操作功能,需要得到指向指定圖形元素對(duì)象的指針,為此,在文檔類CDrawDoc 中定義一個(gè)函數(shù)GetGraph如下:</p><p><b> Public:</b&
83、gt;</p><p> CDraw* GetGraph(short Lb, int index );</p><p> 在實(shí)現(xiàn)文件drawdoc.cpp中,加入函數(shù)的具體實(shí)現(xiàn)代碼。</p><p><b> 刪除圖形元素對(duì)象</b></p><p> 為了能夠從CObArray 對(duì)象中刪除一個(gè)指定圖形元素對(duì)象指
84、針,在文檔類CDrawDoc中定義一個(gè)成員函數(shù):</p><p><b> Public:</b></p><p> Void DeleteGraph(short Lb, int index);</p><p> 在實(shí)現(xiàn)文件drawdoc.cpp中,加入函數(shù)的具體實(shí)現(xiàn)代碼。</p><p> 得到各類圖形元素的數(shù)
85、目</p><p> 為了能夠隨時(shí)得到文檔中各類圖形元素對(duì)象的數(shù)目,在文檔類CDrawDoc中,定義一個(gè)成員函數(shù)如下:</p><p><b> Public:</b></p><p> Int GetGraphNumb(short Lb);</p><p> 在實(shí)現(xiàn)文件drawdoc.cpp中,加入函數(shù)的具體實(shí)
86、現(xiàn)代碼。</p><p> 得到存儲(chǔ)各類圖形元素CObArray 對(duì)象數(shù)組的最大下標(biāo)</p><p> 在對(duì)各個(gè)圖形元素類的所有圖形元素進(jìn)行操作時(shí),需要得到存儲(chǔ)在各個(gè)CObArray對(duì)象中的最大數(shù)組下標(biāo),然后對(duì)各個(gè)數(shù)組項(xiàng)實(shí)現(xiàn)遍歷操作。為了得到存儲(chǔ)在各個(gè)CObArray 對(duì)象中的最大數(shù)組下標(biāo),在文檔類CDrawDoc中定義一個(gè)函數(shù)如下:</p><p><b
87、> Public:</b></p><p> Int GetGraphUpperBound(short Lb);</p><p> 在實(shí)現(xiàn)文件drawdoc.cpp中,加入函數(shù)的具體實(shí)現(xiàn)代碼。</p><p> 得到某個(gè)識(shí)別號(hào)的圖形元素對(duì)象指針在CObArray 數(shù)組中的存放位置</p><p><b>
88、 Public:</b></p><p> Int GetGraphIndex(short Lb,int ID);</p><p> 在實(shí)現(xiàn)文件drawdoc.cpp中,加入函數(shù)的具體實(shí)現(xiàn)代碼。</p><p> 得到圖形元素的唯一識(shí)別號(hào)</p><p> 在應(yīng)用程序Draw中,采用同類圖形元素具有惟一識(shí)別號(hào)的方法,即每
89、一類別的圖形元素具有不同的成員變量m_id_only。</p><p> 為了得到每類圖形元素的惟一識(shí)別號(hào),在文檔類CDrawDoc中定義一個(gè)成員函數(shù):</p><p><b> public:</b></p><p> int GetGraphID(short Lb);</p><p> 函數(shù)GetGraphI
90、D用來(lái)得到要增加的各類圖形元素的惟一識(shí)別號(hào),參數(shù)Lb用來(lái)表示圖形類別。在實(shí)現(xiàn)文件drawdoc.cpp中,加入函數(shù)的實(shí)現(xiàn)代碼。</p><p><b> 鼠標(biāo)交互繪制</b></p><p> VC++提供了足夠的窗口消息和已經(jīng)保護(hù)的消息處理函數(shù)解決這個(gè)問(wèn)題。在應(yīng)用程序Draw中實(shí)現(xiàn)鼠標(biāo)交互繪制圖形元素時(shí),將主要用到以下三個(gè)鼠標(biāo)操作:</p><
91、;p> 鼠標(biāo)移動(dòng):OnMouseMove(UINT nFlags ,CPoint point) WM_MOUSEMOVE</p><p> 按下左鍵: OnLButtonDown(UINT nFlags.CPoint point) WM_LBUTTOND</p><p> 按下右鍵:OnRButtonDown(UINT nFlags.CPoint point) WM_RBUTT
92、ONDOWN</p><p> 在用鼠標(biāo)交互繪制一個(gè)圖形元素時(shí),在已經(jīng)開(kāi)始繪圖的情況下,不希望還能進(jìn)行別的操作,以避免造成系統(tǒng)流程和變量初始化等方面的錯(cuò)誤。VC++提供了兩個(gè)成員函數(shù)來(lái)滿足以上的功能需求:</p><p> CWnd::SetCapture(); //捕捉所有的鼠標(biāo)輸入</p><p> CWnd::ReleaseCapture();
93、//釋放鼠標(biāo)捕捉</p><p> 在用鼠標(biāo)交互繪制圖形元素時(shí),為了直觀的看到所繪制的圖形,一般采用拖動(dòng)圖形的方法。</p><p> 用鼠標(biāo)交互繪制一個(gè)圖形元素后,要在屏幕上馬上顯示出這個(gè)圖形元素的實(shí)際形態(tài),必須將圖形元素以實(shí)際的形態(tài)重畫(huà)。因?yàn)樵赩C++的R2_NOT繪制模式下,線條不是彩色的,拖動(dòng)的圖形都不是用圖形元素的實(shí)際顏色。必須對(duì)圖形元素以實(shí)際形態(tài)進(jìn)行重畫(huà)。在矢量圖形系統(tǒng)設(shè)計(jì)
94、中,一般采用CClientDC對(duì)象,在交互繪制圖形元素操作完成后,即時(shí)在視圖中重畫(huà)這個(gè)新增的圖形元素。</p><p><b> 重畫(huà)技術(shù)</b></p><p><b> 圖形重畫(huà)</b></p><p> 在很多情況下,需要將當(dāng)前視圖屏幕全屏重畫(huà)。所謂圖形重畫(huà),就是把當(dāng)前視圖屏幕重新繪制一次,實(shí)際上也就是讓視圖類
95、的函數(shù)OnDraw(CDC* pDC)重新執(zhí)行一次。根據(jù)需要重畫(huà)的區(qū)域的不同,圖形重畫(huà)可以分為全屏重畫(huà)和局部重畫(huà)。</p><p><b> 全屏重畫(huà)</b></p><p> 全屏重畫(huà)有兩種方式:</p><p> ?、僭谝晥D類函數(shù)的實(shí)現(xiàn)代碼中,用以下代碼來(lái)激活重畫(huà)機(jī)制:</p><p> CDrawDoc* p
96、Doc=GetDocument();</p><p> pDoc->UpdateAllViews(this);</p><p> 函數(shù)UpdateAllViews使屬于當(dāng)前文檔對(duì)象的所有視圖重畫(huà)。如果應(yīng)用程序采用的是單文檔結(jié)構(gòu),系統(tǒng)只有一個(gè)視圖,執(zhí)行此命令時(shí)使這個(gè)視圖失效并重畫(huà),即激發(fā)視圖類的OnDraw執(zhí)行;如果應(yīng)用程序采用的是多文檔結(jié)構(gòu),一個(gè)文檔對(duì)象可能具有多個(gè)視圖,Upda
97、teAllViews可使屬于這個(gè)文檔對(duì)象的所有視圖都重新繪制。</p><p> ?、谠谝晥D類函數(shù)的實(shí)現(xiàn)代碼中,用以下代碼激活重畫(huà)機(jī)制:</p><p> Invalidate();</p><p> Invalidate函數(shù)使當(dāng)前視圖屏幕的客戶區(qū)失效,從而激活圖形重畫(huà)。Invalidate函數(shù)與UpdateAllViews函數(shù)的不同點(diǎn)是,它只能使當(dāng)前視圖重畫(huà),
98、而與其同文檔的其他視圖并不重畫(huà)。</p><p> 要實(shí)現(xiàn)圖形重畫(huà)功能,需要對(duì)視圖類CDrawView的OnGraphRedraw函數(shù)進(jìn)行修改。修改后的代碼如下:</p><p> Void CDrawView::OnGraphRedraw()</p><p><b> {</b></p><p> CDrawD
99、oc* pDoc=GetDocument();</p><p> pDoc->UpdateAllViews(this);</p><p> Invalidate();</p><p><b> }</b></p><p> OnGraphRedraw函數(shù)首先得到指向當(dāng)前文檔對(duì)象的指針,然后調(diào)用UpdateA
100、llViews函數(shù)重畫(huà)此文檔對(duì)象所有的視圖,參數(shù)this是指向當(dāng)前視圖對(duì)象的指針。</p><p><b> 局部重畫(huà)</b></p><p> 在很多情況下,往往只希望將當(dāng)前視圖屏幕的一部分區(qū)域進(jìn)行重畫(huà),即局部重畫(huà)。在VC++中,以下兩個(gè)函數(shù)可以完成此功能。</p><p> InvalidateRect函數(shù)的定義為:</p>
101、;<p> Void InvalidateRect(LPCRECT lpRect ,BOOL bErase=TRUE);</p><p> 函數(shù)InvalidateRect 可使視圖中一個(gè)指定的矩形區(qū)域重畫(huà)。這個(gè)函數(shù)的調(diào)用方法與函數(shù)Invalidate 類似。參數(shù)lpRect 中存儲(chǔ)著視圖中需要重畫(huà)的區(qū)域,參數(shù)bErase用于指定當(dāng)區(qū)域重畫(huà)時(shí),背景是否擦除,當(dāng)bErase為T(mén)RUE時(shí),背景被擦除
102、,當(dāng)bErase為FALSE,背景保持不變。</p><p> InvalidateRgn函數(shù)</p><p> InvalidateRgn函數(shù)的定義為:</p><p> void InvalidateRgn(CRgn* pRgn, BOOL bErase=TRUE);</p><p> 函數(shù)InvalidateRgn的功能和使用方
103、法與函數(shù)InvalidateRgn類似,惟一不同的是函數(shù)InvalidateRgn是使一個(gè)指定的區(qū)域重畫(huà)。參數(shù)pRgn是指向一個(gè)CRgn對(duì)象的指針。InvalidateRgn函數(shù)可以使一個(gè)已經(jīng)初始化的CRgn對(duì)象所指定的區(qū)域重畫(huà)。以下代碼可使CRgn對(duì)象rgn指定的區(qū)域重畫(huà):</p><p> InvalidateRgn(&rgn);</p><p> 重畫(huà)上屏、首屏和顯示全圖
104、</p><p><b> 重畫(huà)上屏</b></p><p> 要實(shí)現(xiàn)重畫(huà)上屏的操作功能,只需把m_CurrentScreen的值減去1,從結(jié)構(gòu)數(shù)組m_Screen中取出屏幕參數(shù)重畫(huà)圖形即可。在實(shí)現(xiàn)文件drawview.cpp中,將“重畫(huà)上屏”菜單項(xiàng)的消息處理函數(shù)OnGraphUp的實(shí)現(xiàn)代碼修改如下:</p><p> void CDra
105、wView::OnGraphUp()</p><p><b> {</b></p><p> CDrawDoc* pDoc=(CDrawDoc*)GetDocument();</p><p> if(pDoc->m_CurrentScreen>0)</p><p> //如果當(dāng)前不是首屏,當(dāng)前圖形屏幕
106、序號(hào)減1</p><p> pDoc->m_CurrentScreen--;</p><p> //得到上一屏幕的圖形參數(shù)并重畫(huà)圖形</p><p> m_xStart=p_Screen[pDoc->m_CurrentScreen].sx;</p><p> m_yStart=p_Screen[pDoc->m_Cur
107、rentScreen].sy;</p><p> blc=p_Screen[pDoc->m_CurrentScreen].blc;</p><p> Invalidate(); //重畫(huà)圖形</p><p><b> }</b></p><p> p_Screen是CDrawView類中定義的指向文檔
108、對(duì)象中的結(jié)構(gòu)數(shù)組m_Screen的指針,它在視圖類CDrawView中定義:</p><p> ScreenStruct *p_Screen;</p><p> 在實(shí)現(xiàn)文件drawview.cpp中,在重載的虛函數(shù)OnActiveView中對(duì)p_Screen進(jìn)行初始化,將它指向當(dāng)前文檔對(duì)象中的結(jié)構(gòu)數(shù)組m_Screen:</p><p> void CDrawV
109、iew::OnActivateView(BOOL bActivate, CView* pActivateView, </p><p> CView* pDeactiveView) </p><p><b> {</b></p><p> p_View=this;</p><p> CDrawDoc* pDoc=(
110、CDrawDoc*)GetDocument();</p><p> p_Screen=pDoc->m_Screen;</p><p> CView::OnActivateView(bActivate, pActivateView, pDeactiveView);</p><p><b> }</b></p><p
111、><b> 重畫(huà)首屏</b></p><p> 對(duì)于重畫(huà)首屏的功能來(lái)說(shuō),只要取出存儲(chǔ)在結(jié)構(gòu)數(shù)組m_Screen中的首屏參數(shù),并對(duì)視圖重畫(huà)即可。修改實(shí)現(xiàn)文件drawview.cpp中的消息處理函數(shù)OnGraphFirst,得到實(shí)現(xiàn)代碼如下:</p><p> void CDrawView::OnGraphFirst() //重畫(huà)首屏</p>&
112、lt;p><b> {</b></p><p> // TODO: Add your command handler code here</p><p> CDrawDoc* pDoc=GetDocument();</p><p> if(pDoc->m_CurrentScreen==0)</p><p&
113、gt;<b> return ;</b></p><p> m_xStart=p_Screen[0].sx;</p><p> m_yStart=p_Screen[0].sy;</p><p> blc=p_Screen[0].blc;</p><p> pDoc->AddScreen(m_xStart,
114、m_yStart,blc);</p><p> Invalidate();</p><p><b> }</b></p><p><b> 顯示全圖</b></p><p><b> ?、俚玫竭吔缇匦?lt;/b></p><p> 在矢量圖形系統(tǒng)中,
115、有一種情況是,圖形中所有的圖形元素都在視圖屏幕的一個(gè)角上,只占圖幅的一小部分。這是就需要一個(gè)操作功能,調(diào)整視圖屏幕左下角原點(diǎn)的實(shí)際坐標(biāo)(m_xStart ,m_yStart)和顯示比例blc,使所有的圖形元素正好能夠繪制到視圖屏幕中(在屏幕上留有一部分邊界區(qū)域),顯示全圖功能就是為完成此功能而設(shè)置的。實(shí)現(xiàn)顯示全圖功能的思路是,通過(guò)得到每一類圖形元素(如直線、連續(xù)直線)的邊界矩形,然后根據(jù)視圖屏幕的大?。ㄟ壿嬜鴺?biāo))進(jìn)行計(jì)算,得到屏幕的參數(shù)
116、m_xStart,m_yStart,blc。所以,解決問(wèn)題的關(guān)鍵在于得到各類圖形元素的邊界矩形。在3.3.2節(jié)中我們已經(jīng)介紹了邊界矩形的實(shí)現(xiàn)方法,</p><p> 把所有圖形元素的邊界矩形坐標(biāo)進(jìn)行比較,就可以得到所有圖形元素的邊界矩形。為了實(shí)現(xiàn)這個(gè)功能,在文檔類CDrawDoc中定義一個(gè)函數(shù):</p><p><b> Public:</b></p>
117、<p> BOOL GetRect(float *m_Xmin,float *m_Ymin,float *m_Xmax,float *m_Ymax);</p><p> 指針參數(shù)用來(lái)返回邊界矩形的最小和最大坐標(biāo),當(dāng)能計(jì)算得到邊界矩形時(shí),函數(shù)返回TRUE,否則,函數(shù)返回FALSE。在實(shí)現(xiàn)文件drawdoc.cpp中,加入這個(gè)函數(shù)的實(shí)現(xiàn)代碼。</p><p> 在函數(shù)Get
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)設(shè)計(jì)--矢量圖形系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)設(shè)計(jì)
- 瀏覽器矢量圖形繪制工具的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 畢業(yè)設(shè)計(jì)(論文)矢量圖形處理技術(shù)網(wǎng)絡(luò)平臺(tái)的設(shè)計(jì)與開(kāi)發(fā)
- 基于可伸縮矢量圖形的數(shù)據(jù)遷移設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于VC++的GIS矢量圖形系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于矢量圖形技術(shù)的大屏展示系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn).pdf
- 29960.基于gdi的矢量圖形原型系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 一種AADL建模工具的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 矢量圖形可逆水印系統(tǒng)設(shè)計(jì).pdf
- 基于可縮放矢量圖形的智能文檔系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn).pdf
- 4.1矢量圖形
- 4.1矢量圖形
- 開(kāi)題報(bào)告矢量圖形處理技術(shù)網(wǎng)絡(luò)平臺(tái)的設(shè)計(jì)與開(kāi)發(fā)
- 文獻(xiàn)綜述矢量圖形處理技術(shù)網(wǎng)絡(luò)平臺(tái)的設(shè)計(jì)與開(kāi)發(fā)
- [學(xué)習(xí)]網(wǎng)頁(yè)設(shè)計(jì)與制作第12章矢量圖形的編輯
- 一種DSP自動(dòng)代碼生成工具的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 一種遠(yuǎn)程管理linux系統(tǒng)工具的設(shè)計(jì)與實(shí)現(xiàn)
- 一種本體匹配對(duì)修補(bǔ)工具的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 畢業(yè)設(shè)計(jì)---一種新型開(kāi)關(guān)電源的設(shè)計(jì)
- 66255.組件式gis平臺(tái)scgis中矢量圖形子系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
評(píng)論
0/150
提交評(píng)論