最近工作需要做一个鼠标可以拖拽移动图片的功能。
写了几个基本功能,勉强能用。这里记录一下。欢迎大神补充。
这个就是完成的功能。
下边的绿色是一个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; }}}
}
有好的建议,请在下方输入你的评论。