在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上有滚动条的话就需要重新设定原点了,否则就会出现错误,把注释的代码打开就行了。另外鼠标响应函数也需要重新设定坐标系,否则会出现画的线跟鼠标移动的轨迹错位。
- 在view上画图,对象的缩放问题
- React-Native自定义view的缩放问题
- 怎么在ListView的Column上画图?
- 在基于对话框的应用程序上画图
- 对象在堆上的创建问题
- 创建DC画布并在上面画图并将结果缩放到一个按钮上显示
- 在panel上画图
- 在TCanvas上画图
- Viewpager中嵌入自定义可缩放view遇到的问题
- Viewpager中嵌入自定义可缩放view遇到的问题
- 常用的在CALayer上画图的方法
- Brush画图的使用 和 图片缩放
- 在计算机屏幕上画图
- C#在屏幕上画图
- 在窗体边框上画图
- C#在Panel上画图
- android 在surfaceView上画图
- 在windows phone上画图
- UBOOT引导Linux内核及向内核传递参数的方式
- java 作为客户端发送http post请求登录网站首页。 HTTP/1.1 302 Found
- 分析uboot是如何启动内核的
- uva 10245 - The Closest Pair Problem
- C++引用计数实现垃圾回收机制
- 在view上画图,对象的缩放问题
- linux 与window下c申请'变长'数组的疑问
- eclipse-indigo 中 user libraries 自动部署 WEB-INF/lib 配置
- telnet学习 23端口
- hadoop下mahout kmeans算法研究(1)
- 在VS2010下编译libjpeg及其应用例子
- 教你如何设置EditPlus的默认编码方式
- JavaScript对象
- 整数因子分解的Pollard p-1方法