C++零食:WTL中使用雙緩衝避免閃爍

來源:互聯網
上載者:User
文章目錄
  •  
  • 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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.