2011-05-02 79 views
1

我開發了一些自己的組件OnPaint -override我繪製它們。OnPaint事件順序

我現在添加了一個狀態面板,它被設計爲與我的表單的一部分重疊。我使用alpha混合顏色灰色底層控件並在其上顯示文本。

不幸的是,我的一些基礎自定義控件在狀態欄之後自己繪製並在狀態欄上方繪製自己。調試我發現首先調用paint事件的狀態欄,稍後調用底層控件的paint事件。

如何確保正確的訂單用於繪畫?

當底層組件自己繪製它們的組件時,應該始終自動使它們失效,以便重繪自己,但不會發生混亂。我還在狀態欄上調用了SendToFront,但這兩者都沒有幫助。所以我也在問什麼是維護訂單的正確機制,核心組件如何處理。

編輯:我在這個問題上也運行:隨着我OnPaint的每次運行-event我的疊加變得越來越不透明,因爲它與阿爾法= 128平 - 紅連連本身。

+0

你什麼時候在狀態欄上調用'SendToFront'? – Justin 2011-05-02 20:08:08

+0

創建完成後,再次添加其他控件後。 – ZoolWay 2011-05-02 20:09:24

回答

1

爲了消除外部因素(如XP,Vista中,Win7的之間的差異),你可以:

  • 交融「狀態面板」圖形到他們的OnPaint處理程序的每個控制,所以你不需要以半透明的狀態窗口來實現所需的顯示。

  • 使用一個不透明的控件(實質上是狀態面板),並通過合成來自單個控件的圖形來渲染想要的最終圖像,這將消除渲染過程如何操作的任何不確定性。這意味着你必須添加自定義的點擊處理,但這通常是一個相當簡單的補充 - 一個簡單的方法是將主要的「顯示控制」放在一組不可見控件(按鈕)後面,以便所有點擊處理可以像平常一樣工作,但繪畫被委派給一個控件。

+0

第一個解決方案聽起來像是我告訴表單上的每一個控件都會在自己的繪畫之後繪製狀態面板的一部分。這導致瞭如何獲得這些部分的問題,因爲它們可能不是簡單的矩形。我不確定我是否理解第二種解決方案。點擊目前不是問題。 – ZoolWay 2011-05-02 20:47:18

+1

您是否使用半透明的[Form](http://msdn.microsoft.com/zh-cn/library/czke9azk.aspx),半透明的[Control](http://msdn.microsoft.com/zh-cn/ -us/library/wk5b13s4(v = VS.100).aspx),還是隻是在控件的屏幕區域透支?這聽起來像你透支,這會導致你所描述的問題。 – 2011-05-02 21:45:31

+0

表單不透明。狀態欄的控件應該是半透明的。 'CreateParams'被覆蓋以設置'WS_EX_TRANSPARENT'。 'OnPaintBackground'被實現,但是是空的。 'OnPaint'用'Color.FromArgb'創建一個帶有SolidBrush的矩形。這是錯誤的方式? – ZoolWay 2011-05-02 22:13:09