双缓冲技术实现VC绘图.docVIP

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
? ********************所有的GDI绘图函数使用的都是逻辑坐标(逻辑范围)******************* *******************系统默认情况下 物理范围和逻辑范围 是1:1 的对应关系******************* 1. 首先定义类成员: ?? CDC *m_pDC; ?? CDC MemDC; ?? CBitmap MemBitmap; ?? CBitmap *pOldbitmap; ?? LONG xRange;?? // 逻辑范围,x方向宽度 ?? LONG yRange;?? // 逻辑范围,y方向高度 ?? LONG nWidht;?? // 物理范围,x方向宽度 ?? LONG nHeight; // 物理范围,y方向高度 2. 在类初始化函数中: m_pDC = this-GetDC();???????????????? // 获取设备上下文句柄 CWnd *wnd = GetDlgItem(IDC_SHOWGRAPH);???? // 获取界面上显示图形的ID控件的句柄 wnd-GetWindowRect(rect);???????????? // 获取显示/画图区域大小(物理范围) ScreenToClient(rect);???????????????? // 转换为客户区坐标 nWidth = rect.Width();???????????????? // 显示/画图区域x方向物理宽度 nHeight = rect.Height();?????????????? // 显示/画图区域y方向物理高度 3. 在自定义函数中,设置视口与窗口的比例关系: m_pDC-SetMapMode(MM_ANISOTROPIC);???? // 注意MM_ANISOTROPIC和MM_ISOTROPIC的区别 m_pDC-SetWindowExt(XRange,-yRange);?? // 设定窗口尺寸范围,画图使用的逻辑范围,实现放大或是缩小,坐标方向↑和→为正向 m_pDC-SetViewportExt(nWidth,nHeight); // 设定视口尺寸范围,客户区实际图形显示的区域范围,大小固定 m_pDC-SetViewportOrg(rect.left,rect.bottom); //设定画图的逻辑原点坐标(0,0)在物理坐标的(rect.left,rect.bottom)点上 4. 在自定义函数中,双缓冲技术的使用: MemDC.CreateCompatibleDC(m_pDC);????????????????????????? // 创建内存兼容设备上下文 MemBitmap.CreateCompatibleBitmap(m_pDC,xRange,yRange);??? // 创建内存兼容画布,大小由逻辑范围决定 pOldbitmap = MemDC.SelectObject(MemBitmap);????????????? // 将画布选入内存设备上下文 MemDC.FillSolidRect(0,0,xRange,yRange,RGB(123,213,132)); // 对内存中的画布填充背景颜色,否则是默认的黑色 // 画图操作,如画一条对角直线 MemDC.MoveTo(0,0); MemDC.LineTo(xRange*0.9,yRange*0.9); // 将内存中的画图区域拷贝到界面的控件区域上去 // 第1和第2个参数若是0时,则从物理坐标的(rect.left,rect.bottom)点上开始按上述指定的方向贴图 m_pDC-BitBlt(0,0,xRange,yRange,MemDC,0,0,SRCCOPY); 5. 在类的析构函数中: MemDC.SelectObject(pOldbitmap); bitmap.DeleteObject(); this-ReleaseDC(m_pDC); 6. 至此,就完成了双缓冲及坐标缩放绘图的功能 ********************************************************************************************************************************************* 用VC做的画图程序,当所画的图形大于屏幕时,在拖动滚动条时屏幕就会出现严重的闪烁,为了解决这一问题,就得使用双缓冲来解决。程序产生严重的闪烁问题是因为画图过程中前后两次的画面反差很大造成的人的视觉的闪烁。因为在VC中每次在调用OnDraw时系统都是先用背景画刷将画布清除再执行画图命令,这样在你每次移动滚动条时每执行一

文档评论(0)

ygxt89 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档