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

想在C#中画一个圆跟随我的鼠标分享

时间:2023-04-10 21:01:35 C#

C#想在画一个圆跟随我的鼠标首先,我是C#的真正初学者,所以请温柔。我正在尝试跟随我的光标圈。我不想留下任何“痕迹”。privatevoidForm1_MouseMove(objectsender,MouseEventArgse){drawCircle(eX,eY);}privatevoiddrawCircle(intx,inty){PenskyBluePen=newPen(Brushes.DeepSkyBlue);图形graphics=CreateGraphics();图形。DrawEllipse(skyBluePen,x-150,y-150,300,300);图形处理();这个。无效();这很好用,因为它绘制它并在每次鼠标移动时以鼠标为中心。但是,“this.Invalidate();”是错的。它每动一下就“展开”形状,所以我只能瞥一眼。但是,不包括它会导致每个绘制的圆圈都保留在屏幕上。如何使圆圈“优雅地”跟随我的鼠标而不会过于跳跃并且不保留所有过去的圆圈?你可以这样做:publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privatevoidForm1_Paint(objectsender,PaintEventArgse){Pointlocal=this.PointToClient(Cursor.Position);e.Graphics.DrawEllipse(Pens.Red,local.X-25,local.Y-25,20,20);}privatevoidForm1_MouseMove(objectsender,MouseEventArgse){Invalidate();基本上,当鼠标移动时,失效。在图上,画出你的圆圈。这行得通-刚刚测试过...privateintx=0;私人整数y=0;privatevoidForm1_MouseMove(objectsender,MouseEventArgse){x=eX;y=eY;这个。无效();}privatevoidForm1_Paint(objectsender,PaintEventArgse){PenskyBluePen=newPen(Brushes.DeepSkyBlue);e.Graphics.DrawEllipse(skyBluePen,x-150,y-150,300,300);您需要在绘制圆圈之前使表单无效。我很确定有更有效的方法可以使用双缓冲来执行此操作,但我没有示例。您通常不想在绘制处理程序之外进行任何绘制,因为每当绘制处理程序执行时(可能在任何时候),它都会覆盖您正在执行的操作。最终你需要考虑很多事情(比如当鼠标移出你的表单时会发生什么,但这应该让你开始。使用系统;使用系统绘图;使用System.Windows.Forms;classC:Form{staticvoidMain(){Application.Run(newC());}private点?_MousePosition=null;protectedoverridevoidOnMouseMove(MouseEventArgse){_MousePosition=e.Location;这个。无效();}protectedoverridevoidOnPaint(PaintEventArgse){if(_MousePosition.HasValue){using(PenskyBluePen=newPen(Brushes.DeepSkyBlue)){e.Graphics。DrawEllipse(skyBluePen,_MousePosition.Value.X-150,_MousePosition.Value.Y-150,300,300);}}}}尝试在Form构造函数中添加这一行:this.SetStyle(ControlStyles.OptimizedDoubleBuffer,true);this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);this.SetStyle(ControlStyles.UserPaint,true);这将告诉表单仅在您告诉它时才重新绘制。它还将提供双缓冲。祝你好运!绘制快速变化的东西的最佳方法是使用称为双缓冲的概念。这样做很容易,而且您不必依赖双缓冲标志。自己动手给你完全的自由和控制权。基本上,您不是在窗体本身上绘制,而是在离屏位图上进行所有绘制。只有当您知道发生了某些变化时(在您的情况下,在mousemove事件中),您才会绘制。仅当您知道必须时(在鼠标移动后或引发Paint事件时)才在屏幕上绘制。privatevoidDrawScene(PointmouseLocation){myGraphics.Clear(Color.White)myGraphics.DrawEllipse(skyBluePen,mouseLocation.X-150,mouseLocation.Y-150,300,300);myDrawingSurface.Refresh();//myDrawingSurface可以是Form或PictureBox或任何你想要的。通常,您只会使已更改的区域无效}privatevoidmyDrawingSurface_MouseMove(objectsender,MouseEventArgse){}privatevoidmyDrawingSurface_Paint(objectsender,PaintEventArgse){e.Graphics.DrawImage(myBitmap,0,0);//不记得确切的签名}另一种“作弊”的方法是简单地将PictureBox的Image属性分配给您正在绘制的图像,并在PictureBox上调用Refresh。它将处理在屏幕上绘制图像。不需要Paint处理程序。注意。您需要声明一次myBitmap和myGraphics。当绘图表面改变大小时,必须以适当的大小重新创建位图。另外,不要一遍又一遍地重新声明笔和其他图形对象。它们应该在程序启动时声明一次。并在程序关闭时妥善处理它们。以上就是C#学习教程:我想在C#中用画圆跟随我的鼠标来分享所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文来自网络收藏,不代表立场,如涉及侵权,请点击有权联系管理员删除。如需转载请注明出处: