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

 更新时间:2020年4月25日 17:47  点击:1897
在自己画的窗口中,有时候会有闪烁现象。为什么会有闪烁现象呢?其实是因为程序在画窗口时需要用背景色清空显示区域,然后再画。由于这两者的反差比较大,就会被人眼睛捕捉到,感觉闪烁。
双缓冲就是先在内存中把图画好,然后直接复制到屏幕上去,这样的反差就比较小,也就不觉得闪烁了。




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,编译吧。

[!--infotagslink--]

相关文章

  • .net WINFORM的GDI双缓冲的实现方法

    下面小编就为大家分享一篇.net WINFORM的GDI双缓冲的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-09-22
  • C#双缓冲技术实例详解

    这篇文章主要介绍了C#双缓冲技术,结合实例形式较为详细的分析了C#双缓冲的功能,实现技巧与相关注意事项,需要的朋友可以参考下...2020-06-25
  • C#双缓冲实现方法(可防止闪屏)

    这篇文章主要介绍了C#双缓冲实现方法,结合实例形式分析了C#双缓冲的具体步骤与相关技巧,可实现防止闪屏的功能,需要的朋友可以参考下...2020-06-25
  • 基于WTL中使用双缓冲避免闪烁的解决方法

    本篇文章是对WTL中使用双缓冲避免闪烁的解决方法进行了详细的分析介绍,需要的朋友参考下...2020-04-25
  • 双缓冲解决VC++绘图时屏幕闪烁

    相信很多人在做图形界面开发时,常常会遇到屏幕闪烁的情况,当然我也不例外,下面我们就来详细探讨下这个问题的解决办法...2020-04-25
  • 解析在WTL下使用双缓冲的实现方法

    本篇文章是对在WTL下使用双缓冲的实现方法进行了详细的分析介绍,需要的朋友参考下...2020-04-25