2010-09-28 56 views
1

考虑了.NET控件下面被覆盖的OnPaint方法后恢复图形状态:我需要在我的OnPaint覆盖绘画(用于.NET控件)

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 
    e.Graphics.RotateTransform(180); 

    // lots of drawing code 
} 

难道我做的一个问题当我完成时不恢复e.Graphics对象的状态?

在Java中,这通常是通过复制传递的Graphics对象来完成的,因此传递的Graphics对象不会被修改,也不需要恢复它的状态。 Similar Java Question

我可以通过使用Save()/ Restore()方法在.NET中实现这一点。所以我的问题是:

  • 在.NET中恢复图形状态是否需要/最佳实践?
  • Save()/ Restore()方法有多昂贵?

回答

1

那么,谁来为控件实现Paint事件会有一点惊喜。如果有意义的是,一切都是旋转的,那么这可能是有效的,但这是你自己决定的。

Graphics.Save + Restore在我的笔记本上大概需要4微秒。考虑到绘图的典型花费,无需担心。

+0

如果保存和恢复很快,那么我想我会用它们来恢复我的OnPaint结束时的状态。 – GarethOwen 2010-09-28 13:58:00

+0

实际上,我没有看到你在绘图之前调用了base.OnPaint()*。这是不正确的,你应该允许客户端事件处理程序在你的顶部绘制。在底部放置base.OnPaint并在此之前调用Restore()。 – 2010-09-28 14:06:47

+0

我不确定它是否不正确。我的基类是一个Panel,如果它有一个背景颜色或图像,我希望在绘制自己之前绘制它。 – GarethOwen 2010-09-28 15:22:49