zoukankan      html  css  js  c++  java
  • C#图像显示实现拖拽、锚点缩放功能[转 有耐心的小王]

    1.图像拖拽

    核心步骤:

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

    ②MouseDown事件记录Cursor位置;

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

    代码:
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
     51
     52
     53
     54
     55
     56
     57
     58
     59
     60
     61
     62
     63
     64
     65
     66
     67
     68
     69
     70
    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;
    }
    }
     来自CODE的代码片
    picmove.cs
     
    2.图像缩放
    核心思想:利用picturebox的zoom模式,根据图像显示大小更改picturebox大小,记录鼠标位置补偿缩放位移,实现锚点缩放,即以鼠标位置为中心进行缩放。
    代码:
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
    //实现锚点缩放(以鼠标所指位置为中心缩放);
    //步骤:
    //①先改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);
    }
     来自CODE的代码片
    piczoom.cs
    程序下载:
  • 相关阅读:
    HTML DOM 06 节点关系
    HTML DOM 05 事件(三)
    HTML DOM 05 事件(二)
    HTML DOM 05 事件(一)
    html DOM 04 样式
    html DOM 03 节点的属性
    html DOM 02 获取节点
    html DOM 01 节点概念
    JavaScript 29 计时器
    JavaScript 28 弹出框
  • 原文地址:https://www.cnblogs.com/weiterli/p/7833501.html
Copyright © 2011-2022 走看看