public partial class CRectControl : UserControl { public CRectControl() { InitializeComponent(); currentControl = theControl; Create(); } public Rectangle Rect { get{return baseRect; } set { int X = Square.Width; int Y = Square.Height; int Height =value.Height; int Width =value.Width; baseRect =new Rectangle(X, Y, Width, Height); SetRectangles(); } } private void SetRectangles() { //定义8个小正方形的范围 //左上 SmallRect[0] =new Rectangle(new Point(baseRect.X - Square.Width, baseRect.Y - Square.Height), Square); //上中间 SmallRect[4] =new Rectangle(new Point(baseRect.X + (baseRect.Width / 2) - (Square.Width / 2), baseRect.Y - Square.Height), Square); //右上 SmallRect[1] =new Rectangle(new Point(baseRect.X + baseRect.Width, baseRect.Y - Square.Height), Square); //左下 SmallRect[2] =new Rectangle(new Point(baseRect.X - Square.Width, baseRect.Y + baseRect.Height), Square); //下中间 SmallRect[5] =new Rectangle(new Point(baseRect.X + (baseRect.Width / 2) - (Square.Width / 2), baseRect.Y + baseRect.Height), Square); //右下 SmallRect[3] =new Rectangle(new Point(baseRect.X + baseRect.Width, baseRect.Y + baseRect.Height), Square); //左中间 SmallRect[6] =new Rectangle(new Point(baseRect.X - Square.Width, baseRect.Y + (baseRect.Height / 2) - (Square.Height / 2)), Square); //右中间 SmallRect[7] =new Rectangle(new Point(baseRect.X + baseRect.Width, baseRect.Y + (baseRect.Height / 2) - (Square.Height / 2)), Square); //整个包括周围边框的范围 ControlRect =new Rectangle(new Point(0, 0), this.Bounds.Size); } private void Create() { //创建边界 int X = currentControl.Bounds.X - Square.Width; int Y = currentControl.Bounds.Y - Square.Height; int Height = currentControl.Bounds.Height + (Square.Height * 2); int Width = currentControl.Bounds.Width + (Square.Width * 2); this.Bounds =new Rectangle(X, Y, Width + 1, Height + 1); this.BringToFront(); Rect = currentControl.Bounds; //设置可视区域 this.Region =newRegion(BuildFrame()); g =this.CreateGraphics(); } private GraphicsPath BuildFrame() { GraphicsPath path =new GraphicsPath(); BoundRect[0] =new Rectangle(0, 0, currentControl.Width + (Square.Width * 2) + 1, Square.Height + 1); BoundRect[1] =new Rectangle(0, Square.Height + 1, Square.Width + 1, currentControl.Bounds.Height + Square.Height + 1); BoundRect[2] =new Rectangle(Square.Width + 1, currentControl.Bounds.Height + Square.Height-1, currentControl.Width + Square.Width + 2, Square.Height + 2); BoundRect[3] =new Rectangle(currentControl.Width + Square.Width-1, Square.Height + 1, Square.Width + 2, currentControl.Height - 1); path.AddRectangle(BoundRect[0]); path.AddRectangle(BoundRect[1]); path.AddRectangle(BoundRect[2]); path.AddRectangle(BoundRect[3]); return path; } public void Draw() { try { g.FillRectangles(Brushes.LightGray, BoundRect);//填充用于调整的边框的内部 g.FillRectangles(Brushes.White, SmallRect);//填充8个锚点的内部 g.DrawRectangles(Pens.Black, SmallRect);//绘制8个锚点的黑色边线 } catch(Exception ex) { Console.WriteLine(ex.Message); } } enum HitDownSquare { HDS_NONE = 0, HDS_TOP = 1, HDS_RIGHT = 2, HDS_BOTTOM = 3, HDS_LEFT = 4, HDS_TOPLEFT = 5, HDS_TOPRIGHT = 6, HDS_BOTTOMLEFT = 7, HDS_BOTTOMRIGHT = 8 } private HitDownSquare CurrHitPlace; private void RectTracker_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) { if(e.Button ==MouseButtons.Left) { if(isFirst ==true) { prevLeftClick =newPoint(e.X, e.Y); isFirst =false; } else { this.Visible =false; Mouse_Move(this, e);//调整位置或大小 prevLeftClick =newPoint(e.X, e.Y); } } else { isFirst =true; this.Visible =true; Hit_Test(e.X, e.Y);//更新鼠标指针样式 } } private void RectTracker_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) { Create(); this.Visible =true; } }