当前位置: 首页 > 编程语言 > C#

如何根据鼠标的移动绘制矩形?分享

时间:2023-04-10 17:53:03 C#

如何根据鼠标的移动绘制矩形?我在这里找到了用于在表单上绘图的示例代码:http://msdn.microsoft.com/en-us/library/aa287522(v=vs.71).aspx作为此请求的后续操作(发现位于哪个控件在用户拖动鼠标所描述的矩形下方):我的控件位置与我的MouseDown和-Up事件的位置之间似乎不匹配......我想就他们所做的事情向用户提供即时/连续的反馈即将选择(当/如果他们释放鼠标按钮)。我不仅想在鼠标移动后绘制一条线,还想绘制所描述的矩形。我认为MouseMove事件加上上面两个链接中的代码就可以解决问题,但是它多久被触发一次/它对性能有何影响?如果是这样,什么是更好的挂钩事件,或者定时器是去这里的方式?更新这段代码改编自下面约翰的示例(唯一的区别是StackOverflow提出的对base.*的评论被注释掉了,我将颜色从红色更改为黑色(无意引用Stendahl)),除了之前的松开鼠标后,在矩形外绘制的内容也会再次有效显示。IOW,第一个矩形绘制完美-它随着鼠标单击而消失(如预期的那样)。但是,当我通过按下鼠标左键并向右下方拖动来描述第二个矩形时,第一个矩形再次出现!这将继续发生——每个先前绘制的矩形都会被记住,并在绘制新矩形时重新出现。公共部门分类Form1:表格{私有点?_开始;私人矩形_previousBounds;publicForm1(){InitializeComponent();}privatevoidForm1_MouseDown(objectsender,MouseEventArgse){_start=e.Location;//base.OnMouseDown(e);}privatevoidForm1_MouseMove(objectsender,MouseEventArgse){if(_start.HasValue)DrawFrame(e.Location);//base.OnMouseMove(e);}privatevoidForm1_MouseUp(objectsender,MouseEventArgse){ReverseFrame();_开始=空;//base.OnMouseUp(e);}privatevoidReverseFrame(){ControlPaint.DrawReversibleFrame(_previousBounds,Color.Black,FrameStyle.Dashed);}privatevoidDrawFrame(Pointend){ReverseFrame();varsize=newSize(end.X-_start.Value.X,end.Y-_start.Value.Y);_previousBounds=newRectangle(_start.Value,size);_previousBounds=this.RectangleToScreen(_previousBounds);ControlPaint.DrawReversibleFrame(_previousBounds,Color.Black,FrameStyle.Dashed);}}ControlPaint.DrawReversibleFrame()将执行您想要的操作。性能通常不是问题——只要保持小而干净即可。-编辑:添加了代码示例。StackOverflowException意味着出了点问题-但不能在没有看到你的情况下直接回答。以上就是C#学习教程:如何根据鼠标的移动绘制矩形?如果分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注~私信点?_开始;私人矩形_previousBounds;protectedoverridevoidOnMouseDown(MouseEventArgse){_start=e.Location;base.OnMouseDown(e);}protectedoverridevoidOnMouseMove(MouseEventArgse){if(_start.HasValue){ReverseFrame();DrawFrame(e.Location);}base.OnMouseMove(e);}protectedoverridevoidOnMouseUp(MouseEventArgse){ReverseFrame();_开始=空;base.OnMouseUp(e);}privatevoidReverseFrame(){ControlPaint.DrawReversibleFrame(_previousBounds,Color.Red,FrameStyle.Dashed);}privatevoidDrawFrame(Pointend){ReverseFrame();varsize=newSize(end.X-_start.Value.X,end.Y-_start.Value.Y);_previousBounds=newRectangle(_start.Value,size);_previousBounds=this.RectangleToScreen(_previousBounds);ControlPaint.DrawReversibleFrame(_previousBounds,Color.Red,FrameStyle.Dashed);}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: