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

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

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

(0)

相关推荐

  • C#控件Picturebox实现鼠标拖拽功能

    工作需要,要在一个Form里面实现一个实时预览的picturebox图像,由于picturebox可能会遮挡到其后面的画面,所以要求picturebox可以由用户自行拖拽,类似于悬浮框. 原理说明 在网上兜了几圈之后,决定用三段代码实现.首先要注册鼠标的三个事件:移动.鼠标左键按下.鼠标左键抬起,当然,都是在picturebox上的动作.注册三个事件后,即可以在三个对应的事件函数里面实现拖拽. 代码实例 首先在窗体设计器生成的代码里面注册picturebox的鼠标事件.注:网上说当你添加pict

  • C# 文件拖拽和pixturBox缩放与拖拽功能

    文件拖拽: 效果:将一个文件拖拽到窗体的某个控件时,将该控件的路径显示在该控件上,只要拿到了路径自然可以读取文件中的内容了. 将一个控件的属性AllowDrop设置为true,然后添加DragDrop.DragEnter时间处理函数,如下: private void txtAppPath_DragEnter(object sender, System.Windows.Forms.DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.Fi

  • UGUI实现图片拖拽功能

    这一篇博客我们来使用UGUI实现图片的拖拽功能. 说到拖拽,那必然离不开坐标,UGUI 的坐标有点不一样,它有两种坐标,一种是屏幕坐标,还有一种就是 UI 在Canvas内的坐标(暂时叫做ugui坐标.),这两个坐标是不一样的,所以拖拽是就需要转换.因为鼠标的移动是屏幕坐标,而 UI 的移动是ugui坐标.转换的方法: RectTransformUtility.ScreenPointToLocalPointInRectangle ( - );这个方法可以把屏幕坐标转换成 ugui 坐标.至于屏幕

  • C# 实现的图片盖章功能,支持拖拽、旋转、放缩、保存

    实现图片盖章功能,在图片上点击,增加"图章"小图片,可以拖拽"图章"到任意位置,也可以点击图章右下角园框,令图片跟着鼠标旋转和放缩. 操作方法:1.点击增加"图章"2.选中移动图标3.点中右下角放缩旋转图章. 效果图: 实现代码如下: 1.  窗口Xaml代码 复制代码 代码如下: <Window x:Class="Lenovo.YogaPaster.ImageEditWindow"    xmlns="htt

  • C#组件FormDragger窗体拖拽器详解

    适用:.net2.0+ winform项目 介绍: 类似QQ.迅雷等讲究UI体验的软件,都支持在窗口内多处地方拖动窗口,而不必老实巴交的去顶部标题栏拖,这个组件就是让winform也能这样随性拖拽,随性度或更甚.先看效果: 可拖拽的地方包括不限于: 窗体.Panel.GroupBox.TabControl等容器控件的空白区: 菜单栏.工具栏.状态栏等bar的空白区,以及无效项目: Label.PictureBox.ProgressBar等通常不与鼠标交互的控件: 一切无效控件(Enabled为f

  • C#实现TreeView节点拖拽的方法

    本文实例讲述了C#实现TreeView节点拖拽的方法.分享给大家供大家参考.具体如下: public Form1() { InitializeComponent(); treeView1.AllowDrop = true; treeView1.ItemDrag += new ItemDragEventHandler(treeView1_ItemDrag); treeView1.DragEnter += new DragEventHandler(treeView1_DragEnter); tree

  • C#利用控件拖拽技术制作拼图游戏

    主要实现的功能: 1.程序附带多张拼图随机拼图. 2.可手动添加拼图. 3.游戏成功判断. 4.30秒超时判断. Puzzle.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms

  • C# ListBox中的Item拖拽代码分享

    我们先来看下运行效果图 Form1.cs代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System

  • C#实现Dev Grid拖拽移动行的方法

    本文实例讲述了C#实现Dev Grid拖拽移动行的方法.分享给大家供大家参考.具体如下: 完整实例代码点击此处本站下载.     拖拽时带行截图效果 实现代码如下: /// <summary> /// 拖拽帮助类 /// </summary> public static class DragHelper { /// <summary> /// BandedGridView 拖拽 /// </summary> /// <param name="

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

    本文实例为大家分享了C# picturebox实现图像拖拽和缩放的具体代码,供大家参考,具体内容如下 1.核心步骤: ①新建Point类型全局变量mouseDownPoint,记录拖拽过程中鼠标位置: ②MouseDown事件记录Cursor位置: ③MouseMove事件计算移动矢量,并更新pictureBox1.Location. 代码: private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { if (e.B

  • Winform控件Picture实现图片拖拽显示效果

    最近做了一个小工具,在Winform中对Picture控件有一个需求,可以通过鼠标从外部拖拽图片到控件的上,释放鼠标,显示图片! 首先你需要对你的整个Fom窗口的AllowDrop设置Ture //函数从动态链接库中倒入(模拟鼠标事件) [System.Runtime.InteropServices.DllImport("user32")] private static extern int mouse_event(int dwFlags, int dx, int dy, int cB

  • js前端日历控件(悬浮、拖拽、自由变形)

    很少发现网上有简洁好用的自定义前端控件的贴子,最近项目中需要,自己YY开始写前端控件,在此给大家分享 控件是基于jQuery.UI的Widget写的,写起来就方便很多,使用起来跟普通jQuery控件一样$(#id).control(option),看着眼熟吧,下面就开始了. 首先说下控件的依赖包,加载控件的时候必须先加载jQuery, jQuqery.UI, 另外jquery-ui.css 这个包也需要引用,此包主要应用了jQuery拖拽和放缩的样式,控件样式方面大家自由发挥,给了个自己写的默认

  • C# 解决datagridview控件显示大量数据拖拉卡顿问题

    问题描述: 由于在使用SQL查询大量的数据并一次显示到dataGridView控件,出现拖拉的时候卡顿. 解决方法: 1.首先分页. 2.其次把显示控件设置双buffer. 解决过程如下: 1.设置dataGridView双buffer代码如下,需要引用反射命名空间 Type dgvType = this.dataGridView1.GetType(); PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", BindingFla

  • WinForm实现的图片拖拽与缩放功能示例

    本文实例讲述了WinForm实现的图片拖拽与缩放功能.分享给大家供大家参考,具体如下: 最近做项目的时候遇到上传施工平面布置图,查看,因为图片比较大,一般的显示器分辨率无法显示全,然后还需要放大看清楚图片里面的文字内容,所以需要用到图片的拖拽与缩放功能.这里整理下具体操作. 首先新建一个窗体,拖一个panel控件到窗体中,然后在拖一个pictureobx控件到panel中,然后在添加个上传图片的按钮: 具体代码: using System; using System.Collections.Ge

  • JavaScript实现拖拽和缩放效果

    本文实例为大家分享了JavaScript实现拖拽和缩放效果的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>拖拽缩放</title> <me

  • 利用vue组件实现图片的拖拽和缩放功能

    目录 前言 如图所示: 方法如下: 总结 前言 vue实现一个组件其实很简单但是要写出一个好的可复用的组件那就需要多学习和钻研一下,一个好的组件必须有其必不可少的有优点:一是能提高应用开发效率.测试性.复用性等:二是组件应该是高内聚.低耦合的:三是组件应遵循单向数据流的原则. 在实现我的图片的拖拽组件我们的搞清其原理,在这里我使用的是mousedown,mousemove和mouseup来实现拖拽. 如图所示: 方法如下: 1.新建ElementDrag.vue文件内容如下: <template

  • C#控件picturebox实现画图功能

    本文实例为大家分享了C# picturebox实现画图功能的具体代码,供大家参考,具体内容如下 在Form上添加 一个pictureBox,一个button控件 如图所示: 这样我们的绘画面板就弄好了,把pictureBox的dock属性设置为fill,按键为清屏的作用. private Point p1, p2;//定义两个点(启点,终点) private static bool drawing=false;//设置一个启动标志 private void pictureBox1_MouseDo

  • android 大图片拖拽并缩放实现原理

    由于最近项目忙,博客一直没有时间更新,今天有点时间就连续更新两篇吧,过过瘾. 这篇图片拖拽缩放也是我在项目中用到的,今天整理一下,将源码奉献给大家,希望对大家以后碰到相似的问题有帮助. 这篇就不做过多介绍了,直接上源码: 复制代码 代码如下: public class SpacePageActivity extends Activity { private LinearLayout linnerLayout_spacepage; private RelativeLayout relativeLa

随机推荐