




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度公司對(duì)公司知識(shí)產(chǎn)權(quán)質(zhì)押借款協(xié)議
- 2025年度公益基金會(huì)災(zāi)害預(yù)防合作框架
- 億渡數(shù)據(jù):中國(guó)康復(fù)行業(yè)短報(bào)告
- 2025年度影視作品演員出演合同樣本
- 2025年度區(qū)塊鏈技術(shù)應(yīng)用增資擴(kuò)股協(xié)議
- 2025年度快遞配送與快遞網(wǎng)點(diǎn)建設(shè)合同
- 2025年度房產(chǎn)過(guò)戶房地產(chǎn)經(jīng)紀(jì)人服務(wù)協(xié)議
- 2025年度農(nóng)村鄰居土地界限確權(quán)與使用協(xié)議書(shū)
- 二零二五年度礦山股份合作協(xié)議書(shū):礦山生態(tài)環(huán)境保護(hù)與修復(fù)
- 2025年度賓館客房客房服務(wù)員培訓(xùn)與勞務(wù)服務(wù)合同
- JJF 1375-2024機(jī)動(dòng)車發(fā)動(dòng)機(jī)轉(zhuǎn)速測(cè)量?jī)x校準(zhǔn)規(guī)范
- 《分類加法與分步乘法計(jì)數(shù)原理-習(xí)題課》名師課件
- 常見(jiàn)業(yè)務(wù)場(chǎng)景網(wǎng)絡(luò)安全建設(shè)VISIO圖合集(27個(gè)類型)v2023
- 無(wú)人機(jī)通信融合組網(wǎng)
- 七年級(jí)英語(yǔ)閱讀理解55篇(含答案)
- 臨床常見(jiàn)操作-灌腸
- 三年級(jí)下冊(cè) 道德與法治 全冊(cè)教案
- 2024年安徽合肥中考數(shù)學(xué)試題及答案1
- 2024-2025學(xué)年全國(guó)中學(xué)生天文知識(shí)競(jìng)賽備賽試題庫(kù)(含答案)
- 三水高樁碼頭施工組織設(shè)計(jì)方案
- 醫(yī)療器械的驗(yàn)收與管理制度
評(píng)論
0/150
提交評(píng)論