服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 基于WTL中使用双缓冲避免闪烁的解决方法

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

2020-12-02 14:51C语言教程网 C/C++

本篇文章是对WTL中使用双缓冲避免闪烁的解决方法进行了详细的分析介绍,需要的朋友参考下

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

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


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

延伸 · 阅读

精彩推荐