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:\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#实现图像拖拽以及锚点缩放功能的更多相关文章
- C#图像显示实现拖拽、锚点缩放功能【转】
1.图像拖拽 核心步骤: ①新建Point类型全局变量mouseDownPoint,记录拖拽过程中鼠标位置: ②MouseDown事件记录Cursor位置: ③MouseMove事件计算移动矢量,并更 ...
- flutter实现可缩放可拖拽双击放大的图片功能
flutter实现可缩放可拖拽双击放大的图片功能 可缩放可拖拽的功能,可实现图片或者其他widget的缩放已经拖拽并支持双击放大的功能 我们知道官方提供了双击缩放,但是不支持拖拽的功能,我们要实现向百 ...
- 移动端的拖拽这个demo实现的功能
SQL数据库适合那些需求确定和对数据完整性要去严格的项目.NoSQL数据库适用于那些对速度和可扩展性比较看重的那些不相关的,不确定和不断发展的需求. 总所周知,网页的加载速度跟图片是有很大的关系的,因 ...
- 【UWP】拖拽列表项的排序功能实现
在一些允许用户自定义栏目顺序的app(如:凤凰新闻.网易云音乐等),我们可以方便地拖拽列表项来完成列表的重新排序,进而完成对栏目顺序的重排.这个功能很人性化,而实现起来其实很简单(甚至都不用写什么后台 ...
- Image 鼠标拖拽与鼠标中键的缩放
一.Image在窗体上拖拽,势必会用到鼠标的三个事件(MouseDown,MouseUp,MouseMove),以左键为例,PictureBox为载体 Point mouseDownPoint = n ...
- WinForm实现简单的拖拽文件到出题的功能(C#)(3)
string path = ((System.Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString(); textBox1. ...
- JavaScript动画-拖拽改变元素大小
▓▓▓▓▓▓ 大致介绍 拖拽改变元素大小是在模拟拖拽上增加了一些功能 效果:拖拽改变元素大小 ▓▓▓▓▓▓ 拖拽改变元素大小原理 首先这个方块得知道我们想要改变这个它的大小,所以我给它设定一个范围,当 ...
- Html5拖拽复制
拖拽是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖拽是标准的一部分,任何元素都能够拖拽. Html5拖拽非常常见的一个功能,但是大部分拖拽的案例都是一个剪切的过程, 项目中需 ...
- 自由拖拽DIV实现
最近在做的项目有个效果是要实现div随意拖拽改变大小,前端框架选择的是vue.js,UI用的是element,拖拽效果可以很简单的实现,但是在拖拽过程中发现会对其他元素实现全选效果,因此最后选择使用元 ...
随机推荐
- vue 实现滚动到页面底部开始加载更多
直接上代码: <template> <div class="newsList"> <div v-for="(items, index) in ...
- ES6 笔记汇总
ES6 笔记汇总 二.ES6基础-let和const命令 三.变量的解构赋值 四.字符串的拓展 五.正则表达式的拓展 ...将会持续更新,敬请期待
- python bs4 BeautifulSoup
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.bs4 模块的 BeautifulSoup 配合requests库可以写简单的爬虫. 安装 命令:pip in ...
- Solr新特性【4.x,5.x,6.x,7.x】
一.Solr4.x新特性 1.近实时搜索 Solr的近实时搜索[Near Real-Time,NRT]功能实现了文档添加到搜索的快速进行,以应对搜索快速变化的数据. 2.原子更新与乐观并发 原子更新功 ...
- Java 堆内存 新生代 (转)
Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象.在 Java 中,堆被划分成两个不同的区域:新生代 ( Young ).老年代 ( Old ).新生代 ( You ...
- ML-线性模型 泛化优化 之 L1 L2 正则化
认识 L1, L2 从效果上来看, 正则化通过, 对ML的算法的任意修改, 达到减少泛化错误, 但不减少训练误差的方式的统称 训练误差 这个就损失函数什么的, 很好理解. 泛化错误 假设 我们知道 预 ...
- Redis学习总结整理
基本操作 设值 set KEY VALUE 获值 get KEY 设置过期时间(单位:s) set KEY VALUE ex SECONDS 设置过期时间(单位:s) exprire KEY SECO ...
- HttpRunner V2.x 学习(一)
官方说明文档: https://cn.httprunner.org/ 作者(李隆)博客: https://debugtalk.com/ 1.介绍 HttpRunner 是一款面向 HTTP(S) 协议 ...
- Discuz!基础的代码安全和代码规范
变量所有漏洞都来源于变量,因此变量首先要做的就是定义初始化.用任何一个变量前一定要先定义,初始化它虽然现在Discuz!X来说,GPC不会被全局覆盖了,但是大家写插件的过程中也不要忽视了因为在服务器p ...
- HDU4624 Endless Spin 和 HAOI2015 按位或
Endless Spin 给你一段长度为[1..n]的白色区间,每次随机的取一个子区间将这个区间涂黑,问整个区间被涂黑时需要的期望次数. n<=50 题解 显然是min-max容斥,但是n的范围 ...