MFC閃屏解決方案

這兩天一直在做UI設計,由於公司沒有用到商業的Direct UI等界面庫。所以碼農們必須自己繪製自己的控件,於是乎這個編寫UI的任務就落在我這個新碼農身上了。然後以前一直逃避的問題有不期而遇。思密達。
問題一、自己繪製的背景把界面上原有的控件遮擋住了,爲了解決這個問題,可把我等吊絲累壞了。
方案一、繪製完背景,然後再獲取所有控件的區域,使其無效。於是問題解決了,可是新問題又來了,就是閃屏問題。這個問題就是由於背景與控件顏色覆蓋造成的。也就是說着這種方案太監了。
方案二、把所有的控件的矩形計算出來,在繪製的時候去除這些矩形。對於這種方案,我只是想了想,應該可以。不過太難了,我是沒有能力做到。
方案三、偶然的機會看到一句話:把dialog的ClipChildren屬性設置爲true。意思就是,在繪製窗口的時候,把控件區域剪切掉,等繪製完成後在複製回來,這個屬性簡直就是爲繪製量身定製的,於是上面的問題解決了,並且如此簡單,就點一下。原來解決方案如此簡單。
如果頻繁進行繪製刷新,這個毫無疑問會出現閃屏的情況。
方案一、運用雙緩衝,無壓力。就是在每次繪製的時候,直接貼上去。
方案二、在畫背景之前把背景畫刷設置爲NULL_BRUSH。系統無法繪製。
方案三、把繪製背景的函數(OnEraseBkgnd(CDC*   pDC))內容注視掉,用return true替代,然後系統就沒有辦法利用默認畫刷繪製背景了。但是後面兩種方式解決了閃爍,但是界面會是一團糟。


使用GDI資源小結:
首先我們都知道有借有還這個定律,所以在學習C++的時候無比遵循這個規律,否則你會連連碰壁。
在使用帶H的句柄的時候,例如:HBITMAP等,用完之後記得DeleteObject;
而對於帶C的GDI封裝類,則沒有這個必要,以爲在對象析構的時候,系統已經把他們釋放了。如果你把系統資源句柄與類Detach了,那麼你就需要接手系統資源管理,否則就要出現系統資源泄漏的。
用CDC的時候,如果創建了內存Dc用完之後也需要DeleteDc.....



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章