窗口中圖形的保存與重繪_第1頁(yè)
窗口中圖形的保存與重繪_第2頁(yè)
窗口中圖形的保存與重繪_第3頁(yè)
窗口中圖形的保存與重繪_第4頁(yè)
窗口中圖形的保存與重繪_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、窗口中圖形的保存和重繪窗口中圖形的保存和重繪窗口重繪時(shí),調(diào)用窗口重繪時(shí),調(diào)用OnDrawOnDraw函數(shù)的機(jī)制函數(shù)的機(jī)制 窗口重繪時(shí)會(huì)發(fā)送窗口重繪時(shí)會(huì)發(fā)送WM_PAINTWM_PAINT消息,消息,OnDrawOnDraw函數(shù)并不是函數(shù)并不是WM_PAINTWM_PAINT消息響應(yīng)函數(shù),那么為什么窗口重繪時(shí)它會(huì)被調(diào)消息響應(yīng)函數(shù),那么為什么窗口重繪時(shí)它會(huì)被調(diào)用呢?用呢? 分析基類分析基類CViewCView中響應(yīng)中響應(yīng)WM_PAINTWM_PAINT的消息響應(yīng)函數(shù)的消息響應(yīng)函數(shù) void CView:OnPaint() / standard paint routineCPaintDC dc(th

2、is);OnPrepareDC(&dc);OnDraw(&dc); 窗口重繪時(shí),調(diào)用窗口重繪時(shí),調(diào)用OnDrawOnDraw函數(shù)的機(jī)制函數(shù)的機(jī)制 是因?yàn)楫?dāng)窗口重繪時(shí),會(huì)發(fā)送是因?yàn)楫?dāng)窗口重繪時(shí),會(huì)發(fā)送WM_PAINTWM_PAINT消息,而我們消息,而我們CMiniDrawViewCMiniDrawView類中沒(méi)處理這個(gè)消息,會(huì)回到基類的消息類中沒(méi)處理這個(gè)消息,會(huì)回到基類的消息處理函數(shù)處理函數(shù)OnPaintOnPaint中,在這個(gè)函數(shù)中調(diào)用中,在這個(gè)函數(shù)中調(diào)用OnDrawOnDraw函數(shù)。給函數(shù)。給我們的感覺(jué)就好像是我們的感覺(jué)就好像是OnDrawOnDraw函數(shù)專門(mén)用來(lái)負(fù)責(zé)重繪窗口的。函數(shù)專門(mén)用

3、來(lái)負(fù)責(zé)重繪窗口的。跟在跟在SDKSDK編程中講過(guò)的窗口重繪過(guò)程是一致的,只是將重編程中講過(guò)的窗口重繪過(guò)程是一致的,只是將重繪的過(guò)程封裝成幾個(gè)函數(shù)了,在繪的過(guò)程封裝成幾個(gè)函數(shù)了,在OnPaintOnPaint中調(diào)用中調(diào)用OnDrawOnDraw。這個(gè)函數(shù)的目的是利用這個(gè)函數(shù)給程序員提供一種方便,這個(gè)函數(shù)的目的是利用這個(gè)函數(shù)給程序員提供一種方便,可以在這進(jìn)行圖形的繪制。可以在這進(jìn)行圖形的繪制。 當(dāng)窗口尺寸發(fā)生變化時(shí),會(huì)引起窗口的重繪,發(fā)送當(dāng)窗口尺寸發(fā)生變化時(shí),會(huì)引起窗口的重繪,發(fā)送WM_PAINTWM_PAINT消息。首先是擦除窗口背景,然后引起重繪。消息。首先是擦除窗口背景,然后引起重繪。 如果

4、要讓圖形始終在窗口中出現(xiàn),就需要將繪制的圖如果要讓圖形始終在窗口中出現(xiàn),就需要將繪制的圖形保存起來(lái)。當(dāng)窗口尺寸發(fā)生變化時(shí),再將這個(gè)圖形形保存起來(lái)。當(dāng)窗口尺寸發(fā)生變化時(shí),再將這個(gè)圖形在窗口中繪制出來(lái)。在窗口中輸出圖形,可以在在窗口中繪制出來(lái)。在窗口中輸出圖形,可以在OnDrawOnDraw函數(shù)中實(shí)現(xiàn)。函數(shù)中實(shí)現(xiàn)。因?yàn)榇翱谥乩L時(shí),會(huì)調(diào)用因?yàn)榇翱谥乩L時(shí),會(huì)調(diào)用OnDrawOnDraw函數(shù)。函數(shù)。那如何保存圖形呢?那如何保存圖形呢? 在在C+C+中,結(jié)構(gòu)體就是一個(gè)類。中,結(jié)構(gòu)體就是一個(gè)類。直線的要素是起點(diǎn)和終點(diǎn)。直線的要素是起點(diǎn)和終點(diǎn)。所以可以用一個(gè)類的對(duì)象來(lái)保存圖形的兩要所以可以用一個(gè)類的對(duì)象來(lái)保存

5、圖形的兩要素,這也符合面向?qū)ο蟮某绦蛟O(shè)計(jì)的特點(diǎn)。素,這也符合面向?qū)ο蟮某绦蛟O(shè)計(jì)的特點(diǎn)。利用菜單利用菜單InsertInsert插入一個(gè)新的類,名字叫插入一個(gè)新的類,名字叫CLineCLine,類的,類的類型是類型是GenericGeneric類而不是類而不是MFCMFC類。類。 在類中增加在類中增加2 2個(gè)成員變量,設(shè)為共有的。個(gè)成員變量,設(shè)為共有的。 CPoint m_ptOriginCPoint m_ptOrigin,m_ptEnd;m_ptEnd;構(gòu)造一個(gè)構(gòu)造一個(gè)CLineCLine的對(duì)象就可以保存直線的的對(duì)象就可以保存直線的2 2要素,提供要素,提供帶參數(shù)的構(gòu)造函數(shù)。帶參數(shù)的構(gòu)造函數(shù)。

6、CLine:CLine(CPoint m_ptOrigin, CPoint m_ptEnd)CLine:CLine(CPoint m_ptOrigin, CPoint m_ptEnd) this-m_ptOrigin=m_ptOrigin;this-m_ptOrigin=m_ptOrigin;this-m_ptEnd=m_ptEnd;this-m_ptEnd=m_ptEnd; 用什么來(lái)保存這些直線呢?用什么來(lái)保存這些直線呢?數(shù)組?數(shù)組? 鏈表?鏈表?集合類集合類CPtrArray 固定大小固定大小操作復(fù)雜操作復(fù)雜1. 簡(jiǎn)單數(shù)組集合類的構(gòu)造及元素的添加簡(jiǎn)單數(shù)組集合類的構(gòu)造及元素的添加 對(duì)簡(jiǎn)單數(shù)組

7、集合類構(gòu)造的方法都是一樣的,均是對(duì)簡(jiǎn)單數(shù)組集合類構(gòu)造的方法都是一樣的,均是使用各自的構(gòu)造函數(shù),它們的原型如下:使用各自的構(gòu)造函數(shù),它們的原型如下: CByteArray CByteArray( ); CDWordArray CDWordArray( ); CObArray CObArray( ); CPtrArray CPtrArray( ); CStringArray CStringArray( ); CUIntArray CUIntArray( ); CWordArray CWordArray( ); 使用簡(jiǎn)單數(shù)組集合類2. 訪問(wèn)簡(jiǎn)單數(shù)組集合類的元素在在MFC中,既可以使用中,既可以使用G

8、etAt函數(shù),也可使用函數(shù),也可使用“ ”操作符:操作符: / CPtrArray:operator 示例示例 CPtrArray array; CAge* pa; / CAge是一個(gè)用戶類是一個(gè)用戶類 array.Add( new CAge( 21 ) ); / 添加一個(gè)元素添加一個(gè)元素 array.Add( new CAge( 40 ) ); / 再添加一個(gè)元素再添加一個(gè)元素 pa = (CAge*)array0; / 獲取元素獲取元素0 ASSERT( *pa = CAge( 21 ) ); array0 = new CAge( 30 ); / 替換元素替換元素0; ASSERT( *(

9、CAge*) array0 = CAge( 30 ) ); 使用簡(jiǎn)單數(shù)組集合類2. 訪問(wèn)簡(jiǎn)單數(shù)組集合類的元素在在MFC中,既可以使用中,既可以使用GetAt函數(shù),也可使用函數(shù),也可使用“ ”操作符:操作符: / CPtrArray:GetAt示例示例 CPtrArray array; array.Add( new CAge( 21 ) ); / 元素元素 0 array.Add( new CAge( 40 ) ); / 元素元素 1 ASSERT( *(CAge*) array.GetAt( 0 ) = CAge( 21 ) ); 使用簡(jiǎn)單數(shù)組集合類3. 刪除簡(jiǎn)單數(shù)組集合類的元素(1) 使用函

10、數(shù)使用函數(shù)GetSize和整數(shù)下標(biāo)值訪問(wèn)簡(jiǎn)單數(shù)組集合和整數(shù)下標(biāo)值訪問(wèn)簡(jiǎn)單數(shù)組集合類中的元素。類中的元素。(2) 若對(duì)象元素是在堆內(nèi)存中創(chuàng)建的,則使用若對(duì)象元素是在堆內(nèi)存中創(chuàng)建的,則使用delete操操作符刪除每一個(gè)對(duì)象元素。作符刪除每一個(gè)對(duì)象元素。(3) 調(diào)用函數(shù)調(diào)用函數(shù)RemoveAll刪除簡(jiǎn)單數(shù)組集合類中的所有刪除簡(jiǎn)單數(shù)組集合類中的所有元素。元素。使用簡(jiǎn)單數(shù)組集合類CPtrArray array;CAge* pa1;CAge* pa2;array.Add( pa1 = new CAge( 21 ) ); array.Add( pa2 = new CAge( 40 ) ); ASSERT(

11、array.GetSize() = 2 );for (int i=0;i array.GetSize() ;i+) delete array.GetAt(i);array.RemoveAll(); 下面代碼過(guò)程是一個(gè)下面代碼過(guò)程是一個(gè)CPtrArray的刪除示例:的刪除示例: 利用利用CPtrArrayCPtrArray去存儲(chǔ)去存儲(chǔ)CLineCLine對(duì)象的地址對(duì)象的地址 (1 1)在視圖類中定義變量)在視圖類中定義變量CPtrArray m_ptArray;(2 2)在)在OnLButtonUpOnLButtonUp中中 CLine line(m_ptOrigin,point); m_ptA

12、rray.Add(&line);(3)在)在OnDraw中,將中,將m_ptArray中保存的圖形取出來(lái)重畫(huà)中保存的圖形取出來(lái)重畫(huà)int nCount=m_ptArray.GetSize ();for(int i=0;iMoveTo (CLine *)m_ptArray.GetAt (i)-m_ptOrigin);pDC-LineTo (CLine *)m_ptArray.GetAt (i)-m_ptEnd);當(dāng)窗口尺寸發(fā)生變化時(shí),當(dāng)窗口尺寸發(fā)生變化時(shí),圖形沒(méi)有在窗口中再次出現(xiàn)圖形沒(méi)有在窗口中再次出現(xiàn) ?在OnLButtonUp函數(shù)中函數(shù)中0088:4400CLine line();CLine的對(duì)象在棧中的內(nèi)存0088:4400CPtrArray m_ptrArray;m_ptrArray.Add(&line)CLine的對(duì)象發(fā)生析構(gòu),內(nèi)存被回收。如何解決這個(gè)問(wèn)題呢?如何解決這個(gè)問(wèn)題呢?在在OnLBut

溫馨提示

  • 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ù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論