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

Ilson_ 2017-08-17 04:20:13
现有一个问题 : MFC基于对话框程序中 在程序界面加载了一张图 然后在图上进行画线、画圆、画矩形...等操作 , 然后我需要滚动鼠标滚轮以缩放图形(图片以及图元点、线、圆),在缩放时要求绘制的图形不能偏离在图上的相对位置。 再点击绘制的图元时需要知道绘制的点相对于图像是在什么位置(图片左上角为(0, 0)点) 求解
...全文
1355 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个像素的误差 小弟初学不懂各位有没有好的方法 求解

19,468

社区成员

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

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