2016-02-03 140 views
4

我想實現的是覆蓋屏幕的半透明背景。 然後能夠在其上繪製不透明的畫筆。C#NET - 在不透明度設置的窗體上繪製不透明畫筆

我試過的是用屏幕大小的表格,然後設置它的顏色和設置this.opacity = 0.5。但是,這會影響表格中的所有畫筆。

我也嘗試將背景顏色設置爲Color.Transparent,然後在繪製不透明刷子之前繪製一個覆蓋不透明度爲0.5的屏幕的附加筆刷,然後繪製不透明筆刷...但背景也變得不透明。 即使風格標誌設置(ControlStyles.SupportsTransparentBackColor, true)

我知道我可以通過有一個額外的形式來實現這一點。 一種形式的透明背景和一種不透明的前景,但不是矯枉過正?

有沒有更好的方法?

更新1: 嘗試在評論中建議的內容。

當前狀態: Form1中:主程序,呼籲「覆蓋」來顯示,這是: 窗體2:疊加背景(半透明的黑色),並且 Form3:覆蓋前景,這是用戶平局。

表單1和2的工作方式與Indended類似,但Form3拒絕使用透明性。 如果我設置

this.BackColor = Color.Lime; 
this.TransparencyKey = Color.Lime; 

則性能下降和程序嚴重滯後(雖然它變得透明)。 理想情況下,我想要使用this.BackColor = Color.Transparent;但是沒有任何效果(純色背景,沒有alpha)。

請注意,窗體覆蓋屏幕和背景通常是桌面。也許這就是爲什麼它不起作用?

+1

一種選擇是顯示您的表單之前創建一個截圖,並將它作爲一個背景圖像。也許不是最好的解決方案,但它很簡單(就像我:P) –

+0

@ C.Evenhuis這是一個好主意,我想到了。我正在嘗試製作截圖程序,所以我希望能夠在後臺捕獲潛在的視頻:) –

+2

您需要*兩個*窗口的三明治。底部一個使用不透明度,最上面一個使用TransparencyKey,並且是您繪製的一個。三明治示例代碼[在這裏](http://stackoverflow.com/a/4503371/17034)。 –

回答

0

您可以覆蓋該表格的OnPaintBackground,而不用調用它的基數。 這將使您能夠指定背景所需的任何顏色。

試試這個:

protected override void OnPaintBackground(PaintEventArgs e) 
{ 
    using (var brush = new SolidBrush(Color.FromAgrb(50, 0, 0, 0)) 
    { 
     e.Graphics.FillRectangle(brush, e.ClipRectangle); 
    } 
} 
+0

感謝您的建議。我正在與標誌ControlStyles一起嘗試此操作。SupportsTransparentBackColor設置爲true。無論Alpha值如何設置,顏色都是不透明的。( –

+0

)實際上,它確實對我有用,但前提是表單無法移動。我認爲Hans Passant有更好的解決方案(像往常一樣: - )) –

+0

我鎖定了我的表單,所以無法移動它(它覆蓋了整個屏幕),並沒有幫助。 alpha不起作用。如果我使用backcolor = transparent,我繪製的畫筆將無法使用alpha(總是固體),但是如果我設置了不透明度,那麼一切都會受到影響。 –