首页 > 编程 > C# > 正文

C#控件picturebox实现图像拖拽和缩放

2020-01-24 00:14:54
字体:
来源:转载
供稿:网友

本文实例为大家分享了C# picturebox实现图像拖拽和缩放的具体代码,供大家参考,具体内容如下

1.核心步骤:

①新建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);}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表