OnPaint和OnDraw的區別

2022-09-08 10:48:11 字數 1531 閱讀 9325

問題:我在檢視畫的圖象或者文字,當視窗改變後為什麼不見了?ondraw()和onpaint()兩個都是解決上面的問題,有什麼不同?

答:ondraw()和onpaint()好象兄弟倆,因為它們的工作類似。

至於不見了的問題簡單,因為當你的視窗改變後,會產生無效區域,這個無效的區域需要重畫。一般windows會傳送兩個訊息wm_paint(通知客戶區 有變化)和wm_ncpaint(通知非客戶區有變化)。非客戶區的重畫系統自己搞定了,而客戶區的重畫需要我們自己來完成。這就需要ondraw()或 onpaint()來重畫視窗。

ondraw()和onpaint()有什麼區別呢?首先:我們先要明確cview類派生自cwnd類。而onpaint()是cwnd的類成員,同時負責響應wm_paint訊息。ondraw()是cview的成員函式,並且沒有響應訊息的功能。這就是為什麼你用vc成的程式**時,在檢視類只有 ondraw沒有onpaint的原因。在基於對話方塊的程式中,只有onpaint函式。

其次,要想在螢幕上繪圖或顯示圖形,首先需要建立裝置環境dc。其實dc是乙個資料結構,它包含輸 出裝置(不單指你17寸的純屏顯示器,還包括印表機之類的輸出裝置)的繪圖屬性的描述。mfc提供了cpaintdc類和cwindwodc類來實時的響 應,而cpaintdc支援重畫。

當檢視變得無效時(包括大小的改變,移動,被遮蓋等等),windows 將 wm_paint 訊息傳送給它。該檢視的 onpaint 處理函式通過建立cpaintdc 類的dc物件來響應該訊息並呼叫檢視的 ondraw 成員函式。通常我們不必編寫重寫的 onpaint 處理成員函式。

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

void cview::onpaint()

既然onpaint最後也要呼叫ondraw,因此我們一般會在ondraw函式中進行繪製。下面是乙個典型的程式

///檢視中的繪圖**首先檢索指向文件的指標,然後通過dc進行繪圖呼叫。

void cmyview::ondraw( cdc* pdc )

最後:現在大家明白這哥倆之間的關係了吧。因此我們一般用onpaint維護視窗的客戶區(例如我們的視窗客戶區加乙個背景),用ondraw維護檢視的客戶區(例如我們通過滑鼠在檢視中畫圖)。當然你也可以不按照上面規律來,只要達到目的並且沒有問題,怎麼幹都成。

補充:我們還可以利用invalidate(),validatergn(),validaterect()函式強制的重畫視窗

這兩個函式有區別也有聯絡:

區別:ondraw是乙個純虛函式,定義為virtual void ondraw( cdc* pdc ) = 0; 而onpaint是乙個訊息響應函式,它響應了wm_panit訊息,是視窗重繪訊息。

聯絡:我們一般在視類中作圖的時候,往往不直接響應wm_panit訊息,而是過載ondraw純虛函式,這是因為在cview類中的wm_panit訊息響應函式中呼叫了ondraw函式,如果在cmyview類中響應了wm_paint訊息,不顯式地呼叫ondraw函式的話,是不會在視窗重繪的時候呼叫ondraw函式的。

應用程式中幾乎所有的繪圖都在檢視的 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會傳...

OnDraw和OnPaint函式的區別

cwnd onpaint 是cwnd類的成員函式,是wm paint 訊息的響應函式.當你呼叫cwnd updatewindow cwnd redrawwindow 時,或者視窗被其他視窗覆蓋,改變大小等事件就會產生wm paint 訊息.你可以在cwnd派生的子類中使用它.cview ondraw...