全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
如何实现双缓冲双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度。双缓冲实现过程如下:1、在内存中创建与画布一致的缓冲区2、在缓冲区画图3、将缓冲区位图拷贝到当前画布上4、释放内存缓冲区(1)在内存中创建与画布一致的缓冲区CDCdc;/这是窗口的DC,假设已加载好CDC MemDC; /创建内存中的一个临时dc- MemDC, MemDC用来向窗口绘图的“草稿”/随后建立与屏幕显示兼容的内存显示设备MemDC.CreateCompatibleDC(&dc); /这时还不能绘图,因为没有地方画_ /创建的临时空白bitmap作为“画布”,至于位图的大小,可以用窗口的大小CBitmap MemBitmap;MemBitmap.CreateCompatibleBitmap(&dc,nWidth,nHeight); /只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); /将上面创建的临时“画布”MemBitmap与MemDC连接,注意此处的MemBitmap为一个空白临时画布,可以在这个空白画布上自绘图,也可以在这个画布上加载图片/先用背景色将位图清除干净,这里我用的是白色作为背景/你也可以用自己应该用的颜色MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255); (2)在缓冲区画图MemDC.MoveTo(); MemDC.LineTo(); (2)在第(2)步中,如果不是自绘图,而是加载一个位图,则需要再定义一个临时dc- MemDC2,用来将位图加载到上面建立的空白画布MemDC中CBitmapp1;/这是要画的位图,假设已加载好CDC MemDC2;MemDC2.CreateCompatibleDC(&dc);MemDC2.SelectObject(&p1);/ MemDC2与图片链接/在这里,p1保存的是要加载到临时空白画布上的图片,MemDC2是与p1链接的dc(3)将缓冲区位图拷贝到当前画布(屏幕)上 dc.BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY); (3)如果是位图的话首先,将与MemDC2链接的位图p1拷贝到临时空白画布MemDC中MemDC.BitBlt(x,y,width,height,& MemDC2,0,0,SRCCOPY);/向草稿绘制第一张图片,x,y,width,height请自行设置其次,将草稿绘制到屏幕上dc.BitBlt(0,0,width,height,&MemDC,0,0,SRCCOPY);(4)释放内存缓冲区/绘图完成后的清理MemBitmap.DeleteObject(); MemDC.DeleteDC(); MemDC2.DeleteDC();下面是一个不使用和使用双缓存的例子使用双缓存/CPoint ptCenter;/CRect rect, ellipseRect;/GetClientRect(&rect); /获得窗口客户区的大小/ptCenter = rect.CenterPoint(); /获得矩形的中心点,目的是为了确定后面同心圆图像的圆心/CDC dcMem; / 创建用于缓冲作图的内存DC对象dcMem/CBitmap bmp; / 创建内存中存放临时图像的位图对象bmp/dcMem.CreateCompatibleDC(pDC); / 依附窗口DC(窗口对象为pDC),创建兼容内存DC(就是创建一个内存DC,所有图形先画在这上面)/bmp.CreateCompatibleBitmap(&dcMem, rect.Width(), rect.Height();/ 在兼容内存DC上,创建兼容位图/dcMem.SelectObject(&bmp); / 将位图选入内存DC/dcMem.FillSolidRect(rect, pDC-GetBkColor();/ 按照原有背景色填充客户区,否则会成为黑色,同时也使内存DC的背景色保持一致/ 绘图操作/for (int i = 60; i 0; -i)/ellipseRect.SetRect(ptCenter, ptCenter);/ellipseRect.InflateRect(i * 5, i * 5);/dcMem.Ellipse(ellipseRect); / 在内存DC上绘图,做同心圆图像/pDC-BitBlt(0, 0, rect.Width(), rect.Height(),/&dcMem, 0, 0, SRCCOPY); / 将内存DC上的图像复制到前台pDC,即实际屏幕对象pDC/dcMem.DeleteDC(); / 删除内存DC/bmp.DeleteObject(); / 删除内存位图不使用双缓存CPoint ptCenter;CRect rect,ellipseRect;GetClientRect(&rect);ptCenter = rect.CenterPoint();for(int i=60;i0;i-)ellipseRect.SetRect(ptCenter,ptCenter);ellipseRect.InflateRect(i*5,i*5);pDC-Ellipse(ellipseRect);下面的例子是加载两幅图片CBitmapp1,p2;/这是要画的位图,假设已加载好CDCdc;/这是窗口的DC,假设已加载好/创建两个临时dc,dc1为向窗口绘图的“草稿”,dc2为与源位图连接的dc(实际上dc2也可以用别的方法代替,这只是我的癖好)CDCdc1,dc2;dc1.CreateCompatibleDC(&DC);dc2.CreateCompatibleDC(&DC);/创建一个临时bitmap作为“画布”,与dc1连接CBitmapbm;CBitmap*Oldbm1,Oldbm2bm.CreateCompatibleBitmap(pDC,width,height);/长度宽度设置成与绘图面积一样大dc1.SelectObject(&bm);dc2.SelectObject(&p1);/dc2与第一张图片链接dc1.BitBlt(x,y,width,height,&dc2,0,0,SRCCOPY);/向草稿绘制第一张图片,x,y,width,height请自行设置dc2.Sel
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年幼儿园户外自主游戏的信息化观察工具开发
- 2026年教师仪容仪表及行为规范
- 术后患者的定期复查项目
- 安徽省“江南十校”2025-2026学年高二12月阶段联考数学试卷(解析版)
- 术后并发症的多学科防控策略
- 草房子考试题及答案
- 有机酸尿症患儿的免疫调节治疗
- AI在建筑智能化工程技术中的应用
- 智能水凝胶调控干细胞分化
- 智能临床决策在传染性疾病防控中
- 年满70岁老年人三力测试题库能力考试题及答案
- 营养专科护理考试题及答案
- 2025年西藏自治区事业单位招聘考试卫生类药学专业知识试卷
- 告别假努力主题班会课件《拒绝假努力学会真自律》
- 心脏康复标准化流程
- 口腔诊所污水知识培训
- 《2+N糖尿病逆转治疗行业规范与操作流程》
- 文字录入技能竞赛组织方案范文
- JJF 1221-2025汽车排气污染物检测用底盘测功机校准规范
- FSSC22000 V6食品安全管理体系程序文件一整套
- GB/T 46075.4-2025电子束焊机验收检验第4部分:焊接速度的测量
评论
0/150
提交评论