欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > C# >内容正文

C#

c# picturebox 图像拖拽和缩放

发布时间:2023/12/20 C# 60 豆豆
生活随笔 收集整理的这篇文章主要介绍了 c# picturebox 图像拖拽和缩放 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

核心步骤:

①新建Point类型全局变量mouseDownPoint,记录拖拽过程中鼠标位置;

②MouseDown事件记录Cursor位置;

③MouseMove事件计算移动矢量,并更新pictureBox1.Location。

代码: private void pictureBox1_MouseDown(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){mouseDownPoint.X = Cursor.Position.X; //记录鼠标左键按下时位置mouseDownPoint.Y = Cursor.Position.Y; isMove = true;pictureBox1.Focus(); //鼠标滚轮事件(缩放时)需要picturebox有焦点 }}private void pictureBox1_MouseUp(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){isMove = false; }}private void pictureBox1_MouseMove(object sender, MouseEventArgs e){pictureBox1.Focus(); //鼠标在picturebox上时才有焦点,此时可以缩放if (isMove){int x, y; //新的pictureBox1.Location(x,y)int moveX, moveY; //X方向,Y方向移动大小。moveX = Cursor.Position.X - mouseDownPoint.X;moveY = Cursor.Position.Y - mouseDownPoint.Y;x = pictureBox1.Location.X + moveX;y = pictureBox1.Location.Y + moveY; pictureBox1.Location = new Point(x, y);mouseDownPoint.X = Cursor.Position.X;mouseDownPoint.Y = Cursor.Position.Y; }}private void panel2_MouseDown(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){mouseDownPoint.X = Cursor.Position.X; //记录鼠标左键按下时位置mouseDownPoint.Y = Cursor.Position.Y;isMove = true;}}private void panel2_MouseUp(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){isMove = false;}}private void panel2_MouseMove(object sender, MouseEventArgs e){panel2.Focus(); //鼠标不在picturebox上时焦点给别的控件,此时无法缩放 if (isMove){int x, y; //新的pictureBox1.Location(x,y)int moveX, moveY; //X方向,Y方向移动大小。moveX = Cursor.Position.X - mouseDownPoint.X;moveY = Cursor.Position.Y - mouseDownPoint.Y;x = pictureBox1.Location.X + moveX;y = pictureBox1.Location.Y + moveY;pictureBox1.Location = new Point(x, y);mouseDownPoint.X = Cursor.Position.X;mouseDownPoint.Y = Cursor.Position.Y;}}2.图像缩放核心思想:利用picturebox的zoom模式,根据图像显示大小更改picturebox大小,记录鼠标位置补偿缩放位移,实现锚点缩放,即以鼠标位置为中心进行缩放。

zoomstep --- 自己定义滚轮滑动缩放大小

代码://实现锚点缩放(以鼠标所指位置为中心缩放);//步骤://①先改picturebox长宽,长宽改变量一样;//②获取缩放后picturebox中实际显示图像的长宽,这里长宽是不一样的;//③将picturebox的长宽设置为显示图像的长宽;//④补偿picturebox因缩放产生的位移,实现锚点缩放。// 注释:为啥要②③步?由于zoom模式的机制,把picturebox背景设为黑就知道为啥了。//这里需要获取zoom模式下picturebox所显示图像的大小信息,添加 using System.Reflection;//pictureBox1_MouseWheel事件没找到。。。手动添加,别忘在Form1.Designer.cs的“Windows 窗体设计器生成的代码”里加入: //this.pictureBox1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseWheel)。private void pictureBox1_MouseWheel(object sender, MouseEventArgs e){int x = e.Location.X;int y = e.Location.Y;int ow = pictureBox1.Width;int oh = pictureBox1.Height; int VX, VY; //因缩放产生的位移矢量if (e.Delta > 0) //放大 {//第①步pictureBox1.Width += zoomStep; pictureBox1.Height += zoomStep;//第②步PropertyInfo pInfo = pictureBox1.GetType().GetProperty("ImageRectangle", BindingFlags.Instance |BindingFlags.NonPublic);Rectangle rect = (Rectangle)pInfo.GetValue(pictureBox1, null);//第③步pictureBox1.Width = rect.Width;pictureBox1.Height = rect.Height;}if (e.Delta < 0) //缩小 {//防止一直缩成负值if (pictureBox1.Width < myBmp.Width / 10)return;pictureBox1.Width -= zoomStep;pictureBox1.Height -= zoomStep;PropertyInfo pInfo = pictureBox1.GetType().GetProperty("ImageRectangle", BindingFlags.Instance |BindingFlags.NonPublic);Rectangle rect = (Rectangle)pInfo.GetValue(pictureBox1, null);pictureBox1.Width = rect.Width;pictureBox1.Height = rect.Height;}//第④步,求因缩放产生的位移,进行补偿,实现锚点缩放的效果VX = (int)((double)x * (ow - pictureBox1.Width) / ow);VY = (int)((double)y * (oh - pictureBox1.Height) / oh);pictureBox1.Location = new Point(pictureBox1.Location.X + VX, pictureBox1.Location.Y + VY);}

总结

以上是生活随笔为你收集整理的c# picturebox 图像拖拽和缩放的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。