c  双缓冲程序设计 _第1页
c  双缓冲程序设计 _第2页
c  双缓冲程序设计 _第3页
c  双缓冲程序设计 _第4页
c  双缓冲程序设计 _第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1普通绘图就是直接在我们看得到的黑板上绘图2双缓冲就是先在一个虚拟的黑板上画完,等用到的时候在把虚拟黑板上的图画复制到我们看得到的黑板上去;利用双缓冲的优点就是能够使画面流畅,可以想象把画好的图直接粘贴到黑板上一定比在黑板上重新画要快的多。开始第一步:新建一个对话框工程第二步:添加两个按钮:一个命名为 双缓冲绘图;一个命名为 普通绘图;第三步:声明变量:在 CMyDlg 类上右击添加变量如下:CDC MyDC;CBitmap bmp;CBitmap *oldbmp;首先声明一个与窗口 DC 兼容的内存 DC(MyDC)和两个与内存相兼容的位图(bmp,*oldbmp)第四步:在 OnInitDialog()函数中添加以下代码:/窗口 DCCDC *dc=GetDC(); /创建与窗口 DC 兼容的内存 DC(MyDC)及位图(bmp,*oldbmp )MyDC.CreateCompatibleDC(dc);bmp.CreateCompatibleBitmap(dc,200,200);/把内存位图选进内存 DC 中用来保存在内存 DC 中绘制的图形oldbmp=MyDC.SelectObject(/在内存 DC 中绘制一些小的圆形,数量要多(体现双缓存的优点)for(int i=0;iStretchBlt(0,0,200,200,/把内存 DC 中的图形粘贴到窗口中;第七步:双击“普通绘图”按钮添加以下代码:for(int i=0;iEllipse(i-3,j-3,i+3,j+3);/按普通方式在窗口中绘制和在内存 DC 中一样数量和大小的位图;第八步:运行程序.先单击 普通绘图 按钮,大家可以看到绘图的速度有点慢再单击 双缓冲绘图 按钮,图像马上就显示出来了,这就是双缓冲和普通绘图的区别了_完成双缓冲技术说起来也没有那么神秘,举个形象一点的例子吧,有两张纸 A 和 B, 纸 A 代表屏幕,纸 B 代表后台缓冲,我们将所有的绘图操作都显示在纸 B 上,然后将纸 B 覆盖在纸 A 上,这样体现在纸 A 上的操作就是绘制了整张图,体现在纸 B 上的就是纷繁复杂的绘图操作。技术上实现起来也很简单,VS2010 甚至都已经给出了一个 CMemDC 的类,这个类就可以提供缓冲的作用。如果在一个函数体内部想要实现双缓冲,那么过程清晰的展开就如同下列样子:CDC MemDC; /首先定义一个显示设备对象 ,就像一只画笔。 CBitmap MemBitmap;/定义一个位图对象 ,这个就如同纸 B ,但现在还是无限大的/随后建立与屏幕显示兼容的内存显示设备 , 就像给将要绘制的图像定一个基调,是黑白图、彩色图、灰度图?MemDC.CreateCompatibleDC(NULL); /这时还不能绘图,因为没有地方画 _ /下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小 ,这里就是将大纸裁剪成合适的大小MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); /将位图选入到内存显示设备中 /只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上 ,将画笔拿在手里,这个时候就能在纸 B 上开画了,否则空手怎么画? CBitmap *pOldBit=MemDC.SelectObject( /先用背景色将位图清除干净,这里我用的是白色作为背景 /你也可以用自己应该用的颜色 /这里的作用是因为 Windows 平台提供的最原始的纸都是黑色的,所以我们需要将他们粉刷成白色。MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255); /绘图 ,这里就开始绘图了,画条直线,画朵花,全凭你的想象了,但是,嘿嘿,要有好的绘图技术哦!MemDC.MoveTo(); MemDC.LineTo(); /将内存中的图拷贝到屏幕上进行显示 ,这里就是将纸 B 覆盖到纸 A 上。pDC-BitBlt(0,0,nWidth,nHeight, /绘图完成后的清理 , 之后呢就将纸 B 销毁,就是释放内存了,不然这样的纸 B 多了,电脑会慢的。 MemBitmap.DeleteObject(); MemDC.DeleteDC(); MFC 做了一些时间了,不得不面对 的是在界面上画图的。当然你可以直接搜索到能用的代码,并且基本能满足要求。不过这样总不是学习的态度。本着学习分享的态度,现做一些基本的分析吧。在 MSDN 上知道,我们画图的对象都是窗口的 DC,WINDOWS 的绘图更新时,总是用背景色先填充这个区域,然后才是我们的绘图代码,这就是说,如果我们绘图的代码与背景色差别较大,不管我们更新速度多快,总会有种闪烁的感觉。要想避免,通常的做法都是双缓冲了,具体代码上来了。void CXX:DrawPic(CDC* pDC/*目标 DC 指针*/)/这里面的 CRect rect 是你要画图的窗口的大小CDC memDC;/memDC.CreateCompatibleDC(pDC);/创建与目标 DC 相兼容的内存 DC,memBitmap.CreateCompatibleBitmap(pDC,rect.Width(), rect.Height();/根据目标 DC 创建位图,为什么?看后面memDC.SelectObject(brush.CreateSolidBrush(RGB(255,0,0);/建立个红色的画刷给内存 DCmemDC.SelectObject(&brush)/选择这个刷子memDC.Rectangle(0, 0, 100, 100)/一个正方形/将这个 DC 的全部内容放入 pDC,这样屏幕上才会有图像pDC-BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),/结束了 画图不要忘记释放资源,DC 是有限的memBitmap.DeleteObject();memDC.DeleteDC();现在,我来说说:1.内存 DC;MSDN 上说,内存 DC 只存在于内存中,当我们使用 memDC.CreateCompatibleDC(pDC)建立它的时候,它只是一个单色的长宽各 1 像素(one monochrome pixel wide and one monochrome pixel high.)的一个显示面。2.上面我建立 了个位图,为什么?同样,MS 说,一个 DC 建立后是不能绘图的,你必须给它选择一 个与它高宽对应的位图。于是上面 你可以看到,我用了memBitmap.CreateCompatibleBitmap(pDC,rect.Width(), rect.Height();/这个位图是与 pDC 色彩是一样的,多色memDC.SelectObject(/把位图选入内存 DC,做到上上面 的要求。并且还达到另一个目的,就是让内存 DC 成为多色的 DC,慢慢体会吧3.为了绘图,你还要先个画刷,用来填充绘图区域,于是我用了CBrush brush;brush.CreateSolidBrush(RGB(255,0,0);/建立个红色的画刷给内存 DCmemDC.SelectObject(&brush)/选择这个刷子这 3 句。然后使用 memDC.Rectangle(0, 0, 100, 100)/一个正方形,画了个红色的正方形4.使用 pDC-BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),让屏幕上有图像显示,5.最后使用:memBitmap.DeleteObject();memDC.DeleteDC();释放 GDI 资源。这里应该说的是十分清楚的了,如果你没有成功,请联系我。如果发现错误,也欢迎指正。1、双缓冲作图基本思路使用 bitblt 函数,其原理是可以支持图形块的快速复制;所以,我们可以先在内存中作图,然后使用BitBlt 函数将内存中的图片复制到前台,同时禁止背景刷新,这样就消除了闪烁。2、双缓冲作图的实现步骤(以下显示基于 OnPaint 函数)CPaintDC dc(this);CRect rectClient;CDC dcMem,dcBkgnd;CBitmap bitmapTemp, *pOldBitmap;/获取窗口信息GetClientRect(/创建内存位图bitmapTemp.CreateCompatibleBitmap(&dc, rectClient.Width(), rectClient.Height();/创建内存位图dcMem.CreateCompatibelBitmap( /依附窗口 DC 创建兼容的 DC/将内存位图选入内存 dcpOldBitmap = dcMem.SelectObject(/填充颜色dcMem.FillSolidRect(rectClient,RGB(255,125,0); /主要的作图操作/绘制图片到主 dcdc.BitBlt(0, 0, rectClient.Width(), rectClient.Height(), &dcMem, 0, 0, SRCCOPY);/内存复位dcMem.SelectObject(pOldBitmap);3、BitBlt 函数说明:函数原型BOOL BitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc,intnXSrc, int nYSrc, DWORD dwRop);参数hdcDest:指向目标设备环境的句柄。nXDest:指定目标矩形区域左上角

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论