程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言基礎知識 >> 基於WTL中使用雙緩沖避免閃爍的解決方法

基於WTL中使用雙緩沖避免閃爍的解決方法

編輯:C語言基礎知識
在自己畫的窗口中,有時候會有閃爍現象。為什麼會有閃爍現象呢?其實是因為程序在畫窗口時需要用背景色清空顯示區域,然後再畫。由於這兩者的反差比較大,就會被人眼睛捕捉到,感覺閃爍。
雙緩沖就是先在內存中把圖畫好,然後直接復制到屏幕上去,這樣的反差就比較小,也就不覺得閃爍了。




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,編譯吧。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved