CreateGraphics()方法和Paint事件参数

时间:2011-03-18 13:38:04

标签: c# gdi+

我已经阅读了CreateGraphics()将为我们执行此步骤的地方:

  1. BeginPaint的
  2. 图纸
  3. 调用EndPaint
  4. 我的代码是这样的:

    private void Form1_Load(object sender, EventArgs e)
    {
        grFrom = this.CreateGraphics();
        grFrom.FillRectangle(Brushes.Red, this.ClientRectangle);
    }
    

    没有红色矩形......但是,当我在Form1_paint中复制下面的行时,每件事都运行正确。

    grFrom.FillRectangle(Brushes.Red, this.ClientRectangle);
    

    所以问题在这里: e.Graphics中的Form1_paint是什么?

    CreateGraphicse.Graphics

3 个答案:

答案 0 :(得分:6)

两件事:

  1. CreateGraphics为您提供了一个图形对象,您应该在退出之前始终Dispose()。你应该把你的陈述放在一个使用区块内。
  2. 您绘制的图形仅在表单重新绘制之前有效。在你的情况下,通过在Form_Load中调用它,它发生在第一次渲染之前,并被“扔掉”。你应该总是把它放在OnPaint()中,以使它在屏幕上“持久”,因为这会在重绘控件时重新绘制它。

答案 1 :(得分:1)

您的表单加载调用正在绘制到表单,但随后第一个常规表单绘制事件将覆盖它,因此您永远不会看到它。 (因为这发生在您提交表格之前)

  

问题就在这里:什么是

     

e.Graphics in form1_paint?

     

CreateGraphics或e.Graphics?

我很确定这些是等效的,你需要的是更好地理解windows窗体事件生命周期。

这个答案有相关链接: WinForms event life cycle

答案 2 :(得分:0)

您正在创建一个新的图形对象,它很可能由内存缓冲区支持。从e.Graphics获得的Graphics对象由缓冲区支持,该缓冲区表示当前窗口的屏幕区域(Window Handle中的窗口,而不是带标题栏的窗口等)。

您始终可以将创建的图形对象中的数据咬合到e.Graphics上的数据。

我相信有人会比我更详细。