双缓冲应用 之 窗口绘图防闪烁,基于对话框的绘图
来源:互联网 发布:js年月日转换为. 编辑:程序博客网 时间:2024/05/18 17:25
在使用VC++编写某些绘图程序时,你可能会发现,窗口在每次重绘时都会发生闪烁。特别是在绘制较复杂的图
像时,这种闪烁将会更加剧烈。这里介绍一种防止窗口绘图时闪烁的双缓冲技术。
首先,先解释一下什么叫双缓冲。双缓冲,即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度。
通过这个简短的解释,你是否对双缓冲有了初步的理解?不理解没关系,继续往下看。
双缓冲实现过程如下:
1、在内存中创建与画布一致的缓冲区
2、在缓冲区画图
3、将缓冲区位图拷贝到当前画布上
4、释放内存缓冲区
举例:对话框中应用双缓冲绘图
编译环境:
操作系统 Windows XP
编译工具 Visual C++ v6.0
1、新建一个基于对话框的应用程序
在对话框中添加一个picture控件更改ID为IDC_FIGURE,在需要绘图的类的头文件中定义几个双缓冲用到的变量
CRect rect; // 存储绘图控件的绘图区域
CDC *pDC; // 控件的屏幕绘图设备指针
CDC memDC; // 内存绘图设备
CBitmap memBitmap; // 用于内存绘图的位图
CBitmap* pOldBmp; // 备份旧的位图指针
CWnd* pWnd; // 绘图控件的指针
//添加一个成员函数:
void DrawFigure(CDC *pDC);
2、在对话框的初始化函数On
pWnd = GetDlgItem(IDC_FIGURE); // 获得对话框上的picture控件的窗口句柄
pWnd->GetClientRect(&rect); // 获取绘制区域
pDC = pWnd->GetDC(); // 获得对话框上的picture的设备指针
pOldBmp = NULL; // 将旧的位图指针置空
// 创建内存绘图设备,使内存位图的DC与控件的DC关联
memDC.CreateCompatibleDC(pDC);
memBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
pOldBmp = memDC.SelectObject(&memBitmap);
SetTimer(1,100,NULL); // 启动定时器
3、DrawFigure函数的定义
void CMyDialog::DrawFigure(CDC *pDC) //CMyDialog,是需要绘图的对话框类
{
//声明画笔对象,及画笔指针
CPen pen,*oldpen;
//画一个矩形区域
pDC->Rectangle(&rect);
pDC->MoveTo(0,0);
int x,y;
for(int i =0; i<1000; i++)
{
pen.CreatePen(PS_SOLID,1, RGB(rand()%255,rand()%255,rand()%255));
oldpen = pDC->SelectObject(&pen);
x = rand()%rect.Width();
y = rand()%rect.Height();
pDC->LineTo(x,y);
pDC->SelectObject(oldpen);
pen.DeleteObject();
}
}
4、添加Paint事件,在Paint事件处理代码中添加代码
pDC->BitBlt(rect.left,rect.top,rect.right,rect.bottom,&memDC,0,0,SRCCOPY);
5、添加Timer事件,在Timer事件处理函数中添加代码
//在位图中画图片
DrawFigure(&memDC);
//使屏幕刷新
On
6、在Close事件中添加代码,用来删除创建的对象,以释放内存
memDC.SelectObject(pOldBmp);
memDC.DeleteDC();
memBitmap.DeleteObject();
至此,对话框中应用双缓冲的简单例子就介绍完毕
若在View视图中应用双缓冲,需要将On
return TRUE;
从而避免背景不同而形成闪烁
http://hi.baidu.com/dingxia0532/blog/item/33cadec39aca295ef21fe738.html
- 双缓冲应用 之 窗口绘图防闪烁,基于对话框的绘图
- 基于对话框的简单双缓冲绘图框架
- 基于对话框的简单双缓冲绘图框架
- 双缓冲绘图,防止闪烁
- 基于对话框的绘图
- VC GDI双缓冲机制绘图防屏幕闪烁实现步骤
- MFC绘制动态曲线,用双缓冲绘图技术防闪烁
- MFC绘制动态曲线,用双缓冲绘图技术防闪烁
- MFC绘制动态曲线,用双缓冲绘图技术防闪烁
- MFC绘制动态曲线,用双缓冲绘图技术防闪烁
- MFC绘制动态曲线,用双缓冲绘图技术防闪烁
- VC GDI双缓冲机制绘图防屏幕闪烁实现步骤
- 双缓冲实现无闪烁绘图
- 论坛所得《双缓冲绘图--防止闪烁》
- 双缓冲绘图 (避免闪烁)
- 用了双缓冲绘图还闪烁
- android双缓冲绘图,避免屏幕闪烁
- c++双缓冲技术绘图避免闪烁
- 机器学习 8 PCA cont.
- oracle 表空间设计原则
- 软件项目管理一点分享
- 资治通鉴,卷五十三,崔寔《政论》
- Unix vmstat 命令
- 双缓冲应用 之 窗口绘图防闪烁,基于对话框的绘图
- linux中的文件压缩(.gz、.tar.gz、tgz、bz2、.Z、.tar)
- 一些C++开源库
- ABAP : Check (Ctrl + F2)
- C++是十大错误
- VC++常用插件和界面库
- 使用JavaScriptSerializer进行JSON序列化
- 怎样用QT下使用递归实现一棵二叉树
- 黑马程序员--java基础之Socket