OnPaint 與OnDraw的區別

2021-06-21 11:33:49 字數 1175 閱讀 7400

首先我們要知道,onpaint()是cwnd的類成員函式,負責響應wm_paint訊息。

其次,在單文件應用程式中,cview派生自cwnd。在對話方塊應用程式中,cdialog也派生自cwnd。也就是說cview和dialog都繼承了onpaint函式(當然進行了重寫)。(這裡要清除乙個誤區:我們在單文件應用程式裡view類只看到了ondraw函式,而在對話方塊應用程式裡只看到了onpaint函式,就以為ondraw是單文件才有,onpaint 是對話方塊才有的。這是不正確的,單文件裡也有onpaint 函式,不過是繼承的cwnd的。)

那麼再說ondraw (),它其實是cview自己的成員函式(與基於對話方塊的應用程式沒多大關係),並沒有沒有響應訊息的功能,所以光有它是不行的。當檢視變得無效時(包括大小的改變,移動,被遮蓋等等),windows傳送wm_paint訊息,該檢視的onpaint 處理函式通過建立cpaintdc類(該類專門用於響應wm_paint訊息,一般就用在onpaint函式中)的乙個物件來響應該訊息並呼叫檢視的ondraw函式。下面是cview類的onpaint函式。

///cview預設的標準的重畫函式

void cview::onpaint() //見viewcore.cpp

我們可以看出,單文件應用程式繪圖時還是呼叫了onpaint函式,因為只有它才能響應wm_paint訊息,只是它最後呼叫了ondraw函式而已。所以我們要處理的**放在ondraw函式中即可。即對cview或從cview類派生的視窗繪圖時應該用ondraw。

而在對話方塊應用程式中,由於沒有ondraw函式,所以重繪訊息處理都放在了onpaint()函式中(當然需要自己重寫)。

那為什麼cview要多乙個ondraw函式呢?也直接用onpaint不就行了嗎?

我們必須要明白:

1.onpaint函式是乙個訊息響應函式,ondraw函式是cview自己的乙個純虛函式,不能響應訊息。兩者這是兩者本質不同之處。

2.onpaint只對螢幕輸出有效,而ondraw對螢幕和印表機都有效,兩者適用範圍不同。這也是為什麼單文件程式裡有列印功能而           對話方塊應用程式沒有。

3.ondraw()在初始化時觸發,它用來處理第一次繪製(dc); onpaint()在每次檢視被啟用時觸發,重新繪製(重新整理)。

總結:說白了,onpaint函式是檢視和對話方塊應用程式都有的,而ondraw函式是檢視多出來的。以上均是個人愚見,如有錯誤,請指出,不勝感激。

OnPaint()與OnDraw的區別

onpaint 與ondraw的區別 1 invalidate 和invalidaterect 其實是觸發對onpaint 函式的呼叫,onpaint 函式呼叫ondraw 函式,ondraw函式還需要同時支援印表機輸出。onpaint 函式和onprint 函式都要呼叫ondraw 於是同樣的繪圖...

OnDraw和OnPaint的區別

1 cview類是由cwnd類派生而來的,ondraw是cview類的虛函式,onpaint是cwnd的類成員函式,負責相應wm paint訊息。2 一般是這樣 視窗發出乙個wm paint訊息,onpaint函式響應這個訊息,然後這個函式再呼叫ondraw函式。雖然cview類中的ondraw函式...

OnPaint和OnDraw的區別

問題 我在檢視畫的圖象或者文字,當視窗改變後為什麼不見了?ondraw 和onpaint 兩個都是解決上面的問題,有什麼不同?答 ondraw 和onpaint 好象兄弟倆,因為它們的工作類似。至於不見了的問題簡單,因為當你的視窗改變後,會產生無效區域,這個無效的區域需要重畫。一般windows會傳...