【问题标题】:Graphics in Windows FormsWindows 窗体中的图形
【发布时间】:2013-02-08 15:23:32
【问题描述】:

在加载表单时,CreateGraphics() 不应该返回一个图形对象吗?

我的意思是,在 Form1_Load 事件中,我可以编写例如以下内容吗?

Graphics x;
private void Form1_Load(object sender, EventArgs e)
{
    x = this.CreateGraphics();
}

如果不是,那为什么?

我认为当您创建一个新表单时,constructor 会启动该表单的所有对象。那么为什么图形对象不也是呢?

我问这个问题,因为当我尝试绘制时 - 在 form_load 上,它没有显示我绘制的内容。

主要原因是:我想创建一个游戏,它有一个棋盘 - 所以当用户点击新游戏时 - 首先 - 我正在启动棋盘并绘制它。 而在 onPaint 事件中,我只想绘制棋盘的当前状态。所以我认为board的初始状态应该是在formLoad事件上绘制的。

【问题讨论】:

  • 您可能希望创建一个执行该绘制的方法。然后在您的构造函数中,您将调用该方法。这样,在创建该类时就会调用您的绘图。我没有时间提供一个例子,但稍后我会演示如果没有提供一个好的答案。
  • 看来你需要阅读这篇相当可爱的FAQ

标签: c# .net winforms form-load


【解决方案1】:

您不应该以这种方式使用 Graphics 对象;您应该将它的每次使用都包含在 using 块中,或者确保在每组绘图操作之后将其丢弃。您的代码将留下一个不必要的 Graphics 对象。

简单示例:

private void MyonPaintOverload()
{
    using(Graphics x = this.CreateGraphics())
    {
        // draw here...
    }
}

另外,在Form_Load() 上绘图也不起作用,因为此时窗口实际上是不可见的;基本上没有什么可借鉴的。

是的,您通常需要在每个循环中重绘整个东西 - 因为像在您的窗口上拖动另一个窗口这样简单的事情会“抹掉”您的绘图,并且当它被另一个无效时窗口被移开,您需要重新绘制您手动绘制的所有内容

【讨论】:

  • @Elior 更新了答案。
  • 所以可以说我在那块板上有两个圆圈。所以如果我要改变一个圆圈的位置,我需要重新绘制所有的棋盘吗?这不是很有效,不是吗?好的,但我理解并接受你的回答,因为你是对的。
  • @Elior 是的;你必须重新绘制整个棋盘;实际上,您必须首先擦拭整个表格;否则你的旧圈子的残余可能仍然存在。
  • @LeeTaylor 什么 Grapics 对象,无论如何?!呵呵(谢谢你的收获!)
  • 这个答案中的代码 sn-p 是根本错误的,窗口在 Load 事件中还不可见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
相关资源
最近更新 更多