本文主要实现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. underscore_1: map()

    map()是underscore.js中一个处理数组和对象的方法. params: 1. array || obj 2. callback 3. content 上下文指向 使用: var obj = ...

  2. 金融finaunce财经

    金融 (经济学术语) 金融是货币资金融通的总称.主要指与货币流通和银行信用相关的各种活动.主要内容包括: 货币的发行.投放.流通和回笼:各种存款的吸收和提取:各项贷款的发放和收回:银行会计.出纳.转账 ...

  3. OCR1:开源库

    OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗.亮的模式确定其形状,然后用字符识别方法将形状翻译 ...

  4. Redis特点分析及性能优化

    一.Key >Redis key值是二进制安全的,这意味着可以可以使用任何二进制序列作为key值.空字符串也是有效的key值. >key取值原则 1.键值不需要太长,消耗内存,且在数据中查 ...

  5. Python调用百度接口(情感倾向分析)和讯飞接口(语音识别、关键词提取)处理音频文件

    本示例的过程是: 1. 音频转文本 2. 利用文本获取情感倾向分析结果 3. 利用文本获取关键词提取 首先是讯飞的语音识别模块.在这里可以找到非实时语音转写的相关文档以及 Python 示例.我略作了 ...

  6. 014_matlab读取ecxel(直接导入)

    视频教程:https://v.qq.com/x/page/c3039b5htwx.html 资料下载:https://download.csdn.net/download/xiaoguoge11/12 ...

  7. ABAP_DEMO篇33 SUM和COLLECT的用法

    ABAP程序内表中的数量和金额字段  经常会需要合计, SUM和COLLECT 语法都能实现对数量和金额字段的合计. 1. SUM语法 ABAP中SUM语句比不上EXCEL里的强大:SUM只能在loo ...

  8. Linux yum 包 下载地址

    yum包网址: http://www.rpmfind.net/linux/rpm2html/search.php?query=yum

  9. (1)IdentityServer4 V3.0.2-安装模板

    控制台运行命令: dotnet new -i IdentityServer4.Templates

  10. 通过日志解决问题的一个小例子-http换端口

    这个例子是将http服务的监听端口改为8999后重启服务报错: 此时查看日志/var/log/message,显示如下: 如红笔所示轨迹得到设置端口类型的命令:semanage port -a -t ...