VC图形绘制双缓存的代码复用性讨论
在前文中已经讨论了如何实现界面绘制双缓存的问题,前文网址如下:
http://www.2cto.com/kf/201111/112429.html
双缓存的主要思路是:先把图形绘制到内存DC中,然后再把内存DC中的所有图形一次性的复制到屏幕DC中。在前文的实现示例中,我们把直接往DC中绘制图形的函数封装为DrawDirect,把通过双缓存来实现图形绘制的函数封装为DrawWithBufferEfficient,其中DrawWithBufferEfficient调用了DrawDirect函数。这种实现方式,保证了视图类可实现双缓存绘制。
如果在这工程中,还存在其他需要进行双缓存的弹出窗口,根据前文的实现方式,也许只能在弹出窗口类中,把DrawWithBufferEfficient重复实现一次,可能只需要简单的复制和拷贝,然后更改相应的类名。但是,这种重复性的工作,不是一件很愉快的事,尤其是当DrawWithBufferEfficient函数需要变更的时候。如果能对绘制双缓存的函数进行独立封装,其他类只要通过同一的接口调用或实现方法就可以完成双缓存的实现,将会有效的提高代码的复用性。
没有使用双缓存时,各类窗口是直接把图形数据写入到屏幕DC中,根据窗口图形的不同,写入的方式方法也不一样,也就是DrawDirect函数的内容不一样。使用双缓存后,从内存DC复制到屏幕DC的动作是一样的,即DrawWithBufferEfficient函数可以完全相同。考虑到需要调用不同的DrawDirect,可以把DrawDirect的指针作为DrawWithBufferEfficent的一个输入参数,从而实现对DrawWithBufferEfficent函数的封装。
下面来讨论一下实现的方式:
1、函数指针
首先我们需要了解函数指针的基本概念及是用方法,而由于DrawDirect是类的成员函数,还应该了解类成员函数指针的使用。
函数指针的讨论可参考之前的讨论文章,链接如下:
http://www.2cto.com/kf/201111/112430.html
2、函数指针模板
由于DrawDirect可能是不同类的成员函数,因此,只能通过函数模板来实现调用不同类的DrawDirect。
函数指针模板可参考之前的讨论文章,链接如下:
http://www.2cto.com/kf/201111/112431.html
3、可复用的双缓存的实现
在工程添加一个类,用于实现双缓存的接口函数模板,该函数的输入包括,要绘制的窗口类的指针,窗口类的绘制函数的指针,窗口类的屏幕DC的指针。
为了调用方便,可把函数模块设定为静态函数,调用时就可不用对该类进行实例化。
该类的源代码如下所示:
template <typename T>
class CDoubleBufferTemplate
{
public:
typedef void (T::*DrawFun)(CDC*);
static void DrawWithBuffer(T* pT, DrawFun fun, CDC* pDC)
{
ASSERT_VALID(pT);
ASSERT_VALID(pDC);
/*创建内存DC*/
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);
dcMemory.SetBkColor(pDC->GetBkColor());
/*设置内存DC的画板,大小与输入DC的裁剪区域一样*/
/*只对裁剪区域进行重新绘制*/
CRect rectClip(0,0,0,0);
pDC->GetClipBox(&rectClip);
CBitmap bmpMemory;
bmpMemory.CreateCompatibleBitmap(pDC,
rectClip.Width(), rectClip.Height());
dcMemory.SelectObject(&bmpMemory);
/*设置内存DC的起始点*/
dcMemory.SetViewportOrg(-1*rectClip.left, -1*rectClip.top);
/*粉刷背景*/
dcMemory.FillSolidRect(&rectClip, pDC->GetBkColor());
(pT->*fun)(&dcMemory);
/*把内存DC复制到输入DC中*/
pDC->BitBlt(rectClip.left, rectClip.top, rectClip.Width(), rectClip.Height(),
&dcMemory, rectClip.left, rectClip.top, SRCCOPY);
/*释放资源*/
bmpMemory.DeleteObject();
dcMemory.DeleteDC();
}
};
视图类可在OnDraw或OnPaint中对双缓存模板函数的调用,调用示例如下:
DoubleBufferTemplate<CDoubleBufferView>::DrawWithBuffer(
this, DrawDirect, pDC);
其中,this是视图类的指针,DrawDirect是直接在DC中绘制图形的函数,pDC是屏幕DC的指针。
4、工程源代码下载:http://up.2cto.com/2011/1128/20111128044129235.rar
5、参考文章
http://www.2cto.com/kf/201111/112429.html
http://www.2cto.com/kf/201111/112430.html
http://www.2cto.com/kf/201111/112431.html
摘自 www.cnblogs.com/xianyunhe/archive/2011/11/27/2265165.html
VC图形绘制双缓存的代码复用性讨论的更多相关文章
- 【MFC】VC界面绘制双缓存
VC界面绘制双缓存 转载请注明原文网址: http://www.cnblogs.com/xianyunhe/archive/2011/11/20/2255811.html 1.闪屏的问题在GDI的绘图 ...
- MFC双缓存技术代码
屏蔽背景刷新,在View中添加对WM_ERASEBKGND的响应,直接返回TRUE: BOOL CTEMV1View::OnEraseBkgnd(CDC* pDC) { // TODO: 在此添加消息 ...
- 头部布局,搜索验证和AJAX自动搜索提示,并封装成组件,提高代码复用性
index.html 头部区结构和样式 效果图 静态样式 index.html中的部分 <!-- 头部 --> <div class="header"> & ...
- 从零开始openGL—— 二、 基本图形绘制
前言 这是从零开始openGL系列文章的第二篇,在上篇文章中介绍了基本的环境配置,这篇文章将介绍如何绘制基本图形(圆.三角形.立方体.圆柱.圆锥). 基本框架 下面这里我先给出opengl的3D绘图的 ...
- OpenGL 笔记<1> 固定管线实例 + 双缓存测试实例
欲以此分类来记录opengl的学习历程,此为第一篇,所以先来一个固定管线的例子,以及对双缓存的测试. 一.配置环境 写之前,先进行配置,然后再讲内容. 注:第一部分涉及的代码均忽略. [环境配置传送门 ...
- C# GDI绘制仪表盘(纯代码实现)
纯代码实现GDI绘制仪表盘,效果在代码下面. public partial class HalfDashboardUc : UserControl { /// <summary> /// ...
- javascript制作公式编辑器,函数编辑器和图形绘制
自己是电子信息方向的,因此总是需要处理大量的电路实验.电路数据和电路仿真处理,每次处理数据时候还需要同样的数据很多遍, 又需要关于电路的频率响应和时域响应情况,所以一直有做一个这样公式编辑器的打算了. ...
- 一个由正则表达式引发的血案 vs2017使用rdlc实现批量打印 vs2017使用rdlc [asp.net core 源码分析] 01 - Session SignalR sql for xml path用法 MemCahe C# 操作Excel图形——绘制、读取、隐藏、删除图形 IOC,DIP,DI,IoC容器
1. 血案由来 近期我在为Lazada卖家中心做一个自助注册的项目,其中的shop name校验规则较为复杂,要求:1. 英文字母大小写2. 数字3. 越南文4. 一些特殊字符,如“&”,“- ...
- 7_DoubleBuffer 游戏编程中的双缓存模式
### double buffer 双缓存 简单说: 当一个缓存被读取的时候,往另一个缓存里写入, 如此交替 #### the pattern 有两个缓存实例,一个是 current buffer, ...
随机推荐
- 设计模式(六)桥连模式Bridge(结构型)
设计模式(六)桥连模式Bridge(结构型) 1. 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够 ...
- 基于visual Studio2013解决C语言竞赛题之0414特殊平方数
题目 解决代码及点评 这道题依旧是通过for循环,遍历所有四位数,然后根据题目要求判断数的性质即可 /**************************************** ...
- Android 自动编译、打包生成apk文件 4 - 多渠道批量打包
相关文章列表: < Android 自动编译.打包生成apk文件 1 - 命令行方式> < Android 自动编译.打包生成apk文件 2 - 使用原生Ant方式 > < ...
- 最新Cocos2d-x3.2开发环境搭建(windows环境下)
原文地址:http://cache.baiducontent.com/c?m=9d78d513d9921cfe05ac837f7d16c067690297634d9dc7150ed58449e3735 ...
- 香蕉派 BPI-M1+ 双核开源硬件单板计算机
香蕉派 BPI-M1+ 开源硬件开发板 深圳市源创通信技术有限公司公司 http://www.sinovoip.com.cn/cp_view.asp?id=562 产品介绍 Banana PI BPI ...
- 扩展 Windows Azure 运营能力 – 巴西
今天早些时候,在巴西圣保罗的一个活动上,我宣布了我们将在巴西设立一个 Windows Azure 区域数据中心的计划.我们希望该区域中心可以在 2014 年年初上线,并且我们很高兴地宣布将在未来 4 ...
- 分享一个嵌入式httpdserver开发库 - boahttpd library
http://sourceforge.net/projects/boahttpd/ 一个C接口的开发库,适用于 windows/linux/或其它嵌入式平台,支持CGI扩展,支持多线程.採用面向对象开 ...
- Activity 和 Intent
Activity 和 Intent 一.Intent指向Activity 二.利用 Intent 向第二个 Activity 传数据 三.利用 Intent 接受第二个 Activity 的返回值 四 ...
- 技术不牛如何才拿到国内IT巨头的Offer(转)
不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些牛人,NOI金牌,开源社区名人,三年级开始写Basic...在跪拜之余我们不禁要想,和这些牛人比,作为绝大部分技 ...
- Properties文件及与之相关的System.getProperties操作(转)
如何使用Java读写系统属性? 读: 简述properties文件的结构和基本用法结构:扩展名为properties的文件,内容为key.value的映射,例如"a=2" 示例用到 ...