using System.Drawing;/nusing System.Windows.Forms;/nnamespace CirecleCCS/n{/n class CcsGo/n {/n public int ResizePinSize = 6;/n // 圆的直径/n int HalfRPR/n {/n get { return ResizePinSize / 2; }/n //半径/n }/n private static Pen SelectRectPen, ResizePinPen;/n private float[] SelectRectDashPattern;/n private static Rectangle SelectRect;/n private static Rectangle ResizePin1, ResizePin2, ResizePin3, ResizePin4, ResizePin5, ResizePin6, ResizePin7, ResizePin8;/n private static Rectangle rect;/n private static int ActivationPinPosition;/n //selectrect的x,y,x1,y1/n private static int SelectX0, SelectY0, SelectX1, SelectY1;/n //8个角+点空白处+点中间/n private const int hitNothing = -1;/n private const int hitTopLeft = 0;/n private const int hitTopRight = 1;/n private const int hitBottomRight = 2;/n private const int hitBottomLeft = 3;/n private const int hitTop = 4;/n private const int hitRight = 5;/n private const int hitBottom = 6;/n private const int hitLeft = 7;/n private const int hitMiddle = 8;/n/n private void HideResizePin()/n //隐藏ResizePin/n {/n ResizePin1.Width = 0; ResizePin1.Height = 0;/n ResizePin2.Width = 0; ResizePin2.Height = 0;/n ResizePin3.Width = 0; ResizePin3.Height = 0;/n ResizePin4.Width = 0; ResizePin4.Height = 0;/n ResizePin5.Width = 0; ResizePin5.Height = 0;/n ResizePin6.Width = 0; ResizePin6.Height = 0;/n ResizePin7.Width = 0; ResizePin7.Height = 0;/n ResizePin8.Width = 0; ResizePin8.Height = 0;/n }/n/n void SetResizePinVal()/n //实时显示ResizePin/n {/n ResizePin1.X = X - HalfRPR;/n ResizePin1.Y = Y - HalfRPR;/n ResizePin2.X = X + Width / 2 - HalfRPR;/n ResizePin2.Y = Y - HalfRPR;/n ResizePin3.X = X + Width - HalfRPR;/n ResizePin3.Y = Y - HalfRPR;/n ResizePin4.X = X + Width - HalfRPR;/n ResizePin4.Y = Y + Height / 2 - HalfRPR;/n ResizePin5.X = X + Width - HalfRPR;/n ResizePin5.Y = Y + Height - HalfRPR;/n ResizePin6.X = X + Width / 2 - HalfRPR;/n ResizePin6.Y = Y + Height - HalfRPR;/n ResizePin7.X = X - HalfRPR;/n ResizePin7.Y = Y + Height - HalfRPR;/n ResizePin8.X = X - HalfRPR;/n ResizePin8.Y = Y + Height / 2 - HalfRPR;/n }/n/n private void ShowResizePin()/n //显示ResizePin/n {/n ResizePin1.X = SelectRect.X - HalfRPR;/n ResizePin1.Y = SelectRect.Y - HalfRPR;/n ResizePin2.X = SelectRect.X + SelectRect.Width / 2 - HalfRPR;/n ResizePin2.Y = SelectRect.Y - HalfRPR;/n ResizePin3.X = SelectRect.X + SelectRect.Width - HalfRPR;/n ResizePin3.Y = SelectRect.Y - HalfRPR;/n ResizePin4.X = SelectRect.X + SelectRect.Width - HalfRPR;/n ResizePin4.Y = SelectRect.Y + SelectRect.Height / 2 - HalfRPR;/n ResizePin5.X = SelectRect.X + SelectRect.Width - HalfRPR;/n ResizePin5.Y = SelectRect.Y + SelectRect.Height - HalfRPR;/n ResizePin6.X = SelectRect.X + SelectRect.Width / 2 - HalfRPR;/n ResizePin6.Y = SelectRect.Y + SelectRect.Height - HalfRPR;/n ResizePin7.X = SelectRect.X - HalfRPR;/n ResizePin7.Y = SelectRect.Y + SelectRect.Height - HalfRPR;/n ResizePin8.X = SelectRect.X - HalfRPR;/n ResizePin8.Y = SelectRect.Y + SelectRect.Height / 2 - HalfRPR;/n ResizePin1.Width = ResizePinSize; ResizePin1.Height = ResizePinSize;/n ResizePin2.Width = ResizePinSize; ResizePin2.Height = ResizePinSize;/n ResizePin3.Width = ResizePinSize; ResizePin3.Height = ResizePinSize;/n ResizePin4.Width = ResizePinSize; ResizePin4.Height = ResizePinSize;/n ResizePin5.Width = ResizePinSize; ResizePin5.Height = ResizePinSize;/n ResizePin6.Width = ResizePinSize; ResizePin6.Height = ResizePinSize;/n ResizePin7.Width = ResizePinSize; ResizePin7.Height = ResizePinSize;/n ResizePin8.Width = ResizePinSize; ResizePin8.Height = ResizePinSize;/n }/n/n void FillResizePins(PaintEventArgs e)/n // 填充ResizePinRect颜色/n {/n e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;/n e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;/n e.Graphics.FillEllipse(Brushes.SteelBlue,ResizePin1);/n e.Graphics.FillEllipse(Brushes.SteelBlue, ResizePin2);/n e.Graphics.FillEllipse(Brushes.SteelBlue, ResizePin3);/n e.Graphics.FillEllipse(Brushes.SteelBlue, ResizePin4);/n e.Graphics.FillEllipse(Brushes.SteelBlue, ResizePin5);/n e.Graphics.FillEllipse(Brushes.SteelBlue, ResizePin6);/n e.Graphics.FillEllipse(Brushes.SteelBlue, ResizePin7);/n e.Graphics.FillEllipse(Brushes.SteelBlue, ResizePin8);/n }/n/n void DrawResizePin(Graphics g)/n //绘制ResizePin/n {/n g.DrawEllipse(ResizePinPen,ResizePin1);/n g.DrawEllipse(ResizePinPen,ResizePin2);/n g.DrawEllipse(ResizePinPen,ResizePin3);/n g.DrawEllipse(ResizePinPen,ResizePin4);/n g.DrawEllipse(ResizePinPen,ResizePin5);/n g.DrawEllipse(ResizePinPen,ResizePin6);/n g.DrawEllipse(ResizePinPen,ResizePin7);/n g.DrawEllipse(ResizePinPen,ResizePin8);/n }/n/n bool InELP(MouseEventArgs e,Point ElpCenter)/n //是否在ResizePin圆内/n {/n int elpX = ElpCenter.X;/n int elpY = ElpCenter.Y;/n return !((elpX - e.X) * (elpX - e.X) + (elpY - e.Y) * (elpY - e.Y) >= HalfRPR * HalfRPR);/n }/n/n private int HitTest(MouseEventArgs e)/n //测试哪个ResizePin被选中/n {/n if(InELP(e,new Point(ResizePin1.X + HalfRPR,ResizePin1.Y + HalfRPR)))/n return hitTopLeft;/n else if (InELP(e,new Point(ResizePin2.X + HalfRPR, ResizePin2.Y + HalfRPR)))/n return hitTop;/n else if (InELP(e,new Point(ResizePin3.X + HalfRPR,ResizePin3.Y + HalfRPR)))/n return hitTopRight;/n else if (InELP(e, new Point(ResizePin4.X + HalfRPR, ResizePin4.Y + HalfRPR)))/n return hitRight;/n else if (InELP(e, new Point(ResizePin5.X + HalfRPR, ResizePin5.Y + HalfRPR)))/n return hitBottomRight;/n else if (InELP(e, new Point(ResizePin6.X + HalfRPR, ResizePin6.Y + HalfRPR)))/n return hitBottom;/n else if (InELP(e, new Point(ResizePin7.X + HalfRPR, ResizePin7.Y + HalfRPR)))/n return hitBottomLeft;/n else if (InELP(e, new Point(ResizePin8.X + HalfRPR, ResizePin8.Y + HalfRPR)))/n return hitLeft;/n else if (e.X >= SelectRect.X + ResizePinSize && e.X <= SelectRect.X + SelectRect.Width - ResizePinSize/n && e.Y >= SelectRect.Y + ResizePinSize && e.Y <= SelectRect.Y + SelectRect.Height - ResizePinSize)/n return hitMiddle;/n else/n return hitNothing;/n }/n/n public void Create()/n //初始化参数/n {/n ResizePinPen = new Pen(Color.SteelBlue, 2);/n SelectRectDashPattern = new float[] {3,2,1};/n SelectRectPen = new Pen(Color.SteelBlue, 2.0f);/n //{ // DashPattern = SelectRectDashPattern, //}/n SelectRect = new Rectangle();/n ResizePin1 = new Rectangle();/n ResizePin2 = new Rectangle();/n ResizePin3 = new Rectangle();/n ResizePin4 = new Rectangle();/n ResizePin5 = new Rectangle();/n ResizePin6 = new Rectangle();/n ResizePin7 = new Rectangle();/n ResizePin8 = new Rectangle();/n rect = new Rectangle();/n ActivationPinPosition = hitNothing;/n }/n/n void StayInBoxR(PictureBox R)/n //待在box里面别出去/n {/n if (SelectRect.X < 0)/n SelectRect.X = 0;/n if (SelectRect.Y < 0)/n SelectRect.Y = 0;/n if (SelectRect.X + SelectRect.Width > R.Width)/n SelectRect.X = R.Width - SelectRect.Width;/n if (SelectRect.Y + SelectRect.Height > R.Height)/n SelectRect.Y = R.Height - SelectRect.Height;/n }/n/n public void Destroy()/n //释放资源/n {/n SelectRectPen.Dispose();/n ResizePinPen.Dispose();/n }/n/n public void StartPoint(PictureBox p, MouseEventArgs e)/n //鼠标左键按下后/n {/n if (e.Button == MouseButtons.Left)/n {/n p.Invalidate(null, true);/n switch (HitTest(e))/n {/n case hitTopLeft:/n ActivationPinPosition = hitTopLeft;/n SelectX1 = SelectRect.X + SelectRect.Width;/n SelectY1 = SelectRect.Y + SelectRect.Height;/n break;/n case hitTop:/n ActivationPinPosition = hitTop;/n SelectX1 = SelectRect.Width + SelectRect.X;/n SelectY1 = SelectRect.Height + SelectY0;/n break;/n case hitTopRight:/n ActivationPinPosition = hitTopRight;/n SelectY1 = SelectRect.Y + SelectRect.Height;/n break;/n case hitRight:/n ActivationPinPosition = hitRight;/n SelectY1 = SelectRect.Y + SelectRect.Height;/n break;/n case hitBottomRight:/n ActivationPinPosition = hitBottomRight;/n break;/n case hitBottom:/n ActivationPinPosition = hitBottom;/n SelectX1 = SelectRect.X + SelectRect.Width;/n break;/n case hitBottomLeft:/n ActivationPinPosition = hitBottomLeft;/n SelectX1 = SelectRect.X + SelectRect.Width;/n break;/n case hitLeft:/n ActivationPinPosition = hitLeft;/n SelectX1 = SelectRect.X + SelectRect.Width;/n SelectY1 = SelectRect.Y + SelectRect.Height;/n break;/n case hitMiddle:/n ActivationPinPosition = hitMiddle;/n SelectX0 = e.X - SelectRect.X;/n SelectY0 = e.Y - SelectRect.Y;/n SelectX1 = SelectRect.X + SelectRect.Width - e.X;/n SelectY1 = SelectRect.Y + SelectRect.Height - e.Y;/n break;/n case hitNothing:/n ActivationPinPosition = hitNothing;/n SelectRect.Width = 0;/n SelectRect.Height = 0;/n SelectX0 = e.X;/n SelectY0 = e.Y;/n HideResizePin();/n break;/n }/n }/n }/n/n public void TrackRubberBand(PictureBox p, MouseEventArgs e, bool Iskeep = false)/n //鼠标左键拖动时动态显示矩形框/n {/n switch (HitTest(e))/n {/n case hitTopLeft:/n p.Cursor = Cursors.SizeNWSE;/n break;/n case hitTop:/n p.Cursor = Cursors.SizeNS;/n break;/n case hitTopRight:/n p.Cursor = Cursors.SizeNESW;/n break;/n case hitRight:/n p.Cursor = Cursors.SizeWE;/n break;/n case hitBottomRight:/n p.Cursor = Cursors.SizeNWSE;/n break;/n case hitBottom:/n p.Cursor = Cursors.SizeNS;/n break;/n case hitBottomLeft:/n p.Cursor = Cursors.SizeNESW;/n break;/n case hitLeft:/n p.Cursor = Cursors.SizeWE;/n break;/n case hitMiddle:/n p.Cursor = Cursors.SizeAll;/n break;/n case hitNothing:/n p.Cursor = Cursors.Default;/n break;/n }/n if (e.Button == MouseButtons.Left)/n {/n int TLX = e.X;/n int TLY = e.Y;/n if (e.X < 0)/n TLX = 0;/n else if (e.X > p.Width)/n TLX = p.Width;/n if (e.Y < 0)/n TLY = 0;/n else if (e.Y > p.Height)/n TLY = p.Height;/n if (!Iskeep)/n {/n p.Invalidate(InvalidateRectangle(), false);/n }/n switch (ActivationPinPosition)/n {/n case hitTopLeft:/n GenerateRectangle(ref SelectRect, TLX, TLY, SelectX1, SelectY1);/n StayInBoxR(p);/n SetResizePinVal();/n break;/n case hitTop:/n GenerateRectangle(ref SelectRect, SelectX0, TLY, SelectX1, SelectY1);/n StayInBoxR(p);/n SetResizePinVal();/n break;/n case hitTopRight:/n GenerateRectangle(ref SelectRect, SelectX0, TLY, TLX, SelectY1);/n StayInBoxR(p);/n SetResizePinVal();/n break;/n case hitRight:/n GenerateRectangle(ref SelectRect, SelectX0, SelectY0, TLX, SelectY1);/n StayInBoxR(p);/n SetResizePinVal();/n break;/n case hitBottomRight:/n GenerateRectangle(ref SelectRect, SelectX0, SelectY0, TLX, TLY);/n StayInBoxR(p);/n SetResizePinVal();/n break;/n case hitBottom:/n GenerateRectangle(ref SelectRect, SelectX0, SelectY0, SelectX1, TLY);/n StayInBoxR(p);/n SetResizePinVal();/n break;/n case hitBottomLeft:/n GenerateRectangle(ref SelectRect, TLX, SelectY0, SelectX1, TLY);/n StayInBoxR(p);/n SetResizePinVal();/n break;/n case hitLeft:/n GenerateRectangle(ref SelectRect, TLX, SelectY0, SelectX1, SelectY1);/n StayInBoxR(p);/n SetResizePinVal();/n break;/n case hitMiddle:/n GenerateRectangle(ref SelectRect, e.X - SelectX0, e.Y - SelectY0, e.X + SelectX1, e.Y + SelectY1);/n StayInBoxR(p);/n SetResizePinVal();/n break;/n case hitNothing:/n GenerateRectangle(ref SelectRect, SelectX0, SelectY0, TLX, TLY);/n StayInBoxR(p);/n SetResizePinVal();/n break;/n }/n }/n }/n/n public void EndPoint(PictureBox frm, MouseEventArgs e)/n //鼠标左键松开后/n {/n if (e.Button == MouseButtons.Left)/n {/n frm.Invalidate(null, true);/n SelectX0 = SelectRect.X;/n SelectY0 = SelectRect.Y;/n if(HitTest(e) != hitNothing && X > ResizePinSize && Y > ResizePinSize)/n ShowResizePin();/n }/n }/n/n public void DrawRubberBand(PictureBox frm, PaintEventArgs e)/n //绘制矩形框/n {/n e.Graphics.DrawRectangle(SelectRectPen, SelectRect);/n FillResizePins(e);/n DrawResizePin(e.Graphics);/n }/n/n private void GenerateRectangle(ref Rectangle TempRectangle, int X0, int Y0, int X1, int Y1)/n //根据指定两点坐标生成矩形框/n {/n if (X0 < X1)/n {/n TempRectangle.X = X0;/n TempRectangle.Width = X1 - X0;/n }/n else/n {/n TempRectangle.X = X1;/n TempRectangle.Width = X0 - X1;/n }/n if (Y0 < Y1)/n {/n TempRectangle.Y = Y0;/n TempRectangle.Height = Y1 - Y0;/n }/n else/n {/n TempRectangle.Y = Y1;/n TempRectangle.Height = Y0 - Y1;/n }/n }/n //RubberBand的属性/n public int X/n {/n get/n {/n return SelectRect.X;/n }/n }/n public int Y/n {/n get/n {/n return SelectRect.Y;/n }/n }/n public int Width/n {/n get/n {/n return SelectRect.Width;/n }/n }/n public int Height/n {/n get/n {/n return SelectRect.Height;/n }/n }/n public Pen RectView { get => RectView; set => RectView = value; }/n/n public Rectangle InvalidateRectangle()/n //获得无效区域,用来刷新时防止闪烁/n {/n rect.X = SelectRect.X - 8;/n rect.Y = SelectRect.Y - 8;/n rect.Width = SelectRect.Width + 16;/n rect.Height = SelectRect.Height + 16;/n return rect;/n }/n/n public void SetRect(int ex, int ey, int ew, int eh)/n // set ccs框的位置以及尺寸/n {/n GenerateRectangle(ref SelectRect, ex, ey, ex + ew, ey + eh);/n }/n/n public void HideCCS()/n //隐藏起来/n {/n HideResizePin();/n SetRect(0, 0, 0, 0);/n }/n }/

C# 矩形框选择和调整大小 - CcsGo 类实现

原文地址: https://www.cveoy.top/t/topic/ndzg 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录