簡體   English   中英

使用C#.NET 3.5 WinForms是否部分透明?

[英]Partial transparency with C# .NET 3.5 WinForms?

我正在制作具有繪制部分透明的黑色背景的窗體的.NET 3.5應用程序。 我重寫OnPaintBackground來完成此任務:

protected override void OnPaintBackground( PaintEventArgs e )
{
    using ( Brush brush = new SolidBrush( Color.FromArgb( 155, Color.Black ) ) )
    {
        e.Graphics.FillRectangle( brush, e.ClipRectangle );
    } 
}

它可以工作,但有時表單會在其自身上繪制而不會清除屏幕,從而使透明度比應有的要暗。 我嘗試過使用Graphics.Flush()Graphics.Clear() ,但是它沒有幫助或完全消除了透明度。 有什么建議么?

編輯:這是在啟動左側的應用程序之后,以及表單在右側重繪幾次(響應從一個控件到另一個控件的制表符)后的樣子:

透明問題http://www.quicksnapper.com/files/5085/17725729384A10347269148_m.png

編輯2:今天早上我在嘗試一些事情,並注意到當透明部分后面的桌面發生變化時,實際上並沒有重新繪制它。 例如,如果我打開任務管理器並將其放在窗口后面,您將看不到它在刷新。 對於我所看到的透明度級別,這是有道理的。 是否有使Windows重繪窗口后面區域的功能?

編輯3:我嘗試過更改窗體上的一些屬性,但是它們都導致窗體繪制不透明的黑色:

this.AllowTransparency = true;
this.DoubleBuffered = true;
this.Opacity = .99;

我將嘗試為透明部分創建一個單獨的窗口,如前所述,但仍然歡迎其他任何想法。

我想我可以稱其為預期行為。 我要做的是將背景渲染到內存中的位圖,然后在繪畫事件中將其復制到窗體(基本雙緩沖)。

如果我離基地很遠,您可以張貼屏幕截圖嗎? 我不知道我在想像您所描述的正確。

編輯:

我想知道您是否在.NET之前使用OnPaintBackground ... WM_PAINT上的屏幕緩沖區。 因此,嘗試從OnPaintBackground更改為OnPaint。

我在.NET中沒有做太多這樣的事情,但是以前我對它有很好的處理。 我只是不知道翻譯是否會順利!

編輯2:

馬克,我對您要嘗試做的事情的思考越多,出現的問題就越多。 我建議創建一個專門用於捕獲屏幕並將其渲染為黑色的后台線程。 但是,為了刪除自己的表單,您必須將可見性設置為false,這會導致其他問題。

如果您不願意放棄,我建議創建兩個窗口並將它們“綁定”在一起。 為背景窗口創建一個半透明窗口(通過設置不透明度),並為前景創建第二個“普通”窗口。 在前景窗口上使用SetWindowRgn可以切掉背景,並將它們放置在彼此的頂部。

祝好運!

Graphics.CompositingMode是否設置為CompositingMode.SourceCopy 這將導致兩次繪制背景等同於繪制一次背景,因為它將替換現有的Alpha / Color數據,而不是對其進行合成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM