源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

基于WTL中使用双缓冲避免闪烁的解决方法

  • 时间:2022-03-28 09:57 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:基于WTL中使用双缓冲避免闪烁的解决方法
在自己画的窗口中,有时候会有闪烁现象。[b]为什么会有闪烁现象呢?[/b]其实是因为程序在画窗口时需要用背景色清空显示区域,然后再画。由于这两者的反差比较大,就会被人眼睛捕捉到,感觉闪烁。 双缓冲就是先在内存中把图画好,然后直接复制到屏幕上去,这样的反差就比较小,也就不觉得闪烁了。 [img]http://files.jb51.net/file_images/article/201305/201305171620473.png[/img] [b]WTL中的CDoubleBufferImpl [/b]WTL中有现成的双缓冲类实现,可以很方便的使用就达到效果。 CDoubleBufferImpl 在AtlFrame.h中。 [b]1.首先继承自CDoubleBufferImpl [/b]
[u]复制代码[/u] 代码如下:
class TCtrl:         public CWindowImpl< TCtrl>,          public WTL::CDoubleBufferImpl<TCtrl>  // 继承双缓冲类
[b]2.由于双缓冲类中已经处理了WM_ERASEBKGND 和WM_PAINT消息,所以需要从你的代码中删除对这些消息的处理。然后加上双缓冲的消息处理即可。 [/b]
[u]复制代码[/u] 代码如下:
 BEGIN_MSG_MAP(TCtrl) //        MESSAGE_HANDLER(WM_PAINT,        OnPaint)         CHAIN_MSG_MAP( WTL::CDoubleBufferImpl<TCtrl>)     END_MSG_MAP()
[b]3.增加一个DoPaint函数,函数声明如下: [/b]
[u]复制代码[/u] 代码如下:
void DoPaint(CDCHandle dc);
[b]4.将原来OnPaint函数中的代码移到DoPaint中,注意原来的CPaintDC需要改用参数中的CDCHandler [/b]
[u]复制代码[/u] 代码如下:
void TCtrl::DoPaint( CDCHandle dc ) {     //CPaintDC dc(m_hWnd);     dc.MoveTo( xx… )}
OK,编译吧。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部