本文主要实现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. Vue-使用计时器实现跑马灯效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. JavaScript 数组(三)数组方法

    常用方法及案例参考这篇:数组对象及常用方法

  3. Cheat Engine 指针

    打开游戏 扫描时间的流程就不多说了 扫描结果 寻找基地址 右击扫描到的地址,选择什么改写了这个地址 会弹出如下窗口 不用管这个窗口,去改变一下游戏时间,出现如下图 随便打开一个,找到了数据块地址和偏移 ...

  4. Solr基础理论【排名检索、查准率、查全率】

    一.排名检索 搜索引擎代表了基于查询,返回优先文档的一种方法.在关系型数据库的SQL查询中,表的一行要么匹配一个查询,要么不匹配,查询结果基于一列或多列排序.搜索引擎根据文档与查询匹配的程度为文档打分 ...

  5. kbmmw 5.10.10 发布

    这个版本主要是bug修正. New stuff         =========         - Added OnException event property to TkbmMWSchedu ...

  6. 更改 Ubuntu 的 apt 源

    1.在更改apt源之前要先备份官方自带的apt源 cd /etc/apt sudo cp sources.list sources.list.bak 2. 更改 sources.list 文件 sud ...

  7. linux设备驱动程序--gpio控制

    gpio驱动程序 上一章节linux设备驱动程序--创建设备节点章节主要介绍了linux字符设备驱动程序的框架,从这一章节开始我们讲解各种外设的控制,包括gpio,i2c,dma等等,既然是外设,那就 ...

  8. java-spring基于redis单机版(redisTemplate)实现的分布式锁+redis消息队列,可用于秒杀,定时器,高并发,抢购

    此教程不涉及整合spring整合redis,可另行查阅资料教程. 代码: RedisLock package com.cashloan.analytics.utils; import org.slf4 ...

  9. 第五篇 -- Xml序列化

    XML序列化是将对象的公共属性和字段转换为XML格式,以便存储或传输的过程.反序列化则是从XML输出中重新创建原始状态的对象.XML序列化中最主要的类是XmlSerializer类.它的最重要的方法是 ...

  10. 【转】Linux虚拟网络基础——tap

    原文:https://blog.csdn.net/chengqiuming/article/details/80071073 ------------------------------------- ...