C#画线OnPaint()vsCreateGraphics()问题:如何从OnPaint()方法以外的方法正确绘制winform?附加信息:我当前的代码在OnPaint()方法中为TicTacToe游戏绘制了一些背景线。然后我使用Mouse_Click事件并运行这段显然不正确的代码:privatevoidTicTacToe_MouseClick(objectsender,MouseEventArgse)Graphicsg=this.CreateGraphics();g.DrawEllipse(this.penRed,this.Rectangle);由于我没有出于可理解的原因,它确实绘制了圆圈,但是当窗体最小化或移出屏幕时,它会擦除??圆圈而不是OnPaint()方法中的线。您正在做的是“异步”绘制表单(来自OnPaint方法)。您会看到,OnPaint方法是Windows窗体绘制整个窗体所依赖的方法。当您的From出现问题时,它会失效并再次调用OnPaint。如果在该方法中未绘制某些内容,则此后它将不存在。如果你想让按钮触发某些东西永久显示,那么你需要做的就是将对象添加到某个集合中,或者设置一个与之相关的变量。然后调用Refresh()调用Invalidate()和Update()然后,在OnPaint中绘制该对象(椭圆)。如果您希望它在您的窗体发生某些事情(例如最小化)后仍然存在,则必须在OnPaint期间绘制它。这是我的建议:publicpartialclassForm1:Form{Rectangler=Rectangle.Empty;PenredPen=newPen(Color.Red);publicForm1(){InitializeComponent();}privatevoidbutton1_Click(objectsender,EventArgse){r=newRectangle(50,50,100,100);刷新();}protectedoverridevoidOnPaint(PaintEventArgse){base.OnPaint(e);if(r!=Rectangle.Empty){e.Graphics.DrawRectangle(redPen,r);你做了很多“观察”,但没有“模型”。如果你想创建一个形状,当鼠标按钮按下/向上时,创建一些代表形状的数据。您的数据结构代表持久信息(它是允许您在会话之间保存和加载此信息的数据)。您需要做的所有绘图功能就是查看DATA结构并绘制它。所以这将在大小/隐藏/显示之间持续存在。问题是Windows窗口(包括WinForms)没有自己的图形内存,除非它们的创建者提供这样的内存,并且特定窗口被覆盖或隐藏并最终需要重新绘制只是时间问题。你正在画画(你可能会说),其他人也可以这样做。您唯一可以依赖的合同是在需要时调用OnPaint。基本上你可以随时使用你的哲学和绘画(而不是按照一些神秘和不可预测的时间表)。为此,请查看我的解决方案。你应该使用“backbufferbitmap”,比如:privateBitmapbb;protectedoverridevoidOnResize(EventArgse){this.bb=newBitmap(this.ClientSize.Width,this.ClientSize.Height);这个.InitBackBuffer();}privatevoidInitBackBuffer(){using(varg=Graphics.FromImage(this.bb)){//在此处绘制任何“非消失线”}}privatevoidTicTacToe_MouseClick(objectsender,MouseEventArgse)using(Graphicsg=Graphics.FromImage(this.bb))g.DrawEllipse(this.penRed,this.Rectangle);这个。无效();}protectedoverridevoidOnPaint(PaintEventArgse){base.OnPaint(e);e.图形。DrawImageUnscaled(this.bb);}试试看。这个应该可以吧:)以上就是C#学习教程分享的全部内容:C#画线OnPaint()vsCreateGraphics()。如果对你有用,需要了解更多C#学习教程,希望大家多多关注——网络收藏不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
