WTL学习笔记(5)双缓冲技术和动画(BufferedPaint)
2011-08-10 20:37
405 查看
Vista+添加了相关函数对GDI双缓冲进行了支持,下面是wtl进行的封装
1.CBufferedPaint
对相关的BufferedPaint函数进行封装
class CBufferedPaint { public: HPAINTBUFFER m_hPaintBuffer; CBufferedPaint() : m_hPaintBuffer(NULL) { } ~CBufferedPaint() { ATLVERIFY(SUCCEEDED(End())); } bool IsNull() const { return (m_hPaintBuffer == NULL); } HPAINTBUFFER Begin(HDC hdcTarget, const RECT* prcTarget, BP_BUFFERFORMAT dwFormat, BP_PAINTPARAMS* pPaintParams, HDC* phdcPaint) { ATLASSERT(m_hPaintBuffer == NULL); m_hPaintBuffer = ::BeginBufferedPaint(hdcTarget, prcTarget, dwFormat, pPaintParams, phdcPaint); return m_hPaintBuffer; } HRESULT End(BOOL bUpdate = TRUE) { HRESULT hRet = S_FALSE; if(m_hPaintBuffer != NULL) { hRet = ::EndBufferedPaint(m_hPaintBuffer, bUpdate); m_hPaintBuffer = NULL; } return hRet; } … };
好像构造函数和析构函数中没有添加BufferedPaintInit和BufferedPaintUnInit函数,使用相关函数必须先调用BufferedPaintInit,结束时调用BufferedPaintUnInit
2.CBufferedPaintBase
CBufferedPaintBase封装了BufferedPaintInit和BufferedPaintUnInit函数,IsBufferedPaintSupported判断必须是vista+
class CBufferedPaintBase { public: static int m_nIsBufferedPaintSupported; CBufferedPaintBase() { if(IsBufferedPaintSupported()) ATLVERIFY(SUCCEEDED(::BufferedPaintInit())); } ~CBufferedPaintBase() { if(IsBufferedPaintSupported()) ATLVERIFY(SUCCEEDED(::BufferedPaintUnInit())); } static bool IsBufferedPaintSupported() { if(m_nIsBufferedPaintSupported == -1) { CStaticDataInitCriticalSectionLock lock; if(FAILED(lock.Lock())) { ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CBufferedPaintBase::IsBufferedPaintSupported.\n")); ATLASSERT(FALSE); return false; } if(m_nIsBufferedPaintSupported == -1) m_nIsBufferedPaintSupported = RunTimeHelper::IsVista() ? 1 : 0; lock.Unlock(); } ATLASSERT(m_nIsBufferedPaintSupported != -1); return (m_nIsBufferedPaintSupported == 1); } };
3.CBufferedPaintImpl
CBufferedPaintImpl继承了CBufferedPaintBase,并在内部调用了CBufferedPaint的相关方法
4.CBufferedPaintWindowImpl
继承自CBufferedPaintImpl,默认实现BufferedPaint功能
参考:
/article/4589322.html
http://www.codeguru.com/cpp/w-p/vista/print.php/c15709/(源码示例参考)
动画支持
5.CBufferedAnimationBeginBufferedAnimation,EndBufferedAnimation,BufferedPaintRenderAnimation是新增了三个函数,可以在画图时提供动画支持.
CBufferedAnimation封装了这3个函数
6.CBufferedAnimationImpl
除了了解上面三个函数之外,动画肯定需要提供默认的动画效果,BP_ANIMATIONPARAMS用来设置动画效果和动画间隔时间
// BP_ANIMATIONSTYLE typedef enum _BP_ANIMATIONSTYLE { BPAS_NONE, // No animation BPAS_LINEAR, // Linear fade animation BPAS_CUBIC, // Cubic fade animation BPAS_SINE // Sinusoid fade animation } BP_ANIMATIONSTYLE; // BP_ANIMATIONPARAMS typedef struct _BP_ANIMATIONPARAMS { DWORD cbSize; DWORD dwFlags; // BPAF_ flags BP_ANIMATIONSTYLE style; DWORD dwDuration; } BP_ANIMATIONPARAMS, *PBP_ANIMATIONPARAMS;
CBufferedAnimationImpl继承自CBufferedPaintBase,并在内部设置了默认的动画效果,同时添加了DoPaint方法,供子类重写
7.CBufferedAnimationWindowImpl
继承自CBufferedAnimationImpl,重写DoPaint方法,默认支持GDI动画程序效果
参考:http://www.codeguru.com/cpp/w-p/vista/print.php/c15841/
感谢这位作者提供的2个通俗易懂的例子
相关文章推荐
- MTM动画教程学习笔记1【第四章 渲染技术】
- Unity Shader 学习笔记(18)纹理动画、顶点动画、广告牌技术
- Android 学习笔记多媒体技术之 Drawable类+Tween(补间动画)+Frame(帧动画)
- 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画
- 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画
- 【JavaSE学习笔记】IO流05_字符缓冲输出流BufferedWriter、字符缓冲输入流BufferedReader
- Java学习笔记之IO(九):BufferedReader缓冲输入字符流
- 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画(转发)
- Java学习笔记之IO(四):BufferedInputStream缓冲输入字节流
- 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画
- 学习笔记 - BufferedReader字符缓冲流从文件读入字符串
- 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画
- Java核心技术学习笔记(三)
- linux0.11学习笔记-技术铺垫-简单AB任务切换程序(1)-实现一个简单的bootloader
- WTL学习笔记之NM_CUSTOMDRAW和WM_DRAWITEM
- Android动画学习笔记
- WTL学习笔记之"Enter"和"ESC"的一点小心得
- WTL 学习笔记 -- Property Sheets and Wizards
- 学习笔记:Android彻底组件化方案实践——Android技术杂货铺
- 流媒体技术学习笔记之(十二)Linux(Ubuntu)环境运行EasyDarwin