
我創建了一個MFC畫圖程式,還有一個改變線寬的對話框,但是只要這個對話框移動到繪圖區,就會出現重影,不知道為什么?求大神助攻。
uj5u.com熱心網友回復:
系統重繪時,先呼叫OnEraseBkGnd擦除視窗的現有內容,再呼叫OnPaint繪制新內容。問題就產生的:在OnEraseBkGnd中,如果你不呼叫原來預設的OnEraseBkGnd只是重畫背景則不會有閃爍。而在OnPaint里面,由于它隱含的呼叫了OnEraseBkGnd,而你又沒有處理OnEraseBkGnd函式,這時就和視窗預設的背景刷相關了。預設的OnEraseBkGnd操作使用視窗的預設背景刷重繪背景(一般情況下是白刷),而隨后你又自己重畫背景造成螢屏閃動。
另外的一個問題是OnEraseBkGnd不是每次都會被呼叫的。如果你呼叫Invalidate的時候引數為TRUE,那么在OnPaint里面隱含呼叫BeginPaint的時候就產生WM_ERASEBKGND訊息,如果引數是FALSE 則不會重刷背景。
解決方法有:
1. 用OnEraseBkGnd實作,不要呼叫原來的OnEraseBkGnd函式。
2. 用OnPaint實作,同時多載OnEraseBkGnd,并在其中直接回傳TRUE。
3. 用OnPaint實作,創建視窗時設定背景刷為空。
4. 用OnPaint實作,但是要求重繪時用Invalidate(FALSE)這樣的函式。(不過這種情況下,視窗覆寫等造成的重繪還是要閃一下,所以不是徹底的解決方法)
uj5u.com熱心網友回復:
+1
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/118173.html
標籤:基礎類
上一篇:MFC LoadFrame(IDR_MAINFRAME)報錯Warning: constructing COleException,scode = E_FAIL
