作者:fuxw | 来源:互联网 | 2023-07-18 13:59
做了一个winform的图片浏览器,放入了splitContainer,在panel1中加入了picturebox,然后通过picturebox的事件MOVE,CLICK,UP,DOUWN,MOUS
做了一个winform的图片浏览器,放入了splitContainer,在panel1中加入了picturebox,然后通过picturebox的事件MOVE,CLICK,UP,DOUWN, MOUSEwHILE,用两种方法实现了图片的放大,缩小,拖动,(针对picturebox控件和picturebox.image进行的),当图片大小大于picturebox时,图像显示不完,如果在不拖动的情况下,要想看不到的区域作图,就需要拖动图片作图,但是作图(bitmap)后发现画上去的线或者图片与自己想要画的位置出现了偏移,估计是坐标系不同,导致在鼠标down的时候取到的位置并不是图片上的x,y,而是工作区中的x,和y,现在不知道该怎么做了,请各位高手指点!!!!
21 个解决方案
你是如何将bmp在pic上偏移和缩放的,自己应该保留了参数吧
根据比例换算一下坐标啊
否则当然是只能获取到鼠标点击到pic上的坐标,编译器也没法知道你的pic和你后台的bmp是啥关系
要么就别用bmp
而是在pic上直接作图
外面嵌套个panel,然后缩放pic
这样你获取的坐标就是准确的坐标了
要么你用pic.width/bmp.width来算比例,然后根据比例,将坐标换算成bmp的坐标
为啥要减去e.Location.X??
既然是picturebox的点击事件,那就是picturebox的相对坐标,跟panel和form没有关系
你不要管picturebox相对于panel的坐标是啥
晕,看错了
你那是计算鼠标移动
现在的问题是,你获取了e.X和e.Y就直接把它当bmp的像素坐标了
但是picturebox本身就缩放过,和bmp已经不是同样的大小了
所以需要一个比例换算
比如你的bmp大小是200*200
你的pic大小是50*50
那么点击(20,20)这个点,对应bmp并不是(20,20),而是(80,80)
这个应该能理解吧
picturebox 在 panel 中
鼠标位置是参照 panel 的
当 panel 的滚动条被拖动后(假定向右 100 个像素)picturebox 的 left 将是 -100
这一点你打印出来看一下就知道了
所以画图时,要把鼠标位置折算的 picturebox,因为你是在 picturebox 中画图
bmpX/e.X=bmp.Width/pic.Width
等比公式
把e.X挪到等式右边去就计算出真实的坐标了
我这看看,这个我当时也没计算出来,不知道如何计算偏差,当时我遇到的问题是计算滚动条便宜位置的,后来作罢了
你琢磨出来算法了之后,@我一下,让我也学习学习
不要使用picturebox,使用panel自定义控件自定义,进行无刷新重绘,利用绘制坐标,图片与控件显示比例,鼠标点击坐标等,计算对应图片上的坐标
试试减去picturebox的location.x和location.y