资源描述:
《vc绘图-双缓冲技术》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、***************所有的GDI绘图函数使用的都是逻辑坐标(逻辑范围)****************************系统默认情况下物理范围和逻辑范围是1:1的对应关系***************1.首先定义类成员: CDC*m_pDC; CDCMemDC; CBitmapMemBitmap; CBitmap*pOldbitmap; LONGxRange; //逻辑范围,x方向宽度 LONGyRange; //逻辑范围,y方向高度 LONGnWidht; //物理范围,x方向宽
2、度 LONGnHeight;//物理范围,y方向高度2.在类初始化函数中:m_pDC=this->GetDC(); //获取设备上下文句柄CWnd*wnd=GetDlgItem(IDC_SHOWGRAPH); //获取界面上显示图形的ID控件的句柄wnd->GetWindowRect(&rect); //获取显示/画图区域大小(物理范围)ScreenToClient(&rect); //转换为客户区坐标nWidth=rect.W
3、idth(); //显示/画图区域x方向物理宽度nHeight=rect.Height(); //显示/画图区域y方向物理高度3.在自定义函数中,设置视口与窗口的比例关系:m_pDC->SetMapMode(MM_ANISOTROPIC); //注意MM_ANISOTROPIC和MM_ISOTROPIC的区别m_pDC->SetWindowExt(XRange,-yRange); //设定窗口尺寸范围,画图使用的逻辑范围,实现放大或是缩小,坐标方向↑和→
4、为正向m_pDC->SetViewportExt(nWidth,nHeight);//设定视口尺寸范围,客户区实际图形显示的区域范围,大小固定m_pDC->SetViewportOrg(rect.left,rect.bottom);//设定画图的逻辑原点坐标(0,0)在物理坐标的(rect.left,rect.bottom)点上4.在自定义函数中,双缓冲技术的使用:MemDC.CreateCompatibleDC(m_pDC); //创建内存兼容设备上下文MemBitm
5、ap.CreateCompatibleBitmap(m_pDC,xRange,yRange); //创建内存兼容画布,大小由逻辑范围决定pOldbitmap=MemDC.SelectObject(&MemBitmap); //将画布选入内存设备上下文MemDC.FillSolidRect(0,0,xRange,yRange,RGB(123,213,132));//对内存中的画布填充背景颜色,否则是默认的黑色//画图操作,如画一条对角直线MemDC.MoveTo(0,0);MemDC.Lin
6、eTo(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.至此,就完成了双缓冲及
7、坐标缩放绘图的功能*********************************************************************************************************************************************用VC做的画图程序,当所画的图形大于屏幕时,在拖动滚动条时屏幕就会出现严重的闪烁,为了解决这一问题,就得使用双缓冲来解决。程序产生严重的闪烁问题是因为画图过程中前后两次的画面反差很大造成的人的视觉的闪烁。因为在VC中每次在
8、调用OnDraw时系统都是先用背景画刷将画布清除再执行画图命令,这样在你每次移动滚动条时每执行一次OnDraw就会有一个空白页,这样和你的最终结果图象之间有一个很大的反差,因而看起来闪烁,而且滚动条滚动越快闪烁越严重。当然,你可以将背景画刷设为NULL,这样可以解决闪烁问题,但是不能将先前的图象擦除,这样整个屏幕就显得很乱。下面将利用双缓冲来解