2013-02-22 101 views
1

当窗体加载时应该不是CreateGraphics()返回一个图形对象?Windows窗体中的图形

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

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

如果不是,那么为什么?

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

我在问,因为当我试图绘制form_load时,它不会显示我绘制的内容。

主要原因是:我想创建一个游戏,它有一个棋盘 - 所以当用户点击新游戏时 - 首先 - 我正在启动棋盘并绘制它。 而在onPaint事件中,我只想画出板子的当前状态。所以我认为董事会的初始状态应该利用表格加载事件。

+0

你会想创建一个执行该绘制的方法。然后在你的构造函数中你可以调用这个方法。在创建该类时,您的抽签被调用。我没有时间提供示例,但后来我会演示如果没有提供好的答案。 – Greg 2013-02-22 21:59:28

+0

看起来你需要阅读这个相当可爱[FAQ](http://www.bobpowell.net/gdiplus_faq.htm) – Quibblesome 2013-02-22 23:23:35

回答

4

您不应该以这种方式使用Graphics对象;你应该把它的每个用法都放在一个使用块中,否则确保你在每一组绘图操作之后处理掉它。你的代码会在这里留下一个不必要的Graphics对象。

简单的例子:

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

此外,借鉴Form_Load()将无法​​正常工作,因为窗口是不是在这一点上确实可见;基本上没有什么可以利用的。

是的,你一般需要重绘整个事情每个周期 - 因为另一个窗口简单的东西被在你的窗口拖出会“消灭”你的图纸,而当它被其它窗口无效被搬走,您需要重新绘制您手动绘制的所有内容

+0

感谢您的回答,我编辑了我的问题 – Elior 2013-02-22 22:09:49

+0

@Elior更新了答案。 – 2013-02-22 22:12:35

+0

所以可以说我在该板上有两个圈子。所以如果我改变 其中一个圈子的位置,我需要重新绘制所有的棋盘? 这不是很有效,不是吗? 好的,但我明白并接受你的回答,因为你是对的。 – Elior 2013-02-22 22:18:43