当前位置: 移动技术网 > IT编程>开发语言>c# > C#控件picturebox实现图像拖拽和缩放

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

2019年07月18日  | 移动技术网IT编程  | 我要评论
本文实例为大家分享了c# picturebox实现图像拖拽和缩放的具体代码,供大家参考,具体内容如下 1.核心步骤: ①新建point类型全局变量mousedownpo

本文实例为大家分享了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);
}

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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网