MFC+Direct2D简化坐标缩放
来源:互联网 发布:mac finder 侧边栏 编辑:程序博客网 时间:2024/04/30 02:09
背景
问题由来
在参考1这篇文章里写了GDI下坐标缩放的情况,这里记录下再Direct2D绘图引擎下的缩放操作。
环境配置
参考文章2
几个概念
参考上一篇文章的说明配图
实现功能
1.所有图形初始缩放在默认视图框架内
2.(0,0)位置位于视图左下角
3.可以从屏幕坐标反推出原始数据坐标
4.使用Direct2D技术,在保持抗锯齿效果的同时,绘图效率和GDI差不多
思路及代码
流程图
计算等效初始坐标
1.遍历原始坐标获得XMAX,YMAX,XMIN,YMIN.
2.获得视窗访问WIDTH,HEIGHT.
3.计算初始缩放比率SCALE,计算方法为:
同时得到绘图范围
4.计算等效初始坐标,计算方法为:
其中乘以负的缩放系数并加上绘图范围的Y值是为了将坐标调整为y正向向上,左下角为(0,0)
5.反推原始数据
为了从屏幕坐标反推得到原始数据,必须传入视图滚动条位置信息ScrollPT及视图缩放系数Zoom(注意不是初始缩放系数SCALE)
计算方法为:
代码
//.h文件 //一些结构定义typedef std::vector<CPoint> vPT; typedef D2D1_POINT_2F DPoint;typedef std::vector<DPoint> vDPT; typedef D2D1::Matrix3x2F Matrix;typedef struct _InitOffset{//初始化时显示参数 int nXOffset; int nYOffset; double dInitScale; CSize range; _InitOffset() { nXOffset = 0; nYOffset = 0; dInitScale = 1.0; range.cx = 1; range.cy = 1; }}InitOffset;typedef struct _ZoomOffset{//初始显示完成之后缩放时显示参数 CPoint ScrolPT; double dZoom; _ZoomOffset() { ScrolPT = CPoint(0,0); dZoom = 1.0; }}ZoomOffset;typedef struct _ScreenPara{//显示参数 InitOffset initoffset; ZoomOffset zoomoffset;inline CPoint GetOriginPTFromScreenPT(CPoint ScreenPT) { CPoint PT; PT.x = (ScreenPT.x + zoomoffset.ScrolPT.x) / (zoomoffset.dZoom * initoffset.dInitScale) + initoffset.nXOffset ; PT.y = ((ScreenPT.y + zoomoffset.ScrolPT.y) / zoomoffset.dZoom - initoffset.range.cy) / -initoffset.dInitScale + initoffset.nYOffset; return(PT); }inline CSize GetZoomRange(void) { return(CSize(initoffset.range.cx * zoomoffset.dZoom, initoffset.range.cy * zoomoffset.dZoom)); }}ScreenPara;extern ScreenPara g_ScreenPara;
//.cpp//鼠标滚轮缩放BOOL CScaleD2DView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt){ // TODO: Add your message handler code here and/or call default double m_dScale = g_ScreenPara.zoomoffset.dZoom; m_dScale += 0.1 * zDelta/ 120; if(m_dScale <= 0.2) { m_dScale = 0.2; } if(m_dScale >= 2.0) { m_dScale = 2.0; } g_ScreenPara.zoomoffset.dZoom = m_dScale; SetScrollSizes(MM_TEXT, g_ScreenPara.GetZoomRange()); Invalidate(); return CScrollView::OnMouseWheel(nFlags, zDelta, pt);}
结果
参考
1.MFC+GDI简化坐标平移缩放
2.Direct2D+MFC学习笔记
3.Direct2D教程(外篇)环境配置
0 0
- MFC+Direct2D简化坐标缩放
- MFC+GDI简化坐标缩放
- MFC+Direct2D以屏幕中心为中心缩放的实现
- Direct2D中的坐标变换
- Direct2D中的坐标变换
- Direct2D中的坐标变换
- Direct2D+MFC学习笔记
- Direct2D绘制的MFC控件
- Direct2D绘制的MFC控件
- openGL三维网格坐标,旋转,缩放,灯光设置,纹理读取,模型读取(MFC单文档)
- openGL三维网格坐标,旋转,缩放,灯光设置,纹理读取,模型读取(MFC单文档)
- 简化MFC版amcap
- VC绘图中的坐标缩放
- MFC 用 Direct2D 显示图像到 Picture Control 中
- MFC缩放实现
- MFC-缩放位图
- MFC界面自适应缩放
- MFC窗口自动缩放
- 防止字典参数缺少发生意外崩溃的解决方法
- 采用先进的视觉技术测试图形用户界面:工具、技术和实践
- 静态数组实现栈
- .ini文件转换为.xml文件
- U3D——刀光轨迹插件的改进
- MFC+Direct2D简化坐标缩放
- POJ1655 Balancing Act 求树的重心
- 淘宝内部分享:怎么跳出MySQL的10个大坑
- iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)
- The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path.(jsp页面报错)
- hadoop2.6.1 完全分布/伪分布部署
- 学习笔记08-集合
- Mongoose6.0源码分析(1)-从一个example开始到读取数据
- elasticsearch 查询(match和term)