MFC 图形图元的放大、缩小、移动

Ilson_ 2017-08-17 04:20:13
现有一个问题 : MFC基于对话框程序中 在程序界面加载了一张图 然后在图上进行画线、画圆、画矩形...等操作 , 然后我需要滚动鼠标滚轮以缩放图形(图片以及图元点、线、圆),在缩放时要求绘制的图形不能偏离在图上的相对位置。 再点击绘制的图元时需要知道绘制的点相对于图像是在什么位置(图片左上角为(0, 0)点) 求解
...全文
1580 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
victor_woo 2017-09-13
  • 打赏
  • 举报
回复
缩放还有移动 图元在当前窗口的起点终点需要换算到图片的坐标 显示图元的时候从图片坐标换算到窗口坐标(直线的起点可能在窗口坐标范围之外)
victor_woo 2017-09-13
  • 打赏
  • 举报
回复
1.图片载入后,缩放其实是在原图片上设值一个小窗口截取内容显示,缩放就是这个小窗口的尺寸和位置 2.怎么把绘制的图元和窗口尺寸同步缩放,找不到源码了,找到了再来回复实现方法。
victor_woo 2017-09-13
  • 打赏
  • 举报
回复
圈阅批注? 网络协同么?
VergilYe 2017-09-09
  • 打赏
  • 举报
回复
前段时间我也在做这个,你可以试试我的方法: 1.绘制(OnPaint函数) 1) 1:1未缩放的图片拷贝到内存DC 2)绘制图元到内存DC 3)内存DC拉伸至窗口DC。(StretchBlt)

	dc.StretchBlt(
		0,			//选择在目标DC什么位置(X坐标)开始显示
		0,			//选择在目标DC什么位置(Y坐标)开始显示
		m_rcClient.Width(),		//选择在目标DC显示的宽度
		m_rcClient.Height(),	//选择在目标DC显示的高度
		m_MemDC.GetMemoryDC(),	//源DC
		0,						//截取源DC的区域,起始X坐标
		0,						//截取源DC的区域,起始Y坐标
		nPicWidth,		//截取源DC的宽度
		nPicHeight,		//截取源DC的高度
		SRCCOPY);				//拷贝的模式
           
2.缩放 直接缩放Client的大小就可以,并记录缩放比例 3.图形的移动与拉伸。 在OnMouseMove、OnLButtonDown、OnLButtonUp相关函数中,先做鼠标偏移 1)获得鼠标在缩放后的图片的位置。 2)计算鼠标在1:1图片的位置 3)对图形进行操作。记录操作图形后,在1:1图片中的相关参数(坐标、长宽等等) (因为绘制时就是在1:1图片中绘制的,所以只记录1:1下的参数就好了) PS: 这种做法,避免了图形坐标的转换,只需要转换鼠标坐标即可。 但是这样做,图形的线宽PenWidth会随着比例放大而放大。 所以在缩放的步骤中,应该多加一个步骤,调整PenWidth,让PenWidth不跟随图形的缩放而放大缩小。 以上是我目前已经实现的做法,而且比较简洁,图形不会发生偏移。 楼主可以参考一下!
Ilson_ 2017-09-09
  • 打赏
  • 举报
回复
引用 6 楼 VergilYe 的回复:
前段时间我也在做这个,你可以试试我的方法: 1.绘制(OnPaint函数) 1) 1:1未缩放的图片拷贝到内存DC 2)绘制图元到内存DC 3)内存DC拉伸至窗口DC。(StretchBlt)

	dc.StretchBlt(
		0,			//选择在目标DC什么位置(X坐标)开始显示
		0,			//选择在目标DC什么位置(Y坐标)开始显示
		m_rcClient.Width(),		//选择在目标DC显示的宽度
		m_rcClient.Height(),	//选择在目标DC显示的高度
		m_MemDC.GetMemoryDC(),	//源DC
		0,						//截取源DC的区域,起始X坐标
		0,						//截取源DC的区域,起始Y坐标
		nPicWidth,		//截取源DC的宽度
		nPicHeight,		//截取源DC的高度
		SRCCOPY);				//拷贝的模式
           
2.缩放 直接缩放Client的大小就可以,并记录缩放比例 3.图形的移动与拉伸。 在OnMouseMove、OnLButtonDown、OnLButtonUp相关函数中,先做鼠标偏移 1)获得鼠标在缩放后的图片的位置。 2)计算鼠标在1:1图片的位置 3)对图形进行操作。记录操作图形后,在1:1图片中的相关参数(坐标、长宽等等) (因为绘制时就是在1:1图片中绘制的,所以只记录1:1下的参数就好了) PS: 这种做法,避免了图形坐标的转换,只需要转换鼠标坐标即可。 但是这样做,图形的线宽PenWidth会随着比例放大而放大。 所以在缩放的步骤中,应该多加一个步骤,调整PenWidth,让PenWidth不跟随图形的缩放而放大缩小。 以上是我目前已经实现的做法,而且比较简洁,图形不会发生偏移。 楼主可以参考一下!
你跟我的做法差不多 不过我觉得用GDI+的方式更好 因为只要输入缩放比例 系统会自动帮你装换坐标, 而且坐标还可以是小数,取不取整由你决定, 其他还有很多好的方面,具体的你还可以去试试。
Ilson_ 2017-09-04
  • 打赏
  • 举报
回复
用GDI+ 里面的函数 ScaleTransform() 就可实现 谢谢各位
jsxyhelu2015 2017-09-03
  • 打赏
  • 举报
回复
http://www.cnblogs.com/jsxyhelu/p/6350260.html greenopenpaint里面已经实现,挖掘一下吧。
hhl001comaa 2017-09-02
  • 打赏
  • 举报
回复
肯定有误差 感觉可能要记住原大小位置,每次缩放要在原大小数值上进行
赵4老师 2017-08-17
  • 打赏
  • 举报
回复
Coordinate Space and Transformation Functions The following functions are used with coordinate spaces and transformations. ClientToScreen CombineTransform DPtoLP GetCurrentPositionEx GetGraphicsMode GetMapMode GetViewportExtEx GetViewportOrgEx GetWindowExtEx GetWindowOrgEx GetWorldTransform LPtoDP MapWindowPoints ModifyWorldTransform OffsetViewportOrgEx OffsetWindowOrgEx ScaleViewportExtEx ScaleWindowExtEx ScreenToClient SetGraphicsMode SetMapMode SetViewportExtEx SetViewportOrgEx SetWindowExtEx SetWindowOrgEx SetWorldTransform
Ilson_ 2017-08-17
  • 打赏
  • 举报
回复
通过缩放比例确实可以进行图元和图片缩放 但是缩放后的点有可能偏离原始点在图片上的位置,也就是缩放后的点会有1到2个像素的误差 小弟初学不懂各位有没有好的方法 求解
打开链接下载源码: https://pan.quark.cn/s/8ec3d104bde6 华为MA5671是一款针对宽带接入需求而研发的智能型光猫设备,其核心应用场景为家庭用户及小型企业环境。该设备运用了千兆以太网技术,能够提供卓越的网络连接性能,从而使用户可以体验到稳定流畅的互联网服务。其完整名称为SmartAX MA5671,其中"SmartAX"是华为对其智能接入产品系列的特定命名,意指该设备具备智能化管理功能与自动化配置特性。固件,即Firmware,是指存储于硬件设备内部的一套程序代码,负责控制设备的各项功能运作并合理调配硬件资源。在华为MA5671设备中,固件发挥着核心作用,它直接影响着设备的操作系统运行机制、网络协议兼容性、安全防护机制以及性能表现等多个维度。"MA5671V8R313C00SPC100"作为该固件的标识编号,通过此代码可以解析出以下几个关键层面的信息: 1. **V8**:这通常象征固件的主版本号,或许表明这是第8代产品形态或第8次主要升级迭代。 2. **R313**:这可能代表固件的次级版本或修订层级,暗示着相较于V8版本,该版本经历了313次的迭代优化。 3. **C00**:这部分或许与设备的特定型号设定或地域适配性相关,不同的C00编码可能对应不同的功能模块配置或区域适应性调整。 4. **SPC100**:最后的这一段编码可能标识着特殊版本或性能增强配置,SPC(Special Performance Configuration)可能是华为针对特定性能优化版本设定的代号,而100可能代表这种优化措施的等级或序列编号。 在实际部署过程中,将固件保持为最新版本是非常重要的,这样做能够有效修正已知的安全隐患,优化设备运作效能,...

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧