【问题标题】:CreateGraphics() Method and Paint Event ArgsCreateGraphics() 方法和绘制事件参数
【发布时间】:2011-03-18 13:38:04
【问题描述】:

我在某处读到 CreateGraphics() 将为我们执行此步骤:

  1. 开始绘制
  2. 绘图
  3. EndPaint

我的代码是这样的:

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);

所以问题来了: Form1_paint 中的e.Graphics 是什么?

CreateGraphicse.Graphics?

【问题讨论】:

    标签: c# gdi+


    【解决方案1】:

    两件事:

    1. CreateGraphics 为您提供了一个图形对象,在退出之前您应该始终 Dispose()。您应该将语句放在 using 块中。
    2. 您绘制的图形仅在窗体重新绘制之前有效。在您的情况下,通过在 Form_Load 中调用它,它发生在第一次渲染之前,并被“丢弃”。您应该始终将它放在 OnPaint() 中,以使其在屏幕上“持久化”,因为这将导致在重绘控件时重绘它。

    【讨论】:

      【解决方案2】:

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

      所以问题来了:什么是

      e.form1_paint 中的图形?

      CreateGraphics 还是 e.Graphics ?

      我很确定它们是等价的,您需要更好地了解 Windows 窗体事件生命周期。

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

      【讨论】:

        【解决方案3】:

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

        您始终可以将创建的图形对象中的数据位 blit 到来自e.Graphics 的对象上。

        我相信有人会比我详细得多。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多