C#鼠标拖拽,移动图片实例

最近工作需要做一个鼠标可以拖拽移动图片的功能。

写了几个基本功能,勉强能用。这里记录一下。欢迎大神补充。

232323.png

这个就是完成的功能。

下边的绿色是一个pictureBox,白色框也是一个pictureBox,他们二者是子父级关系。

绿色是父级,白色框是子级。

这里插一个知识点:关于pictureBox的

白色框的pictureBox,我添加的image属性的图片是一张中心透明四周是白边回来Png图片,这个需要注意一下。

1:子级pictureBox如何在父级PictureBox上透明显示。添加下边这句话:

// 设置背景颜色为系统定义的颜色
pictureBox2.BackColor = Color.Transparent;

2:背景透明设置完成,但是现在还是不能够拖拽四周或四个角改变大小。添加下边这句话:

// 设置pictureBox大小可拖拽
pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage;

到这里,小的pictureBox就已经背景透明并且可拖拽的显示在其父级上边了。

下边是我测试使用的Form1.cs文件的代码:

实例放在文末的压缩包中,有兴趣可以尝试下。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Threading;namespace cutCScan
{public partial class Form1 : Form{// 截取数据,获得对角线两点坐标。取到要截取的平面区域。// 平面区域中有若干个A扫,取其峰值,上下各加一个固定阈值(50)// 将此块数据都截取下来。public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){// 设置背景颜色为系统定义的颜色pictureBox2.BackColor = Color.Transparent;pictureBox2.Parent = pictureBox1;//pictureBox2.BackgroundImageLayout = ImageLayout.Stretch;//设置背景图片自动适应// 设置pictureBox大小可拖拽pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage;}/// <summary>///  有关鼠标样式的相关枚举/// </summary>private enum EnumMousePointPosition{MouseSizeNone = 0, //无MouseSizeRight = 1, //拉伸右边框MouseSizeLeft = 2,  //拉伸左边框MouseSizeBottom = 3, //拉伸下边框MouseSizeTop = 4, //拉伸上边框MouseSizeTopLeft = 5,//拉伸左上角MouseSizeTopRight = 6,//拉伸右上角MouseSizeBottomLeft = 7,//拉伸左下角MouseSizeBottomRight = 8,//拉伸右下角MouseDrag = 9 //鼠标拖动}#region 鼠标移动变量const int Band = 5;//范围半径const int MinWidth = 10;//最低宽度const int MinHeight = 10;//最低高度private EnumMousePointPosition m_MousePointPosition; //鼠标样式枚举private Point m_lastPoint; //光标上次移动的位置private Point m_endPoint; //光标移动的当前位置#endregion/// <summary>/// 鼠标按下事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void pictureBox2_MouseDown(object sender, MouseEventArgs e){m_lastPoint.X = e.X;m_lastPoint.Y = e.Y;m_endPoint.X = e.X;m_endPoint.Y = e.Y;}/// <summary>/// 鼠标离开控件的事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void pictureBox2_MouseLeave(object sender, EventArgs e){m_MousePointPosition = EnumMousePointPosition.MouseSizeNone;this.Cursor = Cursors.Arrow;}/// <summary>/// 鼠标移过控件的事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void pictureBox2_MouseMove(object sender, MouseEventArgs e){Control lCtrl = (sender as Control);//获得事件源//左键按下移动if (e.Button == MouseButtons.Left){switch (m_MousePointPosition){case EnumMousePointPosition.MouseDrag:lCtrl.Left = lCtrl.Left + e.X - m_lastPoint.X;lCtrl.Top = lCtrl.Top + e.Y - m_lastPoint.Y;break;case EnumMousePointPosition.MouseSizeBottom:lCtrl.Height = lCtrl.Height + e.Y - m_endPoint.Y;m_endPoint.X = e.X;m_endPoint.Y = e.Y; //记录光标拖动的当前点                     break;case EnumMousePointPosition.MouseSizeBottomRight:lCtrl.Width = lCtrl.Width + e.X - m_endPoint.X;lCtrl.Height = lCtrl.Height + e.Y - m_endPoint.Y;m_endPoint.X = e.X;m_endPoint.Y = e.Y; //记录光标拖动的当前点     break;case EnumMousePointPosition.MouseSizeRight:lCtrl.Width = lCtrl.Width + e.X - m_endPoint.X;lCtrl.Height = lCtrl.Height + e.Y - m_endPoint.Y;m_endPoint.X = e.X;m_endPoint.Y = e.Y; //记录光标拖动的当前点break;case EnumMousePointPosition.MouseSizeTop:lCtrl.Top = lCtrl.Top + (e.Y - m_lastPoint.Y);lCtrl.Height = lCtrl.Height - (e.Y - m_lastPoint.Y);break;case EnumMousePointPosition.MouseSizeLeft:lCtrl.Left = lCtrl.Left + e.X - m_lastPoint.X;lCtrl.Width = lCtrl.Width - (e.X - m_lastPoint.X);break;case EnumMousePointPosition.MouseSizeBottomLeft:lCtrl.Left = lCtrl.Left + e.X - m_lastPoint.X;lCtrl.Width = lCtrl.Width - (e.X - m_lastPoint.X);lCtrl.Height = lCtrl.Height + e.Y - m_endPoint.Y;m_endPoint.X = e.X;m_endPoint.Y = e.Y; //记录光标拖动的当前点break;case EnumMousePointPosition.MouseSizeTopRight:lCtrl.Top = lCtrl.Top + (e.Y - m_lastPoint.Y);lCtrl.Width = lCtrl.Width + (e.X - m_endPoint.X);lCtrl.Height = lCtrl.Height - (e.Y - m_lastPoint.Y);m_endPoint.X = e.X;m_endPoint.Y = e.Y; //记录光标拖动的当前点        break;case EnumMousePointPosition.MouseSizeTopLeft:lCtrl.Left = lCtrl.Left + e.X - m_lastPoint.X;lCtrl.Top = lCtrl.Top + (e.Y - m_lastPoint.Y);lCtrl.Width = lCtrl.Width - (e.X - m_lastPoint.X);lCtrl.Height = lCtrl.Height - (e.Y - m_lastPoint.Y);break;default:break;}if (lCtrl.Width < MinWidth) lCtrl.Width = MinWidth;if (lCtrl.Height < MinHeight) lCtrl.Height = MinHeight;}else{//'判断光标的位置状态m_MousePointPosition = MousePointPosition(lCtrl.Size, e);switch (m_MousePointPosition)  //改变光标{case EnumMousePointPosition.MouseSizeNone:this.Cursor = Cursors.Arrow;//箭头break;case EnumMousePointPosition.MouseDrag:this.Cursor = Cursors.SizeAll;//四方向break;case EnumMousePointPosition.MouseSizeBottom:this.Cursor = Cursors.SizeNS;//南北break;case EnumMousePointPosition.MouseSizeTop:this.Cursor = Cursors.SizeNS;//南北break;case EnumMousePointPosition.MouseSizeLeft:this.Cursor = Cursors.SizeWE;//东西break;case EnumMousePointPosition.MouseSizeRight://*/this.Cursor = Cursors.SizeWE;//东西break;case EnumMousePointPosition.MouseSizeBottomLeft:this.Cursor = Cursors.SizeNESW;//东北到南西break;case EnumMousePointPosition.MouseSizeBottomRight:this.Cursor = Cursors.SizeNWSE;//东南到西北break;case EnumMousePointPosition.MouseSizeTopLeft:this.Cursor = Cursors.SizeNWSE;//东南到西北break;case EnumMousePointPosition.MouseSizeTopRight:this.Cursor = Cursors.SizeNESW;//东北到南西break;default:break;}}}/// <summary>/// 坐标位置判定/// </summary>/// <param name="size"></param>/// <param name="e"></param>/// <returns></returns>private EnumMousePointPosition MousePointPosition(Size size, System.Windows.Forms.MouseEventArgs e){if ((e.X >= -1 * Band) | (e.X <= size.Width) |(e.Y >= -1 * Band) | (e.Y <= size.Height)){if (e.X < Band){if (e.Y < Band){return EnumMousePointPosition.MouseSizeTopLeft;}else{if (e.Y > -1 * Band + size.Height){return EnumMousePointPosition.MouseSizeBottomLeft;}else{return EnumMousePointPosition.MouseSizeLeft;}}}else{if (e.X > -1 * Band + size.Width){if (e.Y < Band){ return EnumMousePointPosition.MouseSizeTopRight; }else{if (e.Y > -1 * Band + size.Height){ return EnumMousePointPosition.MouseSizeBottomRight; }else{return EnumMousePointPosition.MouseSizeRight;}}}else{if (e.Y < Band){return EnumMousePointPosition.MouseSizeTop;}else{if (e.Y > -1 * Band + size.Height){return EnumMousePointPosition.MouseSizeBottom;}else{ return EnumMousePointPosition.MouseDrag; }}}}}else{ return EnumMousePointPosition.MouseSizeNone; }}}
}

有好的建议,请在下方输入你的评论。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/5935.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NAS私有云存储 - 搭建Nextcloud私有云盘并公网远程访问

文章目录 摘要视频教程1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 摘要 Nextcloud,它是ownCloud的一个分支,是一个文…

【《Spring Boot微服务实战(第2版)》——一本关于如何在Spring Boot中构建微服务的全面指南】

使用Spring Boot框架构建基于Java的微服务架构&#xff0c;将应用程序从小型单体架构蜕变为由多个服务组成的事件驱动架构。这个最新版本围绕服务发现、负载均衡、路由、集中式日志、按环境配置和容器化等知识点&#xff0c;循序渐进地讲述微服务架构、测试驱动的开发和分布式系…

Mysql 主从复制、读写分离

目录 一、前言&#xff1a; 二、主从复制原理 2.1 MySQL的复制类型 2.2 MySQL主从复制的工作过程; 2.2.1 MySQL主从复制延迟 2.3 MySQL 有几种同步方式&#xff1a; 三种 2.3.1、异步复制&#xff08;Async Replication&#xff09; 2.3.2、同步复制&#xff08;Sync Re…

centos逻辑分区磁盘扩展

最近碰到服务器磁盘空间不足&#xff0c;需要扩展逻辑分区的需求&#xff0c;特地做下小笔记&#xff0c;方便后续自己回忆。下图是磁盘的相关概念示意图&#xff1a; 1、查看磁盘空间 [rootlocalhost ~]# df -h #查看磁盘空间&#xff0c;根分区的大小是18G&#xff0c;已经用…

力扣 -- 918. 环形子数组的最大和

一、题目&#xff1a; 题目链接&#xff1a;918. 环形子数组的最大和 - 力扣&#xff08;LeetCode&#xff09; 二、解题步骤&#xff1a; 下面是用动态规划的思想解决这道题的过程&#xff0c;相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 三、参考代码&#xff1…

PCL点云处理之最小二乘直线拟合(2D| 方法2)(❤亲测可用❤)(二百零一)

PCL点云处理之最小二乘直线拟合(2D| 方法2)(❤亲测可用❤)(二百零一) 一、算法简介二、算法实现1.代码2.结果一、算法简介 在二百章中,我们介绍了一种最小二乘拟合直线点云(2D)的方法,可以获取直线方程系数k,b,这里介绍另一种拟合直线点云的方法,更为简单方便,结果…

MGRE之OSPF实验

目录 题目&#xff1a; 步骤二&#xff1a;拓扑设计与地址规划​编辑 步骤三&#xff1a;IP地址配置 步骤四&#xff1a;缺省路由配置 步骤五&#xff1a;NAT的配置 步骤六&#xff1a;MGRE配置 中心站点R1配置 分支站点配置 中心站点R5 R1配置 分支站点配置 检测&…

S32K1xx SDK(版本:S32_SDK_S32K1xx_RTM_4.0.3 )详细介绍

前言 在学习一款MCU之前&#xff0c;一般我的习惯是先下载官方提供的SDK包进行学习。然后学习了解SDK提供的资源、框架、以及各目录结构文件作用等&#xff0c;下面边学边做笔记记录。 S32K1系列SDK我们可以到下面的NXP官网去获取&#xff1a; https://www.nxp.com.cn/design…

微服务如何治理

微服务远程调用可能有如下问题&#xff1a; 注册中心宕机&#xff1b; 服务提供者B有节点宕机&#xff1b; 服务消费者A和注册中心之间的网络不通&#xff1b; 服务提供者B和注册中心之间的网络不通&#xff1b; 服务消费者A和服务提供者B之间的网络不通&#xff1b; 服务提供者…

一、二维前缀和算法

文章目录 前缀和模板724. 寻找数组的中心下标238. 除自身以外数组的乘积560. 和为 K 的子数组974. 和可被 K 整除的子数组525. 连续数组1314. 矩阵区域和 前缀和模板 一维前缀和&#xff1a; import java.util.*;public class Main {public static void main(String[] args) …

香橙派Zero2安装wiringPi外设库

安装wiringOP库 直接在香橙派上下载 wiringOP 的代码 sudo apt update sudo apt install -y git git clone https://github.com/orangepi-xunlong/wiringOP 如果在香橙派上下载不下来&#xff0c;也可以在通过windows浏览器打开https://github.com/orangepi-xunlong/wiringOP …

ffplay播放器剖析(4)----音频输出和音频重采样流程

文章目录 1. 音频输出模块1.1 音频输出流程1.2 音频输出模型图 2. 打开SDL音频设备audio_open详解sdl_audio_callbackaudio_decode_frame 3. 音频重采样样本补偿 1. 音频输出模块 1.1 音频输出流程 打开SDL音频设备,设置参数启动SDL音频设备播放SDL音频回调函数读取数据,也就…

八、HAL_UART(串口)的接收和发送

1、开发环境 (1)Keil MDK: V5.38.0.0 (2)STM32CubeMX: V6.8.1 (3)MCU: STM32F407ZGT6 2、UART和USART的区别 2.1、UART (1)通用异步收发收发器&#xff1a;Universal Asynchronous Receiver/Transmitter)。 2.2、USART (1)通用同步异步收发器&#xff1a;Universal Syn…

Rust 数据类型 之 类C枚举 c-like enum

目录 枚举类型 enum 定义和声明 例1&#xff1a;Color 枚举 例2&#xff1a;Direction 枚举 例3&#xff1a;Weekday 枚举 类C枚举 C-like 打印输出 强制转成整数 例1&#xff1a;Weekday 枚举 例2&#xff1a;HttpStatus 枚举 例3&#xff1a;Color 枚举 模式匹配…

ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域的数据分析

一、 空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 二、 ArcGIS专题地图制作 2.1专题地图制作规范 2.2 空间数据的准备与处理 2.3 空间数据可视化&#xff1a;地图符号与注记 …

Kubernetes集群故障排查—审计

Kubernetes 审计&#xff08;Auditing&#xff09; 功能提供了与安全相关的、按时间顺序排列的记录集&#xff0c; 记录每个用户、使用 Kubernetes API 的应用以及控制面自身引发的活动。 审计功能使得集群管理员能够回答以下问题&#xff1a; 发生了什么&#xff1f;什么时候…

算法竞赛备赛之经典数据结构训练提升,暑期集训营培训

1.链表与邻接表&#xff1a;树与图的存储 我们将结构体和指针结合来实现链表 struct Node {int val;Node * next; }; ​ new Node;//这样创建结点是相当慢的 我们算法主要是用数组来模拟链表&#xff0c;这样效率会高一些。 数组模拟单链表 邻接表&#xff1a;存储图和树 实…

(css)自定义el-dialog对话框添加背景图片

(css)自定义el-dialog对话框添加背景图片 效果&#xff1a; // 文件管理对话框 /deep/ .el-dialog {background: transparent;background-image: url("../assets/image/file-upload-background.png");background-size: 100% 100%; } // 头部 /deep/ .el-dialog__titl…

Nginx 301重定向分析

参考; 404 - 墨天轮 深度硬核文:Nginx的301重定向处理过程分析 - 知乎 Nginx的301状态码处理逻辑设计 HTTP协议中3xx开头的状态响应码都是表示重定向的响应。根据RFC的定义&#xff1a; 301 Moved Permanently 302 Found 303 See Other 307 Temporary Redirect 301是永…

Day 63 : 集成学习之 AdaBoosting (1. 带权数据集)

63.1 AdaBoosting基本算法&#xff1a;先从初始训练集训练一个弱学习器&#xff0c;在根据弱学习器的表现对训练样本进行权重调整&#xff0c;经过若干轮之后&#xff0c;将得到一组分类器&#xff0c;将数据输入这组分类器后会得到一个综合且准确的的分类结果。“三个臭皮匠&a…