天天看點

繪圖ondraw重新繪制OnDraw的重新繪制

OnDraw的重新繪制

相信有不少小夥伴在繪制圖形過程中遇到過想重新整理界面或者想重繪圖形吧。我最近在做一個關于繪圖的程式也遇到了這個問題。當然網上也有不少解決辦法的問題,但是我感覺不太全面。下面我較為全面的分享一下我的解決辦法。

1.Invalidate()

網上有些解決方法就是加一個Invalidate()或者Invalidate( BOOL bErase = TRUE ); 就好了,但是大多數是沒用的,首先我們要知道Invalidate()是強制系統進行重畫,但是不是馬上進行重畫。他的作用是先使整個視窗客戶區無效。視窗的客戶區無效意味着需要重繪,例如,如果一個被其它視窗遮住的視窗變成了前台視窗,那麼原來被遮住的部分就是無效的,需要重繪。因為Invalidate()隻是通知系統,此 時的視窗已經變為無效。這時Windows會在應用程式的消息隊列中放置WM_PAINT消息。MFC為視窗類提供了WM_PAINT的消息處理函數OnPaint,OnPaint負責重繪視窗。視圖類有一些例外,在視圖類的OnPaint函數中調用了OnDraw函數,實際的重繪工作由OnDraw來完成。參數bErase為TRUE時,重繪區域内的背景将被擦除,否則,背景将保持不變。當執行到WM_PAINT消息時才會對視窗進行重繪。

2.UpdateWindow()

先判斷GetUpdateRect(hWnd,NULL,TRUE)看有無可繪制的客戶區域,如果有,發送WM_PAINT消息。如果沒有,則不發送WM_PAINT。它使視窗立即重繪。調用Invalidate函數後視窗不會立即重繪,由于WM_PAINT消息的優先級很低,它需要等消息隊列中的其它消息發送完後才能被處理。調用UpdateWindow函數可使WM_PAINT被直接發送到目标視窗,進而導緻視窗立即重繪。

3.RedrawWindow()

RedrawWindow()的功能就像Invalidate()和UpdateWindow()的結合體。可聲明無效區,并立即跟新。

有興趣的小夥伴可以寫一個簡單的動态繪圖試一試他們的差別。

其實OnDraw的觸發機制很多,也可以用Ondraw來調用一個函數,而函數的開關用bool來控制,當改變bool值開關時也可以觸發ondraw的繪圖,進而實作ondraw的重新整理。