CreateGraphics() 方法和 Paint 事件参数

5

我曾在某处读到,CreateGraphics() 将为我们执行以下步骤:

  1. BeginPaint
  2. Drawing
  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 是什么?

是使用 CreateGraphics 还是 e.Graphics

3个回答

6

两件事情:

  1. CreateGraphics 方法会返回一个 Graphics 对象,你需要在退出前始终调用 Dispose() 方法。应该将此语句放在 using 块内。
  2. 你所绘制的图形只有在窗体重新绘制之前才有效。在 Form_Load 中调用此方法时,它会在第一次渲染之前被“丢弃”。你应该将此方法放在 OnPaint() 中以使其在屏幕上“持久存在”,这样当控件重绘时,它就会被重新绘制。

1

你的表单加载调用正在绘制到表单上,但是第一个常规表单绘画事件会覆盖它,因此你永远看不到它。(因为这发生在你完全呈现表单之前)

所以问题在于:form1_paint中的e.Graphics是什么?

是CreateGraphics还是e.Graphics?

我相当确定它们是等效的,你需要更好地了解Windows Forms事件生命周期。

这个答案有相关链接: WinForms事件生命周期


0
你正在创建一个新的图形对象,这个对象很可能由内存缓冲区支持。从e.Graphics获取的Graphics对象由当前窗口(Window Handle中的窗口,而不是带标题栏等的窗口)代表屏幕区域的缓冲区支持。
你可以始终将创建的图形对象的数据位块传送到e.Graphics的对象上。
我相信有人会比我更详细地阐述。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接