IState.cs与DefaultRectState.cs:实现了一个用于图像ROI(Region of Interest,感兴趣区域)框选控件的状态管理类

📅 发布时间:2026/7/17 13:20:47 👁️ 浏览次数:
IState.cs与DefaultRectState.cs:实现了一个用于图像ROI(Region of Interest,感兴趣区域)框选控件的状态管理类
IState.cs与DefaultRectState.cs实现了一个用于图像ROIRegion of Interest感兴趣区域框选控件的状态管理类using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Input;namespace ROIControl{public interface IState{voidMouseDown(object sender,MouseButtonEventArgs e);voidMouseLeave(object sender,MouseEventArgs e);voidMouseMove(object sender,MouseEventArgs e);voidMouseUp(object sender,MouseButtonEventArgs e);}}using System;using System.Windows.Input;using System.Windows;namespace ROIControl{public class DefaultRectState:IState{private readonly ROIBox _box;publicDefaultRectState(ROIBox box){this._boxbox;}private Point?_mouseDown;private HitHandleType HitHandleTypeHitHandleType.None;private Rect _downRect;publicvoidMouseLeave(object sender,MouseEventArgs e){this.Clear();}publicvoidMouseUp(object sender,MouseButtonEventArgs e){this.Clear();}publicvoidMouseMove(object sender,MouseEventArgs e){var pe.GetPosition(sender as FrameworkElement);var cursorthis.GetCursor(p);this._box.Cursorcursor;if(e.LeftButton!MouseButtonState.Pressed)return;this.UpdateRect(p);}private CursorGetCursor(Point p){if(this.HitPoint(this._box.Rect.TopLeft,p))returnCursors.SizeNWSE;if(this.HitPoint(this._box.Rect.BottomRight,p))returnCursors.SizeNWSE;if(this.HitPoint(this._box.Rect.TopRight,p))returnCursors.SizeNESW;if(this.HitPoint(this._box.Rect.BottomLeft,p))returnCursors.SizeNESW;var centernewPoint(this._box.Rect.Leftthis._box.Rect.Width/2,this._box.Rect.Topthis._box.Rect.Height/2);if(this.HitPoint(newPoint(this._box.Rect.Left,center.Y),p))returnCursors.SizeWE;if(this.HitPoint(newPoint(this._box.Rect.Right,center.Y),p))returnCursors.SizeWE;if(this.HitPoint(newPoint(center.X,this._box.Rect.Top),p))returnCursors.SizeNS;if(this.HitPoint(newPoint(center.X,this._box.Rect.Bottom),p))returnCursors.SizeNS;if(this._box.Rect.Contains(p))returnCursors.SizeAll;returnCursors.Cross;}publicvoidMouseDown(object sender,MouseButtonEventArgs e){if(e.ChangedButton!MouseButton.Left)return;var pe.GetPosition(sender as FrameworkElement);this._mouseDownp;this._downRectthis._box.Rect;if(this.HitPoint(this._downRect.TopLeft,p)){this.HitHandleTypeHitHandleType.TopLeft;return;}if(this.HitPoint(this._downRect.BottomRight,p)){this.HitHandleTypeHitHandleType.BottomRight;return;}if(this.HitPoint(this._downRect.TopRight,p)){this.HitHandleTypeHitHandleType.TopRight;return;}if(this.HitPoint(this._downRect.BottomLeft,p)){this.HitHandleTypeHitHandleType.BottomLeft;return;}var centernewPoint(this._downRect.Leftthis._downRect.Width/2,this._downRect.Topthis._downRect.Height/2);if(this.HitPoint(newPoint(this._downRect.Left,center.Y),p)){this.HitHandleTypeHitHandleType.Left;return;}if(this.HitPoint(newPoint(this._downRect.Right,center.Y),p)){this.HitHandleTypeHitHandleType.Right;return;}if(this.HitPoint(newPoint(center.X,this._downRect.Top),p)){this.HitHandleTypeHitHandleType.Top;return;}if(this.HitPoint(newPoint(center.X,this._downRect.Bottom),p)){this.HitHandleTypeHitHandleType.Bottom;return;}if(this._downRect.Contains(p)){this.HitHandleTypeHitHandleType.Area;return;}}boolHitPoint(Point targetPoint,Point position){var vtargetPoint-position;returnMath.Abs(v.X)this._box.HandleLength/2Math.Abs(v.Y)this._box.HandleLength;}voidUpdateRect(Point to){if(this._mouseDownnull)return;var targetRectthis._downRect;if(this.HitHandleTypeHitHandleType.Area){Rect rectthis._downRect;rect.Offset(to.X-this._mouseDown.Value.X,to.Y-this._mouseDown.Value.Y);targetRectrect;}elseif(this.HitHandleTypeHitHandleType.TopLeft){to.XMath.Min(to.X,this._downRect.Right);to.YMath.Min(to.Y,this._downRect.Bottom);targetRectnewRect(to,this._downRect.BottomRight);}elseif(this.HitHandleTypeHitHandleType.BottomRight){to.XMath.Max(to.X,this._downRect.Left);to.YMath.Max(to.Y,this._downRect.Top);targetRectnewRect(this._downRect.TopLeft,to);}elseif(this.HitHandleTypeHitHandleType.TopRight){to.XMath.Max(to.X,this._downRect.Left);to.YMath.Min(to.Y,this._downRect.Bottom);var tlnewPoint(this._downRect.Left,to.Y);var brnewPoint(to.X,this._downRect.Bottom);targetRectnewRect(tl,br);}elseif(this.HitHandleTypeHitHandleType.BottomLeft){to.XMath.Min(to.X,this._downRect.Right);to.YMath.Max(to.Y,this._downRect.Top);var tlnewPoint(to.X,this._downRect.Top);var brnewPoint(this._downRect.Right,to.Y);targetRectnewRect(tl,br);}elseif(this.HitHandleTypeHitHandleType.Left){to.XMath.Min(to.X,this._downRect.Right);to.Ythis._downRect.Top;targetRectnewRect(to,this._downRect.BottomRight);}elseif(this.HitHandleTypeHitHandleType.Right){to.XMath.Max(to.X,this._downRect.Left);to.Ythis._downRect.Bottom;targetRectnewRect(this._downRect.TopLeft,to);}elseif(this.HitHandleTypeHitHandleType.Top){to.Xthis._downRect.Left;to.YMath.Min(to.Y,this._downRect.Bottom);targetRectnewRect(to,this._downRect.BottomRight);}elseif(this.HitHandleTypeHitHandleType.Bottom){to.Xthis._downRect.Right;to.YMath.Max(to.Y,this._downRect.Top);targetRectnewRect(this._downRect.TopLeft,to);}else{targetRectnewRect(this._mouseDown.Value,to);}targetRect.Intersect(newRect(0,0,this._box.ImageSource.Width,this._box.ImageSource.Height));this._box.RecttargetRect;}voidClear(){this._mouseDownnull;this.HitHandleTypeHitHandleType.None;}}}