在对话框中添加一张图片,怎么动态编辑图片(如放大和拖动)

时间:2022-11-28 23:10:24
底图是一个静态的图片
1、插入一个图片,弹出选择图片对话框,并加载图片
[img=http://album.hi.csdn.net/app_uploads/sin816/20081129/203208217.p.jpg?d=20081129204719436][/img]
2.可以拖动图片周边的节点和边线进行图片框的大小设置,当大小变化时区域内的图片会作相应的拉伸;当鼠标点击图片框内部时可以对图片进行拖动。
要求:底图不变,框内的地图自动扩充如下图:
[img=http://album.hi.csdn.net/app_uploads/sin816/20081129/203208264.p.jpg?d=20081129204921311][/img]

本人比较笨,而此任务要求在一个天内完成(11.30下午5点前)。采用VC6.0编写
哪位前辈懂的,麻烦给出详细思路和关键代码。不胜感激

10 个解决方案

#1


添加的图片可以和地图无关

#2


关注中。

#3


响应WM_PAINT消息,用CreateCompatibleDC创建内存DC,用SelectObject将位图选入DC,用StretchBlt把内存DC中的图象复制到窗口DC中,最后用DeleteDC删除内存DC。

#4


cnzdgs 好多星星啊 哈哈
能不能说通俗点,第一次导入底图,第二次导入的图怎么实现边框有4个矩形角,可拖动,放大或缩小啊?

#5


楼主可以这样考虑:

在你的类中设定一个全局变量 CRect imgRect;

你绘图的时候都基于这个imgRect,剩下的就是怎么通过鼠标事件来改变这个imgRect的大小和位置了。

四个顶点可以分别在建立4个CRect PT[4];
通过这4个PT来定位你的四个鼠标热区。

在MouseDown事件中判断,鼠标点中的是PT里面的还是点在了ImgRect。使用的函数是CRect::PtInRect( CPoint point );

判断鼠标是否点中热区或拖动图片,需要4个热区标志和一个拖动标志 BOOL HT[4]; BOOL ST;

然后就是到鼠标移动事件里面判断是否为拖动(同样需要标志),如果是拖动;再判断是那中拖动,如果是四个点的热区拖动,那么就需要改动imgRect的
大小,(情况比较简单,正矩形,拖动一个点,很容易计算),如果是图片移动,那么只需要将imgRect移动即可。

鼠标抬起的时候记得要,给imgRect赋值,并清理所有标志。

最后呢,就是要使用这个imgRect完成贴图,把一个图片贴到制定的CRect应该很容易了;鼠标移动过程中要使用内存绘图,防止闪烁。

大致就是这些内容了。 这样的程序网上可能会有,自己做也不是很麻烦。楼主只要细心没问题的。

#6


Tinary3v0 一出,必属精品
我先试试看

#7


你可以考虑用CRectTracker(橡皮筋类)去试试

#8


建议用CRectTracker 类

可以参考下面实现,直接在地图上面绘制一个CStatic,指定一个位图即可,实现了放大/缩小/拖动


A Multiple Selection based Control Tracker

http://www.codeproject.com/KB/miscctrl/controltracker.aspx

#9


按Tinary3v0的思路搞定了,后来师兄说可以用CRectTracker类快速实现
感谢各位回复啊

#10


sin816 最近也在做这样一个效果,在网上查了许多但是都没有一个比较合理的,能不能将你的代码发到我的邮箱呢,感激不尽!
邮箱:1255798510@qq.com

#1


添加的图片可以和地图无关

#2


关注中。

#3


响应WM_PAINT消息,用CreateCompatibleDC创建内存DC,用SelectObject将位图选入DC,用StretchBlt把内存DC中的图象复制到窗口DC中,最后用DeleteDC删除内存DC。

#4


cnzdgs 好多星星啊 哈哈
能不能说通俗点,第一次导入底图,第二次导入的图怎么实现边框有4个矩形角,可拖动,放大或缩小啊?

#5


楼主可以这样考虑:

在你的类中设定一个全局变量 CRect imgRect;

你绘图的时候都基于这个imgRect,剩下的就是怎么通过鼠标事件来改变这个imgRect的大小和位置了。

四个顶点可以分别在建立4个CRect PT[4];
通过这4个PT来定位你的四个鼠标热区。

在MouseDown事件中判断,鼠标点中的是PT里面的还是点在了ImgRect。使用的函数是CRect::PtInRect( CPoint point );

判断鼠标是否点中热区或拖动图片,需要4个热区标志和一个拖动标志 BOOL HT[4]; BOOL ST;

然后就是到鼠标移动事件里面判断是否为拖动(同样需要标志),如果是拖动;再判断是那中拖动,如果是四个点的热区拖动,那么就需要改动imgRect的
大小,(情况比较简单,正矩形,拖动一个点,很容易计算),如果是图片移动,那么只需要将imgRect移动即可。

鼠标抬起的时候记得要,给imgRect赋值,并清理所有标志。

最后呢,就是要使用这个imgRect完成贴图,把一个图片贴到制定的CRect应该很容易了;鼠标移动过程中要使用内存绘图,防止闪烁。

大致就是这些内容了。 这样的程序网上可能会有,自己做也不是很麻烦。楼主只要细心没问题的。

#6


Tinary3v0 一出,必属精品
我先试试看

#7


你可以考虑用CRectTracker(橡皮筋类)去试试

#8


建议用CRectTracker 类

可以参考下面实现,直接在地图上面绘制一个CStatic,指定一个位图即可,实现了放大/缩小/拖动


A Multiple Selection based Control Tracker

http://www.codeproject.com/KB/miscctrl/controltracker.aspx

#9


按Tinary3v0的思路搞定了,后来师兄说可以用CRectTracker类快速实现
感谢各位回复啊

#10


sin816 最近也在做这样一个效果,在网上查了许多但是都没有一个比较合理的,能不能将你的代码发到我的邮箱呢,感激不尽!
邮箱:1255798510@qq.com