2011-12-31 71 views
2

我有一個PictureBox,可以垂直移動。顯示在PictureBox中的圖像是透明的GIF,因此在圖像查看器中查看時,它沒有背景。如何使PictureBox真正透明

問題是,當我在應用程序中移動PictureBox時,PictureBox的背景移動得太奇怪了 - 就好像PictureBox本身具有背景一樣。

前:

enter image description here

後(而移動):

enter image description here

一些代碼:

path = "C:\\note.gif"; 
note.Image = Image.FromFile(path); 
note.Visible = true; 
note.BackColor = Color.Transparent; 
panel.Controls.Add(note); 

我也試過使picturebox雙重緩衝,但那也行不通。

+0

如果將GIF替換爲設置了透明度的PNG,會發生什麼情況? – ChrisF 2011-12-31 13:58:51

+0

在GIF之前嘗試過PNG,遺憾的是同樣的確切情況。 – 2011-12-31 14:00:59

+0

調用'note.Invalidate();'移動後有幫助嗎?或'panel.Invalidate();'? – LarsTech 2011-12-31 15:34:38

回答

4

雖然WinForms不太適合用戶控件的透明度,但它是可能的。請參閱this article。在這篇文章中,作者建議派生自Panel而不是UserControl,並重寫OnPaintBackground方法以便不做任何事情。這將阻止你的背景被繪製

protected override void OnPaintBackground(PaintEventArgs pevent) 
{ 
    //do nothing 
} 

protected override void OnMove(EventArgs e) 
{ 
    RecreateHandle(); 
} 

// Override the CreateParams property: 
protected override CreateParams CreateParams 
{ 
    get 
    { 
     CreateParams cp = base.CreateParams; 
     cp.ExStyle = 0x00000020; //WS_EX_TRANSPARENT 
     return cp; 
    } 
} 

最後,重寫OnPaint函數可以繪製你的圖片框。

protected override void OnPaint(PaintEventArgs e) 
{ 
    Graphics g = e.Graphics; 

    //Do your drawing here 
} 

使用這個你可以創建一個透明的自定義圖片框,但請注意,如果你將它在實時在屏幕上,你會得到閃爍和模糊。

使用這種和類似的技術,我們設法獲得一個WinForms應用程序Premex XPort以與他們的網站類似的品牌來呈現。這涉及到多個透明的控件,繪畫黑客和各種各樣的顯示,以正確顯示。

綜上所述,Winforms之所以做得不好,是因爲在基於Win32的技術中,一個控件擁有屏幕上的一個像素。沒有辦法像HTML或WPF中所期望的那樣真正地將具有透明度的像素組合在一起。後來的Windows技術(WPF)做得非常好,所以如果你真的希望大量使用你的應用程序的透明度,我會建議移動到這個平臺,至少部分(WPF可以在WinForms中,反之亦然)。

此致敬禮

+0

非常感謝您的幫助 - 我明天會試一試:) – 2012-01-01 01:44:48

2

Win32控件並非真正透明。

你的選擇是:

  • 更改爲WPF
  • 使用PictureBox.Region剪輯控制的不必要的(「透明」)領域
  • 查看是否有第三方控件which'll做什麼你想要
+0

所以基本上你說的是,沒有辦法用WinForms解決這個問題?除了PictureBox.Region,它根本不可行,因爲我有很多不同類型的PictureBoxes – 2011-12-31 15:42:52

+1

@Sean'沒有辦法'拉伸它一點,但它只是不值得努力,結果會總是看起來虛假 - 與WPF不同,Windows Forms並沒有考慮到這些問題而創建。現在,我不知道*爲什麼要使用WinForms'PictureBox'是一項要求,但如果這是一個真實世界的項目,我建議你選擇正確的工具**。 – Adam 2011-12-31 17:58:53

+0

這是一個大學項目 - 這就是爲什麼它是一個要求:)如果它是一個真實世界的項目,它會更實際。 – 2012-01-01 01:42:57