zoukankan      html  css  js  c++  java
  • C#实现图像拖拽以及锚点缩放功能

    本文主要实现C#窗体图像拖拽以及锚点缩放功能

    1、新建Windows窗体应用项目,添加一个panel控件,在panel控件上添加picturebox控件

    代码如下:

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace SupremeWindowsForms
    {
        public partial class Form3 : Form
        {
            #region Fields and Properties
            Size size;
            bool flag = false;
            Point pointLast;
            Point pointCurrent;
            #endregion
    
            #region Methods
    
            public Form3()
            {
                InitializeComponent();
                this.MouseWheel += Form3_MouseWheel;
                this.pictureBox1.Image = Image.FromFile(@"F:PersonLongtengLongtengSlnSupremeWindowsFormspicture1.jpg");
                this.pictureBox1.MouseDown += PictureBox1_MouseDown;
                this.pictureBox1.MouseMove += PictureBox1_MouseMove;
                this.pictureBox1.MouseUp += PictureBox1_MouseUp;
                size = panel1.Size;
            }
    
            /// <summary>
            /// 鼠标的滚动轮向上下的滚动
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void Form3_MouseWheel(object sender, MouseEventArgs e)
            {
                if (e.Delta > 0)//鼠标的滚动轮向上的滚动
                {
                    size.Width += (int)(((float)e.Delta / (float)size.Width) * size.Width);
                    size.Height += (int)(((float)e.Delta / (float)size.Height) * size.Height);
                    if (size.Width > panel1.Parent.Size.Width || size.Height > panel1.Parent.Size.Height)
                    {
                        size = pictureBox1.Size;
                    }
                    panel1.Size = size;
                }
                else //鼠标的滚动轮向下的滚动
                {
                    size.Width -= (int)(((float)-e.Delta / (float)size.Width) * size.Width);
                    size.Height -= (int)(((float)-e.Delta / (float)size.Height) * size.Height);
                    if (size.Width <= 0 || size.Height <= 0)
                    {
                        size = new Size(60, 60);
                    }
                    panel1.Size = size;
                }
            }
    
            /// <summary>
            /// 在图片控件上按住鼠标左键
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void PictureBox1_MouseDown(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                {
                    Point point = new Point(e.X, e.Y);//注意:鼠标的坐标位置,是以当前的窗体的坐标为基准
                    Console.WriteLine($"鼠标按下的位置坐标:{point.X},{point.Y}");
                    Point point1 = PointToScreen(point);
                    Console.WriteLine($"鼠标按下的位置坐标PointToScreen:{point1.X},{point1.Y}");
                    pointLast = point1;
                    flag = true;
                }
            }
    
            /// <summary>
            /// 在图片控件上按住鼠标左键,移动
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void PictureBox1_MouseMove(object sender, MouseEventArgs e)
            {
                if (flag)
                {
                    pointCurrent = MousePosition;//注意:以屏幕坐标为基准
                    Console.WriteLine($"鼠标拖动的位置坐标:{pointCurrent.X},{pointCurrent.Y}");
                    Point point = new Point(pointCurrent.X - pointLast.X, pointCurrent.Y - pointLast.Y);
                    Console.WriteLine($"鼠标Offset 坐标:{point.X},{point.Y}");
                    this.panel1.Location = point;
                }
            }
    
            /// <summary>
            /// 在图片控件上按住鼠标左键,移动之后,松开
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void PictureBox1_MouseUp(object sender, MouseEventArgs e)
            {
                if (flag)
                {
                    flag = false;
                }
            }
            #endregion
        }
    }

    运行效果:

     鼠标滚动滚轮缩放效果-放大

    鼠标滚动滚轮缩放效果-缩小

     

     拖动效果

    注意

    1、控件上鼠标点击之后其他操作获取的鼠标的位置是相对当前窗体的位置,而鼠标移动的时候,获取的位置是相对于屏幕的位置。位置的转换可以通过PointToScreenPointToClient进行转换

  • 相关阅读:
    实验5 函数验证哥德巴赫猜想
    实验 7 综合练习四、编写程序,输入一批学生的成绩
    实验 7 综合练习三、编程,输入x后,根据下式计算并输出y值
    实验 7 综合练习二、填空
    实验 7 综合练习 一、填空
    输入n个整数,存入数组a中,分别按正序和逆序输出这些
    实验 6 数组1 输入n个整数,将它们存入数组a中。输出最大值和它所对应的下标
    实验5(2)编制程序,输入m、n(m≥n≥0)后,计算下列表达式的值并输出。 要求将计算阶乘的运算编写作函数fact(n),函数返回值的类型为float
    实验3:简单的分支与循环结构
    第七章:数组
  • 原文地址:https://www.cnblogs.com/1175429393wljblog/p/12069081.html
Copyright © 2011-2022 走看看