想要用winfrom窗体实现一个放大镜的功能,但是做了两天还是没有头绪。只能来请教各位大虾了。
在网上也找到了放大镜的代码,他的效果是这样的:
当鼠标移到哪里,就以鼠标的坐标获取图片在显示在窗体中:
上面的是以鼠标来取图的,鼠标移到哪就取到哪,但我想要实现的效果是:当窗体移动到哪里就将这个窗体范围下面的图片显示出来,并且可以按倍数放大。不同的地方就是我想要以窗体移到来取图,取的范围正好是被这个窗体覆盖掉的范围。
也许有的朋友会说把鼠标移动换成窗体移到就可以了,我也试了,但实际变成这样了:
我认为会这样是因为他取的图是这个窗体的图,而不是被这个窗体所覆盖的图。但是我又不知道怎么去解决,请大神们帮帮忙,指点下。
告诉下我要实现这个功能的思路,或者怎么把取图的方式修改好。有代码最好,本人新手希望讲解信息点。拜谢。
你的截图窗口都把你要截的图给挡住了,再想截自然截取不下来,能看到的只是你的截图窗口而已。
对于你这种场景,在你的截图窗口未显示前,你先把整个大面积的地图给截下来,待你的截图窗口显示后,根据截图窗口的位置和大小在最开始的大图中裁剪出子图并缩放,把这个子图在你的截图窗口中显示即可。如果你的窗口移动了,重新裁剪新的子图即可。
截取整个大面积图的方法是这样么?
mScreenImage = new Bitmap(
System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height, System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width);
那我要在这个大图中截取子图该用什么方式?
还有一个问题就是我要放大的是个地图,所以他的那整个大图是可以变的而不是固定的,那用这种思路还可以解决么?
这个功能实现的难点就在于怎么获取被窗体覆盖那那部分图片,有没有方法可以实现当窗体移动就重新获取被覆盖范围中的图片呢?
@_Sunshineゾ:
1. 截取大图也好,在大图中截取子图也好,这些都是些基础的图像操作,我就不详细说明了,查下资料自己解决比什么都强。我给的这个截图方法本身和最上面你列举的那个放大镜没有什么本质的不同,你能实现那个放大镜的操作的话,这几个操作便难不倒你。
2. 大图变化了的话,把你的截图窗口隐藏下,重新截取更新大图后再显示出来即可。
你的地图跟你的放大镜是在同一个进程中吗?
在大图里面截取小图的方式,是把坐标都换算成屏幕坐标,然后以大图的原点为原点,在大图中把被你的放大镜窗口遮挡住的区域给截取出来。
不是在同一个进程中哦。
怎样换算屏幕坐标?有代码可以参考下么?
@_Sunshineゾ: 假设你知道你要截取的窗口的句柄 hWnd,然后用下面的函数可以读取该窗体的矩形区域:
GetWindowRect(__in HWND hWnd,__out LPRECT lpRect);这是以屏幕坐标表示的。
同样,你放大镜窗体的矩形区域也可以通过上面函数获取。
@Launcher: 嗯 在网上看到的那个列子也是调用了API中的各种函数,还有的说用printwindow函数来实现,但是API我没有用过所以看不懂他那代码,可以写完整点么?
@_Sunshineゾ: http://www.programfan.com/CLUB/showtxt.asp?id=281515 是这个例子吧,关于截取指定窗口的例子。其中使用的Win32 API,在C#中,你可以使用PInvoke方式来是用这些API。
哈哈,我也感兴趣
但是貌似解决不了呢。。
直接调用Win32API的放大镜
如何调用呢? 有可以参考下的代码么?
@_Sunshineゾ: 好吧,无解。