文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>C++零食:WTL中使用双缓冲避免闪烁

C++零食:WTL中使用双缓冲避免闪烁

时间:2010-09-02  来源:小杰

在自己画的窗口中,有时候会有闪烁现象。为什么会有闪烁现象呢?其实是因为程序在画窗口时需要用背景色清空显示区域,然后再画。由于这两者的反差比较大,就会被人眼睛捕捉到,感觉闪烁。

双缓冲就是先在内存中把图画好,然后直接复制到屏幕上去,这样的反差就比较小,也就不觉得闪烁了。

 

 

 

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(KHeaderCtrl)
//        MESSAGE_HANDLER(WM_PAINT,        OnPaint)
        CHAIN_MSG_MAP( WTL::CDoubleBufferImpl<KHeaderCtrl>)
    END_MSG_MAP()

3.增加一个DoPaint函数,函数声明如下:

void DoPaint(CDCHandle dc);

4.将原来OnPaint函数中的代码移到DoPaint中,注意原来的CPaintDC需要改用参数中的CDCHandler

void KHeaderCtrl::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

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载