



下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、VC的MFC中重繪函數的使用總結在刷新窗口時經常要調用重繪函數MFC提供了三個函數用于窗口重繪InvalidateRect(&Rect)Invalidate()UpdateWindow()當需要更新或者重繪窗口時,一般系統會發出兩個消息WM_PAINT(通知客戶區有變化)和WM_NCPAINT(通知非客戶區有變化)-WM_NVPAINT系統會自己搞定-WM_PAINT消息對應的函數是OnPaint(),它是系統默認的接受WM_PAINT消息的函數,但我們一般在程序中做重繪時都在OnDraw函數中進行的,因為在ONPAIN函數中調用了ONDRAW函數。/CView默認的標準的重畫函數vo
2、id CView:OnPaint() CPaintDC dc(this); OnPreparDC(&dc); OnDraw(&dc); /調用了OnDraw 上面講到InvalidateRect(&Rect)Invalidate()兩個函數形式和功能差不多,但Invalidate是使得整個窗口無效,形成無效矩形,而InvalidateRect(&Rect)是使得指定的區域無效。Invalidate()申明無效,等待WM_PAINT消息以便重繪,隊列中無其他消息時系統會自動發送UpdateWindow()會立即發送WM_PAINT,不過在它發送前,先調用GetUp
3、dateRect(hWnd,NULL,TRUE)看有無可繪制區域,如果沒有則不發送消息RedrawWindow()RedrawWindow()則是具有Invalidate()和UpdateWindow()的雙特性。聲明窗口的狀態為無效,并立即更新窗口,立即調用WM_PAINT消息處理。 系統為什么不在調用Invalidate時發送WM_PAINT消息呢?又為什么非要等應用消息隊列為空時才發送WM_PAINT消息呢?這是因為系統把在窗口中的繪制操作當作一種低優先級的操作,于是盡可能地推后做。不過這樣也有利于提高繪制的效率:兩個WM_PAINT消息之間通過InvalidateRect和Invali
4、ateRgn使之失效的區域就會被累加起來,然后在一個WM_PAINT消息中一次得到 更新,不僅能避免多次重復地更新同一區域,也優化了應用的更新操作。像這種通過InvalidateRect和InvalidateRgn來使窗口區域無效,依賴于系統。在合適的時機發送WM_PAINT消息的機 制實際上是一種異步工作方式,也就是說,在無效化窗口區域和發送WM_PAINT消息之間是有延遲的;有時候這種延遲并不是我們希望的,這時我們當然可以在無效化窗口區域后利用SendMessage 發送一條WM_PAINT消息來強制立即重畫,但不如使用Windows GDI為我們提供的更方便和強大的函數:UpdateWi
5、ndow和RedrawWindow。UpdateWindow會檢查窗口的Update Region,當其不為空時才發送WM_PAINT消息;RedrawWindow則給我們更多的控制:是否重畫非客戶區和背景,是否總是發送WM_PAINT消息而不管Update Region是否為空等。BeginPaint和WM_PAINT消息緊密相關。試一試在WM_PAINT處理函數中不寫BeginPaint會怎樣?程序會像進入了一個死循環一樣達到驚人的CPU占用率,你會發現程序總在處理一個接 一個的WM_PAINT消息。這是因為在通常情況下,當應用收到WM_PAINT消息時,窗口的Update Region都
6、是非空的(如果為空就不需要發送WM_PAINT消息了),BeginPaint的一個作用就是把該Update Region置為空,這樣如果不調用BeginPaint,窗口的Update Region就一直不為空,如前所述,系統就會一直發送WM_PAINT消息。BeginPaint和WM_ERASEBKGND消息也有關系。當窗口的Update Region被標志為需要擦除背景時,BeginPaint會發送WM_ERASEBKGND消息來重畫背景,同時在其返回信息里有一個標志表明窗口背景是否被重畫過。當我們用InvalidateRect和InvalidateRgn來把指定區域加到Update Reg
7、ion中時,可以設置該區域是否需要被擦除背景,這樣下一個BeginPaint就知道是否需要發送WM_ERASEBKGND消息了。另外要注意的一點是,BeginPaint只能在WM_PAINT處理函數中使用。以下是Invalidate函數的作用:void Invalidate( BOOL bErase = TRUE ); 該函數的作用是使整個窗口客戶區無效。窗口的客戶區無效意味著需要重繪,例如,如果一個被其它窗口遮住的窗口變成了前臺窗口,那么原來被遮住的部分就是無效的,需要重繪。這時Windows會在應用程序的消息隊列中放置WM_PAINT消息。MFC為窗口類提供了WM_PAINT的消息處理函數OnPaint,OnPaint負責重繪窗口。視圖類有一些例外,在視圖類的OnPaint函數中調用了OnDraw函數,實際的重繪工作由OnDraw來完成。參數bErase為TRUE時,重繪區域內的背景將被擦除,否則,背景將保持不變。 和 UpdateWindow( )區別在于:UpdateWindow( )的作用是使窗口立即重繪。調用Invalidate等函
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 未來農業電商發展試題及答案
- 旅游度假區景觀設計2025年旅游基礎設施評估報告
- 搬運實訓報告
- 工業污染源全面達標排放計劃實施方案2025:環保產業技術創新動態
- 家具設計中科技藝術結合的可能性試題及答案
- 小學教師教學反思與實踐評價試題及答案
- 江西中考生地試題及答案
- 聚焦2025年:機械制造企業服務化轉型下的技術創新與應用
- 美術近代史試題及答案
- 新能源汽車前沿科技考察試題及答案
- 運輸公司2024年防汛工作方案
- 2025年廣東省深圳市南山實驗教育集團中考一模英語試題(含答案)
- 公衛重精培訓試題及答案
- 統編版道德與法治四年級下冊第9課《生活離不開他們》精美課件
- 2025-2030中國汽車線控底盤行業市場現狀分析及競爭格局與投資發展研究報告
- 中華農耕文化歷史與現實知到課后答案智慧樹章節測試答案2025年春中國農業大學
- 中考語文試卷名著專題匯編《駱駝祥子》看圖題(含答案)(截至2024年)
- 設備采購方案投標文件(技術方案)
- 信息技術必修2信息系統與社會3.2《數據庫的構建》教學設計
- 氫能源項目融資計劃書
- 投標人對本項目合理化建議及改進措施
評論
0/150
提交評論