?? 11.2 圖形的保存和重繪.txt
字號:
11.2 圖形的保存和重繪
本章將在上一章己有程序 ( Graphic)的基礎上繼續(xù)添加圖形的保存和重繪功能,為了
使程序演示效果更好,首先將己有的 Graph ic程序的窗口恢復為默認的白色背景,也就是
將 CGraphicView類的 OnEraseBkgnd函數(shù)中顯示位圖的代碼注釋起來。然后,讀者可以運
行一下 Graphic程序,并利用相應菜單命令在窗口中繪制一些圖形,當窗口尺寸發(fā)生變化
時,將會發(fā)現(xiàn)窗口中繪制的圖形都消失了。這是因為當窗口尺寸發(fā)生變化時,引起窗口重繪,會發(fā)
送 WM PAINT消息,這時首先會擦除窗口的背景,然后再進行重繪操作,這樣就把窗口中先前給制的
圖形擦除掉了。如果希望所繪制的圖形始終在窗口中呈現(xiàn)出來,就需要將這些圖形保存起來,然后
當窗口尺寸發(fā)生變化引起窗口重繪時,將這些圖形再次在窗口中輸出。根據(jù)前面的知識,我們知道
當窗口重繪時總是會調(diào)用程序視類的 OnDraw函數(shù),因此我們可以在該函數(shù)中完成圖形的輸出。而保
存圖形的方式有多種,對于本例所繪制的圖形來說,有三個要素 :起點、終點和繪制的類型(點、線、
矩形或橢圓),也就是說,對本例所繪制的每一個圖形,只需要保存這三個要素就可以了。當窗口重
繪時,在 CGraphicView類的 OnDraw函數(shù)中,根據(jù)每一個己保存的圖形的繪制類型,利用其起點和
終點將該圖形在窗口中重新輸出。由于這三個要素的數(shù)據(jù)類型不同,而在 C++中用結構體來保存不
同類型的對象是比較合適的。在 C++中,結構體就是一個類,因此,本例也可以利用一個類來保存
圖形的這三個要素,這比較符合面向?qū)ο蟮乃枷搿?于是,我們?yōu)?Graphic程序增加一個新類: CGraph,增加方法是單擊【Insert\New Class. .】菜單
項,隨后在彈出的NewClass對話框中,將新增類的類型選擇為: Generic Cl臼s,如圖 11.4所示。
圖 11.4新增Graph類然后為CGraph這個新類增加三個成員變量(如表 11.2所示),這里將這三個變量
的訪問權限都設置為public類型,因為在后面的程序中其他類需要訪問它們。表11.2為CGraph類添
加的成員變量
說明
變量類型
變量名
繪制類型
uINT
m_ndrawtype
CPoint m_ptOrigin
CPoint
起點
CPoint
終點
m_ptEnd
為了能夠方便地對這三個新增加的變量進行賦值,我們再為 CGraph類提供一個帶參
數(shù)的構造函數(shù)(其定義代碼如例 11-2所示),允許用戶在構造 CGraph類的對象時,直接
通過參數(shù)給這三個成員變量賦值。
例 11-2
CGraph::CGraph(UINT m_nDrawType, CPoint m_ptOrigin, CPoint m_ptEnd)
{
this->m_nDrawType=m_nDrawtype;
this->m_ptOrigin=m_ptOrigin;
this->m_ptEnd=m_ptEnd;
這樣,我們在程序中,通過CGraph類就可以構造相應的對象來保存圖形的三個要素。因為在繪圖時
可能會繪制多個圖形,所以必須為每一個圖形創(chuàng)建一個相應的CGraph對象,以保存該圖形的三個要
素。我們可以采用數(shù)組來保存這些創(chuàng)建的 CGraph對象,但是這樣做將會非常不方便,因為數(shù)組有一
個缺點,一旦定義之后,就只能存儲一定容量的元素。
而用戶每次繪制的圖形個數(shù)是不定的,需要創(chuàng)建的 CGraph對象的個數(shù)也是不定的,因此應該采用一
種動態(tài)的存儲結構來保存這些 CGraph對象。本例將使用 MFC提供的-個集合類來完成這一任務。當
然,這里可以使用鏈表來保存這些對象,但其實現(xiàn)比較復雜。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -