You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
223 lines
9.5 KiB
223 lines
9.5 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
|
|
namespace Customize.Controls
|
|
{
|
|
public partial class ImageMask
|
|
: System.Windows.Forms.Control
|
|
{
|
|
public string fileName;
|
|
|
|
public ImageMask()
|
|
{
|
|
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
|
|
//this.BackColor = Color.Empty;
|
|
this.BackColor = Color.Transparent;
|
|
//this.BackColor = Color.FromArgb(50, Color.Red);
|
|
|
|
//以下是设置双缓冲的代码 要不然在下面onPaint里的绘制半透明背景会让你很伤心,或者上面那句设置半透明背景用了过后拖动时也会让你跟蜗牛一样。
|
|
this.SetStyle(ControlStyles.UserPaint, true);
|
|
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
|
|
this.SetStyle(ControlStyles.DoubleBuffer, true);
|
|
}
|
|
|
|
public Size border;
|
|
|
|
//public void showBorder() { }
|
|
|
|
private Point m_MousePoint;
|
|
private Size m_Size;
|
|
private Point m_LastPoint;
|
|
|
|
|
|
protected override void OnMouseDown(MouseEventArgs e)
|
|
{
|
|
base.OnMouseDown(e);
|
|
this.m_LastPoint = this.Location;
|
|
this.m_MousePoint = this.PointToScreen(e.Location);
|
|
this.m_Size = this.Size;
|
|
//this.BackColor = Color.Empty;
|
|
}
|
|
|
|
|
|
protected override void OnMouseMove(MouseEventArgs e)
|
|
{
|
|
|
|
base.OnMouseMove(e);
|
|
|
|
if (arow != arrowType.none)
|
|
{
|
|
reSize(e);
|
|
return;
|
|
}
|
|
|
|
if (e.Y <= recArrow[4].Bottom && e.Y >= recArrow[4].Top && e.X >= recArrow[4].Left && e.X <= recArrow[4].Right)//左上
|
|
Cursor = Cursors.SizeNWSE;
|
|
else if (e.Y <= recArrow[5].Bottom && e.Y >= recArrow[5].Top && e.X >= recArrow[5].Left && e.X <= recArrow[5].Right)//左下
|
|
Cursor = Cursors.SizeNESW;
|
|
else if (e.Y <= recArrow[6].Bottom && e.Y >= recArrow[6].Top && e.X >= recArrow[6].Left && e.X <= recArrow[6].Right)//右上
|
|
Cursor = Cursors.SizeNESW;
|
|
else if (e.Y <= recArrow[7].Bottom && e.Y >= recArrow[7].Top && e.X >= recArrow[7].Left && e.X <= recArrow[7].Right)//右下
|
|
Cursor = Cursors.SizeNWSE;
|
|
else if (e.Y <= recArrow[0].Bottom && e.Y >= recArrow[0].Top)//上
|
|
Cursor = Cursors.SizeNS;
|
|
else if (e.Y <= recArrow[1].Bottom && e.Y >= recArrow[1].Top)//下
|
|
Cursor = Cursors.SizeNS;
|
|
else if (e.X >= recArrow[2].Left && e.X <= recArrow[2].Right)//左
|
|
Cursor = Cursors.SizeWE;
|
|
else if (e.X >= recArrow[3].Left && e.X <= recArrow[3].Right)//右
|
|
Cursor = Cursors.SizeWE;
|
|
else
|
|
Cursor = Cursors.SizeAll;
|
|
|
|
|
|
if (e.Button == MouseButtons.Left)
|
|
{
|
|
Point t = this.PointToScreen(e.Location);
|
|
Point l = this.m_LastPoint;
|
|
|
|
if (e.Y <= recArrow[4].Bottom && e.Y >= recArrow[4].Top && e.X >= recArrow[4].Left && e.X <= recArrow[4].Right)//左上
|
|
arow = arrowType.leftUp;
|
|
else if (e.Y <= recArrow[5].Bottom && e.Y >= recArrow[5].Top && e.X >= recArrow[5].Left && e.X <= recArrow[5].Right)//左下
|
|
arow = arrowType.leftDown;
|
|
else if (e.Y <= recArrow[6].Bottom && e.Y >= recArrow[6].Top && e.X >= recArrow[6].Left && e.X <= recArrow[6].Right)//右上
|
|
arow = arrowType.rightUp;
|
|
else if (e.Y <= recArrow[7].Bottom && e.Y >= recArrow[7].Top && e.X >= recArrow[7].Left && e.X <= recArrow[7].Right)//右下
|
|
arow = arrowType.rightDown;
|
|
else if (e.Y <= recArrow[0].Bottom && e.Y >= recArrow[0].Top)//上
|
|
arow = arrowType.up;
|
|
else if (e.Y <= recArrow[1].Bottom && e.Y >= recArrow[1].Top)//下
|
|
arow = arrowType.down;
|
|
else if (e.X >= recArrow[2].Left && e.X <= recArrow[2].Right)//左
|
|
arow = arrowType.left;
|
|
else if (e.X >= recArrow[3].Left && e.X <= recArrow[3].Right)//右
|
|
arow = arrowType.right;
|
|
else
|
|
arow = arrowType.none;
|
|
|
|
|
|
l.Offset(t.X - this.m_MousePoint.X, t.Y - this.m_MousePoint.Y);
|
|
if (arow != arrowType.none)
|
|
reSize(e);
|
|
else
|
|
{
|
|
this.Location = l;
|
|
Refresh();//这句很重要立即重绘 不然拖动到时候会出现卡卡 的现象 ,找了半天原因
|
|
}
|
|
}
|
|
}
|
|
|
|
public void reSize(MouseEventArgs e)
|
|
{
|
|
Point t = this.PointToScreen(e.Location);
|
|
Point l = this.m_LastPoint;
|
|
|
|
l.Offset(t.X - this.m_MousePoint.X, t.Y - this.m_MousePoint.Y);
|
|
|
|
switch (arow)
|
|
{
|
|
case arrowType.up:
|
|
{
|
|
this.Height = m_Size.Height - (t.Y - this.m_MousePoint.Y);
|
|
this.Location = new Point(m_LastPoint.X, l.Y);
|
|
break;
|
|
}
|
|
case arrowType.down:
|
|
{
|
|
this.Height = m_Size.Height + (t.Y - this.m_MousePoint.Y);
|
|
break;
|
|
}
|
|
case arrowType.left:
|
|
{
|
|
this.Width = m_Size.Width - (t.X - this.m_MousePoint.X);
|
|
this.Location = new Point(l.X, m_LastPoint.Y);
|
|
break;
|
|
}
|
|
case arrowType.right:
|
|
{
|
|
this.Width = m_Size.Width + (t.X - this.m_MousePoint.X);
|
|
break;
|
|
}
|
|
case arrowType.leftUp:
|
|
{
|
|
this.Width = m_Size.Width - (t.X - this.m_MousePoint.X);
|
|
this.Height = m_Size.Height - (t.Y - this.m_MousePoint.Y);
|
|
this.Location = new Point(l.X, l.Y);
|
|
break;
|
|
}
|
|
case arrowType.leftDown:
|
|
{
|
|
this.Width = m_Size.Width - (t.X - this.m_MousePoint.X);
|
|
this.Height = m_Size.Height + (t.Y - this.m_MousePoint.Y);
|
|
this.Location = new Point(l.X, m_LastPoint.Y);
|
|
break;
|
|
}
|
|
case arrowType.rightUp:
|
|
{
|
|
this.Width = m_Size.Width + (t.X - this.m_MousePoint.X);
|
|
this.Height = m_Size.Height - (t.Y - this.m_MousePoint.Y);
|
|
this.Location = new Point(m_LastPoint.X, l.Y);
|
|
break;
|
|
}
|
|
case arrowType.rightDown:
|
|
{
|
|
this.Width = m_Size.Width + (t.X - this.m_MousePoint.X);
|
|
this.Height = m_Size.Height + (t.Y - this.m_MousePoint.Y);
|
|
break;
|
|
}
|
|
}
|
|
this.Refresh();
|
|
}
|
|
|
|
|
|
|
|
public enum arrowType
|
|
{
|
|
up, down, left, right, leftUp, leftDown, rightUp, rightDown, none
|
|
}
|
|
|
|
public arrowType arow = arrowType.none;
|
|
|
|
Rectangle[] recArrow = new Rectangle[8];//8个手柄
|
|
|
|
public Rectangle area;//选择区域
|
|
public readonly int blank = 8;//边距
|
|
protected override void OnPaint(PaintEventArgs e)
|
|
{
|
|
int side = 6;//手柄矩形的边长
|
|
|
|
recArrow[0] = new Rectangle(new Point(this.Width / 2 - side / 2, blank - side / 2), new Size(side, side));
|
|
recArrow[1] = new Rectangle(new Point(this.Width / 2 - side / 2, this.Height - blank - side / 2), new Size(side, side));
|
|
recArrow[2] = new Rectangle(new Point(blank - side / 2, this.Height / 2 - side / 2), new Size(side, side));
|
|
recArrow[3] = new Rectangle(new Point(this.Width - blank - side / 2, this.Height / 2 - side / 2), new Size(side, side));
|
|
recArrow[4] = new Rectangle(new Point(blank - side / 2, blank - side / 2), new Size(side, side));
|
|
recArrow[5] = new Rectangle(new Point(blank - side / 2, this.Height - blank - side / 2), new Size(side, side));
|
|
recArrow[6] = new Rectangle(new Point(this.Width - blank - side / 2, blank - side / 2), new Size(side, side));
|
|
recArrow[7] = new Rectangle(new Point(this.Width - blank - side / 2, this.Height - blank - side / 2), new Size(side, side));
|
|
|
|
foreach (Rectangle item in recArrow)
|
|
e.Graphics.DrawRectangle(Pens.Red, item);
|
|
area = new Rectangle(new Point(8, 8), new Size(this.Width - 8 * 2, this.Height - 8 * 2));
|
|
|
|
////加上半透明效果看倒是好看了 重绘的时候卡的凶 ,期待有解决方法
|
|
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
|
|
System.Drawing.Color cor = System.Drawing.Color.FromArgb(50, Color.Red);
|
|
System.Drawing.SolidBrush bsh = new System.Drawing.SolidBrush(cor);
|
|
e.Graphics.FillRectangle(bsh, area);
|
|
|
|
e.Graphics.DrawRectangle(Pens.Red, area);
|
|
}
|
|
|
|
protected override void OnMouseUp(MouseEventArgs e)
|
|
{
|
|
arow = arrowType.none;
|
|
//this.BackColor = Color.FromArgb(0, Color.Red);
|
|
}
|
|
|
|
}
|
|
}
|