OnPaint和OnDraw有什麼區別?

2021-06-15 20:13:49 字數 1503 閱讀 8422

cpaintdc和cclientdc又有什麼區別?

1) 在mfc結構裡 onpaint是cwnd的成員函式. ondraw是cview的成員函式. 2) onpaint()呼叫ondraw(),onprint也會呼叫ondraw(),所以ondraw()是顯示和列印的共同操作。

onpaint是wm_paint訊息引發的重繪訊息處理函式,在onpaint中會呼叫ondraw來進行繪圖。 onpaint中首先構造乙個cpaintdc類得例項,然後一這個例項為引數來呼叫虛函式onpreapredc來進行一些繪製前的一些處理,比設定對映模式,最後呼叫ondraw。而ondraw和onpreapredc不是訊息處理函式。 所以不是因為重繪訊息所引發的onpaint導致ondraw被呼叫時,比如在onlbuttondown等訊息處理函式中繪圖時,要先自己呼叫onpreapredc。

至於cpaintdc和cclientdc根本是兩回事情 cpaintdc是乙個裝置環境類,在onpaint中作為引數傳遞給onpreapredc來作裝置環境的設定。真正和cclientdc具有可比性的是cwindowdc,他們乙個是描述客戶區域,乙個是描述整個螢幕

如果是對cview或從cview類派生的視窗繪圖時應該用ondraw

ondraw()和onpaint()有什麼區別呢?首先:我們先要明確cview類派生自cwnd類。而onpaint()是cwnd的類成員,同時負責響應wm_paint訊息。ondraw()是cview的成員函式,並且沒有響應訊息的功能。這就是為什麼你用vc成的程式**時,在檢視類只有ondraw沒有onpaint的原因。 其次:我們在第《每天跟我學mfc》3的開始部分已經說到了。要想在螢幕上繪圖或顯示圖形,首先需要建立裝置環境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吧

ondraw中可以繪製使用者區域 onpaint中只是當視窗無效時重繪不會保留cclientdc繪製的內容

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