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.hqwc.cn/news/29426.html

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

相关文章

Java 常用的重构技巧指南 v1.0

前段时间&#xff0c;leader 在 review 代码的时候发现了代码中 存在的一部分的问题&#xff0c;导致 代码的复杂度太高了&#xff0c;包括大部分的sql 都是属于慢sql &#xff0c;还是在建立了索引的情况下 , 代码的流程过于臃肿&#xff0c;而且本人编码的习惯&#xff0c;习…

ubuntu打开usb摄像头

文章目录 前言一、识别 usb 摄像头二、安装应用程序显示摄像头捕捉到的视频1、使用应用程序茄子&#xff08;cheese&#xff09;2、运行 cheese 捕捉视频 总结 前言 记录一下解决在 Linux 下打开 usb 摄像头界面黑屏的问题。 一、识别 usb 摄像头 1、保持在 ubuntu 界面&…

(四)「消息队列」之 RabbitMQ 路由(使用 .NET 客户端)

0、引言 先决条件 本教程假设 RabbitMQ 已安装并且正在 本地主机 的标准端口&#xff08;5672&#xff09;上运行。如果您使用了不同的主机、端口或凭证&#xff0c;则要求调整连接设置。 获取帮助 如果您在阅读本教程时遇到问题&#xff0c;可以通过邮件列表或者 RabbitMQ 社区…

ylb-项目简介

1、各模块服务功能 注&#xff1a;其部分实体类、接口、mapper文件由MyBatis逆向工程生成。 2、Maven管理&#xff08;多模块&#xff0c;继承和聚合&#xff09; 2.1 parent模块 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"…

CSS——基础知识及使用

CSS 是什么 CSS是层叠样式表 (Cascading Style Sheets)的简写.CSS 能够对网页中元素位置的排版进行像素级精确控制, 实现美化页面的效果. 能够做到页面的样式和结构分离。 基本语法规范 选择器 { 一条/N条声明 } 选择器决定针对谁修改 (找谁)声明决定修改啥. (干啥)声明的…

OpenCv之Canny

目录 一、自适应阈值 二、边缘检测Canny 一、自适应阈值 引入前提:在前面的部分我们使用是全局闻值&#xff0c;整幅图像采用同一个数作为闻值。当时这种方法并不适应与所有情况&#xff0c;尤其是当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们需要采用自适应闻…

记录--再也不用手动改package.json的版本号

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 本文的起因是有在代码仓库发包后&#xff0c;同事问我“为什么package.json 里的版本还是原来的&#xff0c;有没有更新&#xff1f;”&#xff0c;这个时候我意识到&#xff0c;我们完全没有必要在每…

“掌握更多的快速排序技巧:三路划分、双路快排和非递归的深入理解”

快速排序是一种基于分治思想的排序算法&#xff0c;它能够以极快的速度将一个乱序的数组重新排列成有序的序列。不仅如此&#xff0c;快速排序还具有简洁的实现代码和良好的可扩展性&#xff0c;成为最受欢迎的排序算法之一。接下来&#xff0c;让我带你了解一下它的魅力吧&…

接入端口与中继端口

交换机端口是支持 IT 的基本组件&#xff0c;可实现网络通信。这些有线硬件设备负责连接并允许在不同设备和连接到其端口的网络部分之间进行数据传输。由于网络管理员在确保网络连接和可用性方面发挥着关键作用&#xff0c;因此网络管理员必须清楚地了解、映射和查看其网络交换…

【有功功率、无功功率】可再生能源配电馈线的鲁棒经济调度研究[IEEE13节点](Matlab代码实现)

&#x1f4a5;1 概述 "有功功率和无功功率" 是与电力系统中能量传输和功率控制相关的两个重要概念。 有功功率&#xff08;Active Power&#xff09;是指电力系统中传输和消耗能量的功率&#xff0c;也被称为实功功率。它负责提供电力系统中的实际电能需求&#xf…

【EasyExcel】在SpringBoot+VUE项目中引入EasyExcel实现对数据的导出(封装工具类)

在SpringBootVUE项目中引入EasyExcel实现导入导出 一、引入EasyExcel 通过maven引入&#xff0c;坐标如下&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel-core</artifactId><version>3.3.2</version…

【Win10系统下载Python3】

Python3官网&#xff1a;https://www.python.org/downloads/windows/ 注