手机
当前位置:查字典教程网 >编程开发 >C语言 >基于WTL中使用双缓冲避免闪烁的解决方法
基于WTL中使用双缓冲避免闪烁的解决方法
摘要:在自己画的窗口中,有时候会有闪烁现象。为什么会有闪烁现象呢?其实是因为程序在画窗口时需要用背景色清空显示区域,然后再画。由于这两者的反差比较...

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

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

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

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

【基于WTL中使用双缓冲避免闪烁的解决方法】相关文章:

基于内核线程的创建、使用和退出以及延时宏的补充说明介绍

c语言中 基于随机函数的使用详解

解析使用C++编写无错代码的方法技巧

使用C++实现全排列算法的方法详解

使用ShellClass获取文件属性详细信息的实现方法

C++ 关于STL中sort()对struct排序的方法

基于一个简单定长内存池的实现方法详解

关于STL中vector容器的一些总结

C++中的异或运算符^的使用方法

去掉vs2010中ipch文件和.sdf文件的解决方法

精品推荐
分类导航