2009-05-28 14 views
1

我有一個控件可以在我的GUI中疊加多個C#用戶控件。這種控制有以「灰色出」的GUI的部分的半透明背景和類看起來somethink這樣的:c#Winforms:刷新一部分GUI(包含一個或多個控件)

public greyOutControl: UserControl 
{ 
    // Usual stuff here 

    protected overide OnPaint() 
    { 
     paintBackround(); 

     base.OnPaint(); 
    } 
} 

目前有時被抓住在一個循環中不斷控制重新繪製背景,使得半透明顏色顯得越來越不透明。

我對解決這個問題的想法是以下(從廣義上講):

1)確定哪些控制greyOutControl是對 2頂部)調用刷新()對這些控件更新顯示 3)繼續繪製greyOutControl。

我的問題是:如何確定哪些控件與greyOutControl重疊?或者是否有方法可以只刷新greyOutControl覆蓋的GUI部分?

回答

0

我發現這個問題的解決方案是以編程方式拍攝覆蓋區域的屏幕截圖,然後使用該圖像作爲覆蓋控件的背景。然後,您可以將Alpha覆蓋圖放入OnPaint()方法內的圖像中,並使控件正確繪製自身。

這樣做的缺點是背景沒有在重疊控件中更新,但除非有多個事件處理程序在觀察是否有更改,然後更新覆蓋控件,否則無法解決問題。有時我很後悔沒有嘗試使用WPF!

0

我沒有看到找到重疊控件的直接方式。我想你可能需要檢查整個控制樹來找出答案。關於刷新,您可以使用Control.Invalidate(Rectangle)方法指定要刷新的部分。

+0

調用Invalidate()的問題是Invalidate不能保證立即被調用,而是文檔聲明它會在下一個便捷的時間被調用。在OnPaint()函數中,在嘗試添加半透明疊加層之前,完全渲染背景非常重要。因此爲什麼刷新()是首選。 – 2009-05-28 14:33:21

2

爲什麼不跟蹤你的透明控件並在所有其他控件被繪製後繪製它們?在Z順序頂部繪製任何東西都不會導致其他控件被重新繪製。

+0

基本上,我只在需要時顯示/隱藏透明控件,即在所有其他控件之上。需要更多的原因是由於控件的透明部分被重新塗刷多次導致不希望的效果。因此,無論何時重新繪製控件,我都希望它能夠在正確的透明區域內完全渲染。 – 2009-05-28 14:41:57