基于WTL中使用雙緩沖避免閃爍的解決方法
更新時間:2013年05月17日 16:29:32 作者:
本篇文章是對WTL中使用雙緩沖避免閃爍的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
在自己畫的窗口中,有時候會有閃爍現(xiàn)象。為什么會有閃爍現(xiàn)象呢?其實(shí)是因?yàn)槌绦蛟诋嫶翱跁r需要用背景色清空顯示區(qū)域,然后再畫。由于這兩者的反差比較大,就會被人眼睛捕捉到,感覺閃爍。
雙緩沖就是先在內(nèi)存中把圖畫好,然后直接復(fù)制到屏幕上去,這樣的反差就比較小,也就不覺得閃爍了。
class TCtrl:
public CWindowImpl< TCtrl>,
public WTL::CDoubleBufferImpl<TCtrl> // 繼承雙緩沖類
2.由于雙緩沖類中已經(jīng)處理了WM_ERASEBKGND 和WM_PAINT消息,所以需要從你的代碼中刪除對這些消息的處理。然后加上雙緩沖的消息處理即可。
BEGIN_MSG_MAP(TCtrl)
// MESSAGE_HANDLER(WM_PAINT, OnPaint)
CHAIN_MSG_MAP( WTL::CDoubleBufferImpl<TCtrl>)
END_MSG_MAP()
3.增加一個DoPaint函數(shù),函數(shù)聲明如下:
void DoPaint(CDCHandle dc);
4.將原來OnPaint函數(shù)中的代碼移到DoPaint中,注意原來的CPaintDC需要改用參數(shù)中的CDCHandler
void TCtrl::DoPaint( CDCHandle dc )
{
//CPaintDC dc(m_hWnd); dc.MoveTo( xx… )}
OK,編譯吧。
雙緩沖就是先在內(nèi)存中把圖畫好,然后直接復(fù)制到屏幕上去,這樣的反差就比較小,也就不覺得閃爍了。

WTL中的CDoubleBufferImpl
WTL中有現(xiàn)成的雙緩沖類實(shí)現(xiàn),可以很方便的使用就達(dá)到效果。
CDoubleBufferImpl 在AtlFrame.h中。
1.首先繼承自CDoubleBufferImpl
復(fù)制代碼 代碼如下:
class TCtrl:
public CWindowImpl< TCtrl>,
public WTL::CDoubleBufferImpl<TCtrl> // 繼承雙緩沖類
2.由于雙緩沖類中已經(jīng)處理了WM_ERASEBKGND 和WM_PAINT消息,所以需要從你的代碼中刪除對這些消息的處理。然后加上雙緩沖的消息處理即可。
復(fù)制代碼 代碼如下:
BEGIN_MSG_MAP(TCtrl)
// MESSAGE_HANDLER(WM_PAINT, OnPaint)
CHAIN_MSG_MAP( WTL::CDoubleBufferImpl<TCtrl>)
END_MSG_MAP()
3.增加一個DoPaint函數(shù),函數(shù)聲明如下:
復(fù)制代碼 代碼如下:
void DoPaint(CDCHandle dc);
4.將原來OnPaint函數(shù)中的代碼移到DoPaint中,注意原來的CPaintDC需要改用參數(shù)中的CDCHandler
復(fù)制代碼 代碼如下:
void TCtrl::DoPaint( CDCHandle dc )
{
//CPaintDC dc(m_hWnd); dc.MoveTo( xx… )}
OK,編譯吧。
相關(guān)文章
C++深入講解new與deleted關(guān)鍵字的使用
這篇文章主要介紹了C++中new與deleted關(guān)鍵字的使用,new在動態(tài)內(nèi)存中為對象分配空間并返回一個指向該對象的指針;delete接受一個動態(tài)對象的指針, 銷毀該對象, 并釋放與之關(guān)聯(lián)的內(nèi)存2022-05-05
C語言實(shí)現(xiàn)靜態(tài)版通訊錄的代碼分享
這篇文章主要為大家詳細(xì)介紹了如何利用C語言實(shí)現(xiàn)一個簡單的靜態(tài)版通訊錄,主要運(yùn)用了結(jié)構(gòu)體,一維數(shù)組,函數(shù),分支與循環(huán)語句等等知識,需要的可以參考一下2023-01-01
C++中的函數(shù)指針與函數(shù)對象的總結(jié)
以下是對C++中的函數(shù)指針與函數(shù)對象的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下2013-07-07
基于malloc與free函數(shù)的實(shí)現(xiàn)代碼及分析
本篇文章介紹了malloc與free函數(shù)的實(shí)現(xiàn)代碼及分析。需要的朋友參考下2013-05-05
用C/C++代碼檢測ip能否ping通(配合awk和system可以做到批量檢測)
今天小編就為大家分享一篇關(guān)于用C/C++代碼檢測ip能否ping通(配合awk和system可以做到批量檢測),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-04-04
C++實(shí)現(xiàn)簡單通訊錄管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡單通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02

