VC中Ondraw 和OnPrint 的區別

2021-05-25 17:54:26 字數 1141 閱讀 6351

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

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

ondraw()和onpaint()有什麼區別呢?

首先:我們先要明確cview類派生自cwnd類。而onpaint()是cwnd的類成員,同時負 責響應wm_paint訊息。ondraw()是cview的成員函式,並且沒有響應訊息的功能。這就是為什麼你用vc的程式**時,在檢視類只有 ondraw沒有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()函式強制的重畫視窗,具體的請參考msdn

p.s.此小結是在我查這方面資料時找到的,在此記錄。

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會傳...

OnPaint和OnDraw的區別

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