文章目錄
-
- WTL中的CDoubleBufferImpl
- 參考資料
在自己畫的視窗中,有時候會有閃爍現象。為什麼會有閃爍現象呢?其實是因為程式在畫視窗時需要用背景色清空顯示地區,然後再畫。由於這兩者的反差比較大,就會被人眼睛捕捉到,感覺閃爍。
雙緩衝就是先在記憶體中把圖畫好,然後直接複製到螢幕上去,這樣的反差就比較小,也就不覺得閃爍了。
WTL中的CDoubleBufferImpl
WTL中有現成的雙緩衝類實現,可以很方便的使用就達到效果。
CDoubleBufferImpl 在AtlFrame.h中。
1.首先繼承自CDoubleBufferImpl
class TCtrl: public CWindowImpl< TCtrl>, public WTL::CDoubleBufferImpl<TCtrl> // 繼承雙緩衝類
2.由於雙緩衝類中已經處理了WM_ERASEBKGND 和WM_PAINT訊息,所以需要從你的代碼中刪除對這些訊息的處理。然後加上雙緩衝的訊息處理即可。
BEGIN_MSG_MAP(TCtrl)// MESSAGE_HANDLER(WM_PAINT, OnPaint) CHAIN_MSG_MAP( WTL::CDoubleBufferImpl<TCtrl>) END_MSG_MAP()
3.增加一個DoPaint函數,函式宣告如下:
void DoPaint(CDCHandle dc);
4.將原來OnPaint函數中的代碼移到DoPaint中,注意原來的CPaintDC需要改用參數中的CDCHandler
void TCtrl::DoPaint( CDCHandle dc ){ //CPaintDC dc(m_hWnd);
dc.MoveTo( xx… )
}
OK,編譯吧。
參考資料
VC畫圖不閃爍的方法(雙緩衝技術)
http://hi.baidu.com/lovefqing/blog/item/3f86cdb6cc5c75f830add174.html
走近WTL--GDI篇
http://blog.iceyer.net/walk_up_to_wtl_gdi_part
Visual C++中實現雙緩衝的基本原理
http://www.builder.com.cn/2007/1016/558583.shtml