在view上画图,对象的缩放问题

来源:互联网 发布:sony compact 网络制式 编辑:程序博客网 时间:2024/06/11 07:29

 我们在view上面画图往往需要随时放大或缩小所画图形,或者是我们把一些对象,比如图片,文档等放到view上面,为了便于观看,我们也需要随时放大或缩小这些对象,这里我把我们画的直线,曲线什么的都称为对象。我们画对象的时候往往会保存这些对象的一些数据,比如坐标,颜色,形状等等。我们会想,缩放的时候只要相应的改变这些对象的坐标和线的粗细不就可以了么,这是比较笨的办法,这相当于你把整个的系统重新再写了一遍。其实最简单的办法就是改变最终显示对象的view的坐标系,为什么要强调最终显示的view的坐标系呢?原因很简单,你画对象的view并不一定是你缩放对象显示的view,我们只要改变最终显示缩放对象的view的坐标系就可以了,并不是改变对象中缩保存的逻辑坐标。

   我们画对象时,鼠标移动获得的坐标是设备坐标,我们必须把它转换成逻辑坐标保存到对象当中,通过DPtoLP()函数就可以完成这一功能。画图之前先用OnPreparDC()函数定义一下坐标系统,这个函数,规定了画图系统所采用的坐标映射模式,这个函数是一个虚函数可以重写它。windows自带的坐标映射模式有MM_TEXT这个是系统默认的坐标映射模式,还有MM_HIENGLISH、MM_LOENGLISH、MM_HIMETRIC、MM_LOMETRIC、MM_TWIPS、MM_ANISOTROPIC和MM_ISOTROPIC。通过这些坐标模式我们可以改变坐标系的原点,物理坐标和逻辑坐标缩对应的比例。系统默认的坐标系为屏幕的左上角为坐标原点,向右为X轴正方向,向下为Y轴正方向。我们可以设定X轴和Y轴的逻辑最大值,比如设为1000*1000屏幕的大小为假设为500*500像素以为就是说我们所定义的这个坐标系统中逻辑坐标与物理坐标的比例为2,即每个单位物理的尺寸上对应了2个逻辑坐标量而假设原来是1,其实MM_TEXT坐标映射模式中这个值就是1。把对象所存储的逻辑坐标对应到这个坐标系中,所映射到的物理范围就响应的缩小了。这就实现了对象缩小的功能,对象放大的功能也是同样的道理。

这个是未改变坐标系采用的系统默认的MM_TEXT映射模式画的一个矩形坐标为(0,0,100,100)

代码很简单:

初始化m_rect(0,0,0,0);

m_rect.bottom=100;

m_rect.right=100;

OnPreparDC(pDC);

pDC->Rectangle(m_rect);

这个是改变了坐标系之后以同样的坐标画的一个矩形

代码为:

初始化m_rect(0,0,0,0);

m_rect.bottom=100;

m_rect.right=100;

//int nScrollX=View->getXnPos();//滚动条滑动的距离

//int nScrollY=View->getYnPos();

pDC->SetMapMode(MM_ANISOTROPIC);

//pDC->SetViewportOrg(-nScrollX,-nScrollY);//设置原点

//pDC->SetWindowOrg(0,0);

  

CRect rect;

GetClientRect(&rect);

pDC->SetViewportExt(rect.Width(),rect.Height());pDC->SetWindowExt(500,500);

pDC->Rectangle(m_rect);

语句pDC->SetWindowExt(500,500);设置逻辑坐标量。可以利用一个参数来控制函数的两个参数实现对象的放大缩小,以及缩放的比例。

如果view上有滚动条的话就需要重新设定原点了,否则就会出现错误,把注释的代码打开就行了。另外鼠标响应函数也需要重新设定坐标系,否则会出现画的线跟鼠标移动的轨迹错位。

原创粉丝点击