2010-09-28 57 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