前记:
搞了很久,就是希望实现在指定范围内根据鼠标位置放大、缩小、移动图片,开始只有一个PictureBox搞了好久各种莫名其妙的bug(指现象),这么困难的原因是pictureBox自身的大小和图片路径的图片实际大小很混乱,后来添加了Panel指定范围,同时利用PictureBox 的Zoom模式实现缩放。尤其是你希望图片开始时是适应指定范围的全图,然后根据鼠标位置实现放大、缩小、移动。
大致步骤:
1、弄一个面板来指定范围(先初始化Panel panel):
Form1.Controls.Add(panel);位置new Point(x,y), 尺寸new Size(w, h)。
2、面板控件里添加PictureBox(先初始化),设置位置尺寸和SizeMode:
panel.Controls.Add(pictureBox);new Point(0,0), panel.Size,Zoom。
3、获取图片路径,加载图片LoadImage(imagePath),注册鼠标事件pictureBox.MouseWheel、...Down、...Up、...Move。
4、LoadImage:用PictureBox显示图片,获取Zoom模式下显示图片的尺寸,更改pictureBox尺寸和位置(Zoom模式下显示图片的尺寸和位置)。(有代码)
5、鼠标事件:根据鼠标位置和滚筒实现放大、缩小、移动图片。
移动:(记得获取控件焦点)
Down:记录鼠标按下时位置,isMove=true;
Up:isMove=flase;
Move:if(isMove)计算XY方向移动量,更新pictureBox位置
缩放:(鼠标在pictureBox上)(有代码)
Wheel(在鼠标位置缩放):让鼠标在控件范围内滚动时不会触发页面滚动条也跟随滚动,获取缩放因子,获取pictureBox缩放后的大小和位置
关键代码:
获取Zoom模式下显示图片的尺寸和位置:
private void LoadImage(string imagepath)
{ // 通过 PictureBox 显示图片
//pictureBox.Image = LoadNetworkPic(imagepath);你自己的的图片加载方法
Size imageSize = pictureBox.Image.Size;
Rectangle clientRectangle = pictureBox.ClientRectangle;
float imageAspect = imageSize.Width / (float)imageSize.Height;
float controlAspect = clientRectangle.Width / (float)clientRectangle.Height;
if (imageAspect < controlAspect)
{
imageHeight = clientRectangle.Height;
imageWidth = (int)(imageHeight * imageAspect);
top = 0;
left = (clientRectangle.Width - imageWidth) / 2;
}
else
{
imageWidth = clientRectangle.Width;
imageHeight = (int)(imageWidth / imageAspect);
left = 0;
top = (clientRectangle.Height - imageHeight) / 2;
}
pictureBox.Size=new Size(imageWidth,imageHeight);
pictureBox.Location=new Point(left,top);
//注册鼠标事件
pictureBox.MouseWheel += new MouseEventHandler(PictureBox_MouseWheel);
pictureBox.MouseMove += new MouseEventHandler(PictureBox_MouseMove);
pictureBox.MouseDown += new MouseEventHandler(PictureBox_MouseDown);
pictureBox.MouseUp += new MouseEventHandler(PictureBox_MouseUp);
}
Wheel事件
比较白痴的画图举例找规律(欢迎评论区代码改进)
private void PictureBox_MouseWheel(object sender, MouseEventArgs e)
{
if (pictureBox.ClientRectangle.Contains(e.Location))
{
((HandledMouseEventArgs)e).Handled = true;
pictureBox.Focus();
float zoomChange = e.Delta> 0? 2f : 0.5f;
float zoomFactor = 1.0f;
zoomFactor *= zoomChange;
// 计算缩放后图片的大小
int newWidth = (int)(pictureBox.Width * zoomFactor);
int newHeight = (int)(pictureBox.Height * zoomFactor);
if(e.Delta> 0){
newX = (int)(pictureBox.Left - e.X);
newY = (int)(pictureBox.Top - e.Y);}
else{
newX = (int)(pictureBox.Left + e.X / 2);
newY = (int)(pictureBox.Top + e.Y / 2);}
pictureBox.Size = new Size(newWidth, newHeight);
pictureBox.Location = new Point(newX, newY);
}
}