2012-11-27 46 views
2

我試圖覆蓋.NET Compact Framework中窗口事件的OnPaint事件。在WinForms中如何處理隱形控件?

到目前爲止,我可以用漸變,圓角矩形等來繪製控件,這些控件通常不會在常規控件中使用。

但是,當我想使控件不可見時,我遇到了問題。現在,我所做的是重新繪製除了那些看不見的控件之外的所有控件。由於需要一些時間,它會導致一些閃爍。

有誰知道Windows如何處理繪製「隱形」控件?或者你可以建議任何算法或方法如何實現這一點。

回答

1

你應該做幾件事。

  1. 不要在OnPaint中交給你的圖形對象畫圖。繪製到後臺緩衝區,並在最後將其繪製到圖形。
  2. 重寫OnPaintBackground並讓它不做任何事。
  3. 的Invalidate只是改變的地區,而不是整個屏幕,儘可能保持裁剪區域小

如果您要改變單一的控制,以「不可見」,那麼你會改變它和無效只是它的約束力。在OnPaint中,您將執行繪圖,省略基於Visibility屬性的「不可見」控件。只有裁剪區域會被更新。您甚至可以通過檢查OnPaint上的傳入剪輯區域來進一步查看,並且只會困擾繪製邏輯繪製該區域。雖然這有點複雜,但通常不是必需的。

+0

他是否必須使位於「不可見」或位於其中的容器後面的任何控件失效,以使其重新繪製,以便沒有漏洞? – tcarvin

+0

當您使區域無效時,OnPaint會被調用並告訴您剪貼區域。你將要繪製到那個區域(或繪製整個表單,操作系統忽略除該區域以外的所有內容)。所以你必須在那裏繪製*東西*,是的(或者基於OnPaintBackground處理它)。 – ctacke

+0

感謝您的回答。到目前爲止它工作正常。當重寫OnPaintBackground事件時閃爍消失,並使其不執行任何操作。 但現在我有一個新的問題,你如何實際去除圓角矩形中的「角落」? 以前,它看起來工作,因爲背景顏色是白色的。但是當我改變了窗體本身的背景顏色時,角落是可見的。 – codex10

0

作爲替代方案,是否可以在適當的控件上調用Invalidate()方法的任何超載以減少需要重新繪製的控件總數?

相關問題