本文主要实现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:\Person\Longteng\LongtengSln\SupremeWindowsForms\picture\1.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 > )//鼠标的滚动轮向上的滚动
{
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 <= || size.Height <= )
{
size = new Size(, );
}
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、控件上鼠标点击之后其他操作获取的鼠标的位置是相对当前窗体的位置,而鼠标移动的时候,获取的位置是相对于屏幕的位置。位置的转换可以通过PointToScreen和PointToClient进行转换

C#实现图像拖拽以及锚点缩放功能的更多相关文章

  1. C#图像显示实现拖拽、锚点缩放功能【转】

    1.图像拖拽 核心步骤: ①新建Point类型全局变量mouseDownPoint,记录拖拽过程中鼠标位置: ②MouseDown事件记录Cursor位置: ③MouseMove事件计算移动矢量,并更 ...

  2. flutter实现可缩放可拖拽双击放大的图片功能

    flutter实现可缩放可拖拽双击放大的图片功能 可缩放可拖拽的功能,可实现图片或者其他widget的缩放已经拖拽并支持双击放大的功能 我们知道官方提供了双击缩放,但是不支持拖拽的功能,我们要实现向百 ...

  3. 移动端的拖拽这个demo实现的功能

    SQL数据库适合那些需求确定和对数据完整性要去严格的项目.NoSQL数据库适用于那些对速度和可扩展性比较看重的那些不相关的,不确定和不断发展的需求. 总所周知,网页的加载速度跟图片是有很大的关系的,因 ...

  4. 【UWP】拖拽列表项的排序功能实现

    在一些允许用户自定义栏目顺序的app(如:凤凰新闻.网易云音乐等),我们可以方便地拖拽列表项来完成列表的重新排序,进而完成对栏目顺序的重排.这个功能很人性化,而实现起来其实很简单(甚至都不用写什么后台 ...

  5. Image 鼠标拖拽与鼠标中键的缩放

    一.Image在窗体上拖拽,势必会用到鼠标的三个事件(MouseDown,MouseUp,MouseMove),以左键为例,PictureBox为载体 Point mouseDownPoint = n ...

  6. WinForm实现简单的拖拽文件到出题的功能(C#)(3)

    string path = ((System.Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString(); textBox1. ...

  7. JavaScript动画-拖拽改变元素大小

    ▓▓▓▓▓▓ 大致介绍 拖拽改变元素大小是在模拟拖拽上增加了一些功能 效果:拖拽改变元素大小 ▓▓▓▓▓▓ 拖拽改变元素大小原理 首先这个方块得知道我们想要改变这个它的大小,所以我给它设定一个范围,当 ...

  8. Html5拖拽复制

    拖拽是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖拽是标准的一部分,任何元素都能够拖拽. Html5拖拽非常常见的一个功能,但是大部分拖拽的案例都是一个剪切的过程, 项目中需 ...

  9. 自由拖拽DIV实现

    最近在做的项目有个效果是要实现div随意拖拽改变大小,前端框架选择的是vue.js,UI用的是element,拖拽效果可以很简单的实现,但是在拖拽过程中发现会对其他元素实现全选效果,因此最后选择使用元 ...

随机推荐

  1. iOS UILanel 一些小实用

    UILabel *lab=[[UILabel alloc]initWithFrame:self.view.bounds]; //合并 lab.text=[NSString stringWithForm ...

  2. Maven国内源设置 - OSChina国内源失效了,别更新了

    Maven国内源设置 - OSChina国内源失效了,别更新了 原文:http://blog.csdn.net/chwshuang/article/details/52198932 最近在写一个Spr ...

  3. 转摘jemeter学习-连接数据库之jdbc请求

    JMETER连接数据库 mysql下载地址:https://dev.mysql.com/downloads/connector/j/ mysql连接器根据语言选择/J,用的是Mac,选择下载.tar. ...

  4. centos7 安装php7扩展

    安装php扩展(我用的php7.2版本) php是用amqp调用RabbitMQ,所以先下载ampq $ wget https://pecl.php.net/get/amqp-1.9.3.tgz #下 ...

  5. Golang: 读取文件并统计内容

    上次我们从命令行接收用户输入,并统计了每次输入内容出现的次数,今天对程序加以改造,使其能够读取文件内容,并统计每行文本出现的次数. 首先,我们把接收输入的逻辑封装成一个函数: // scan.go p ...

  6. Prometheus学习笔记(1)Prometheus架构简介

    Prometheus简介和架构 Prometheus 是由 SoundCloud 开源监控告警解决方案.架构图如下: 如上图,Prometheus主要由以下部分组成: Prometheus Serve ...

  7. prometheus学习系列四: Prometheus详述

    数据模型 Prometheus 是将所有数据存为时序数据. 每个时序数据是由指标名称和可选的键值对(称之为标签)唯一标识. 度量类型 counter: 单调递增的计数器,如果标识已经服务的请求数量可以 ...

  8. docker的小技巧记录(如果使用了更多会继续添加)

    docker小技巧 复制本地sql脚本到docker容器mysql中进行使用 # 找到容器 docker ps # 复制文件 cp ./xxx.sql container-id:/tmp/ # 进入容 ...

  9. HTML那些标签已废弃,被代替

    表单:cellpadding,cellspacing属性:已废弃, 替代者: table { border-collapse:collapse; } table, td, th { border:1p ...

  10. zabbix4.0自动发现主机

    一.自动发现主机的需求 由于机房设备拆分,迁移服务器后,原来的监控失效.再重新搭建监控平台后,批量主机手动添加真的是很麻烦. 所以就用到了zabbix的自动发现功能 二.配置自动发现服务 配置--&g ...