MFC中的Invalidate、UpdateWindow()、OnDraw、OnPaint函數的做用

Invalidate()是強制系統進行重畫,可是不必定就立刻進行重畫。由於Invalidate()只是通知系統,此時的窗口已經變爲無效。強制系統調用WM_PAINT,而這個消息只是Post就是將該消息放入消息隊列。當執行到WM_PAINT消息時纔會對敞口進行重繪;
UpdateWindow只向窗體發送WM_PAINT消息,在發送以前判斷GetUpdateRect(hWnd,NULL,TRUE)看有無可繪製的客戶區域,若是沒有,則不發送WM_PAINT;
當調用Invalidate以後,Invalidate()使窗口客戶區無效,並向消息隊列中寄送一個WM_PAINT消息,假如此時消息隊列中沒有要處理的其餘消息,則此時窗口當即會重繪(由於WM_PAINT會當即獲得處理),若是消息隊列中有其餘消息,那麼WM_PAINT就排隊等,這樣就可能會存在一個不能即時刷新窗口的問題;屏幕不必定立刻更新,由於WM_PAINT消息不必定在隊列頭部框架

而調用UpdateWindow會使WM_PAINT消息立刻執行的,繞過了消息隊列(不進隊),直接向窗口客戶區發送WM_PAINT消息,使得窗口當即更新。
若是調用Invalidate以後想立刻更新屏幕,那就加上UpdateWindow()這條語句函數

 

OnDraw與OnPaint有什麼區別?
OnPaint是WM_PAINT消息的消息處理函數,在OnPaint中調用OnDraw,通常來講,用戶本身的繪圖代碼應放在OnDraw中。對象

OnPaint()是CWnd的類成員,負責響應WM_PAINT消息。OnDraw()是CVIEW的成員函數,沒有響應消息的功能.當視圖變得無效時(包括大小的改變,移動,被遮蓋等等),Windows發送WM_PAINT消息。該視圖的OnPaint處理函數經過建立CPaintDC類的DC對象來響應該消息並調用視圖的OnDraw成員函數.OnPaint最後也要調用OnDraw,所以通常在OnDraw函數中進行繪製。
The WM_PAINT message is sent when the UpdateWindow or RedrawWindowmember function is called.
在OnPaint中,將調用BeginPaint,用來得到客戶區的顯示設備環境,並以此調用GDI函數執行繪圖操做。在繪圖操做完成後,將調用EndPaint以釋放顯示設備環境。而OnDraw在BeginPaint與EndPaint間被調用。隊列

1)在mfc結構裏OnPaint是CWnd的成員函數. OnDraw是CView的成員函數.
2)OnPaint()調用OnDraw(),OnPrint也會調用OnDraw(),因此OnDraw()是顯示和打印的共同操做。圖片

 

這兩個函數有區別也有聯繫:文檔

一、區別:OnDraw是一個純虛函數,定義爲virtual void OnDraw(CDC* pDC ) =0; 而OnPaint是一個消息響應函數,它響應了WM_PANIT消息,也是是窗口重繪消息。消息隊列

二、聯繫:咱們通常在視類中做圖的時候,每每不直接響應WM_PANIT消息,而是重載OnDraw純虛函數,這是由於在CVIEW類中的WM_PANIT消息響應函數中調用了OnDraw函數,若是在CMYVIEW類中響應了WM_PAINT消息,不顯式地調用OnDraw函數的話,是不會在窗口重繪的時候調用OnDraw函數的。io

應用程序中幾乎全部的繪圖都在視圖的 OnDraw成員函數中發生,必須在視圖類中重寫該成員函數。(鼠標繪圖是個特例,這在經過視圖解釋用戶輸入中討論。)function

 

OnDraw重寫:
經過調用您提供的文檔成員函數獲取數據。
經過調用框架傳遞給 OnDraw 的設備上下文對象的成員函數來顯示數據。
當文檔的數據以某種方式更改後,必須重繪視圖以反映該更改。默認的 OnUpdate實現使視圖的整個工做區無效。當視圖變得無效時,Windows 將 WM_PAINT 消息發送給它。該視圖的 OnPaint處理函數經過建立 CPaintDC 類的設備上下文對象來響應該消息並調用視圖的 OnDraw 成員函數。date

當沒有添加WM_PAINT消息處理時,窗口重繪時,由OnDraw來進行消息響應...當添加WM_PAINT消息處理時,窗口重繪時,WM_PAINT消息被投遞,由OnPaint來進行消息響應.這時就不能隱式調用OnDraw了.必須顯式調用(  CDC *pDC=GetDC(); OnDraw(pDC);  )..
隱式調用:當由OnPaint來進行消息響應時,系統自動調用CView::OnDraw(&pDC).

 

咱們通常用OnPaint維護窗口的客戶區(例如咱們的窗口客戶區加一個背景圖片),用OnDraw維護視圖的客戶區(例如咱們經過鼠標在視圖中畫圖

相關文章
相關標籤/搜索