OnPaint和OnEraseBkgnd的區別

2021-05-22 04:46:52 字數 1346 閱讀 3745

在mfc中 任何乙個window元件的繪圖 都是放在這兩個member function中

在設定上 onerasebkgnd()是用來畫底圖的 而onpaint()是用來畫主要物件的

舉例說明 乙個按鈕是灰色的 上面還有文字

則 onerasebkgnd()所做的事就是把按鈕畫成灰色

而onpaint()所做的事 就是畫上文字

既然這兩個member function都是用來畫出元件的

那為何還要分onpaint() 與 onerasebkgnd() 呢

其 實onpaint() 與 onerasebkgnd() 特性是有差的

1. onerasebkgnd()的要求是快速 在裡面的繪圖程式最好是不要太耗時間

因為 每當window元件有任何小變動 都會馬上呼叫onerasebkgnd()

2. onpaint() 是只有在程式有空閒的時候才會被呼叫

3. onerasebkgnd() 是在 onpaint() 之前呼叫的

所 以 onpaint()被呼叫一次之前 可能會呼叫onerasebkgnd()好幾次

如果我們是乙個在做圖形化使用者介面的人

常會需要把一張美美的設為我們dialog的底圖

把繪圖的程式**放在 onpaint() 之中 可能會常碰到一些問題

比方說拖曳乙個視窗在我們做的dialog上面一直移動

則dialog會變成灰色 直到動作停止才恢復

這是因為每次需要重繪的時候 程式都會馬上呼叫onerasebkgnd()

onerasebkgnd()就把 dialog畫成灰色

而只有動作停止之後 程式才會呼叫onpaint() 這時才會把我們要畫的底圖貼上去

這 個問題的解法 比較差點的方法是把onerasebkgnd() 改寫成不做事的function

如下所示

bool cmydlg::onerasebkgnd(cdc* pdc)

以上本來是會呼叫 cdialog::onerasebkgnd() 但是如果我們不呼叫的話

程式便不會畫上灰色的底色了

比較好 的做法是直接將繪圖的程式從onpaint()移到onerasebkgnd()來做

如下所示

// m_bmpbkgnd 為一cbitmap物件 且事先早已載入我們的底圖

// 底圖的大小與我們的視窗client大小一致

bool cmydlg::onerasebkgnd(cdc* pdc)

特別要注意的是 取得重畫大小是使用getupdaterect() 而不是getclientrect()

如果使用getclientrect() 會把不該重畫的地方重畫 

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