2009-08-05 179 views
4

我顯示在面板PictureBox重疊,因爲每個PictureBox使用 作爲一個層。第一次定義了PictureBox並將其添加到面板後,它的背景顏色是 是透明的,它的圖像是空的。透明度問題重疊PictureBox在C#

問題是,底層無法看到,透明圖像顯示面板的地面 。例外是看到底部PictureBox的圖像。

我試圖用其他控件像標籤。這個問題不能得到解決:(

感謝。

+0

這是有點難以遵循。我想如果你以不同的方式解釋,你可能會得到一些答案。 – 2009-08-05 19:06:43

回答

11

這是因爲,如果我沒有記錯,設置的透明背景顏色(它的實際值是空,是吧?)是不是真的透明 .Windows的功能是查看控件的父容器的背景顏色,並設置控件的背景顏色。

您可以看到這種情況尤其出現在面板上,如果沒有內容,設置爲透明的面板應該讓你看到它們後面,對不對如果你把面板放在一堆文本框控件的頂部,並將面板設置爲透明,你將無法使用e背後的文本框。

相反,爲了獲得真正的透明度,你必須重載OnPaintBackground來處理有問題的控件,並且基本上什麼都不做(不要讓它調用base.OnPainBackground!)......除此之外,大概,但這裏是我們這裏使用一個工作TransparentPanel控制的一個例子:

public class TransparentPanel : System.Windows.Forms.Panel 
{ 
    [Browsable(false)] 
    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams cp = base.CreateParams; 
      cp.ExStyle |= 0x20; 
      return cp; 
     } 
    } 
    protected override void OnPaintBackground(PaintEventArgs e) 
    { 
     // Do Nothing 
    } 
} 

我們使用這個類成功過去的Windows窗體應用程序創建真正透明面板。我們用它來修復「右鍵單擊上下文菜單出現在按鈕控件上」問題。

+0

我該怎麼稱呼它,在Winforms中創建一個透明的面板 – user335160 2010-09-02 14:59:18

+0

您可以將上面的類放到您引用的控件庫項目中(這就是我們所做的),或者您也可以直接將它作爲一個.cs文件文件。但是,除非您添加它,否則它不會顯示在您的工具箱中。不過,您仍然可以將常規面板拖入設計區域,然後打開designer.cs文件並手動將對象更改爲特殊的TransparentPanel。 – 2010-09-02 16:07:35

+1

public const int WS_EX_TRANSPARENT = 0x20; cp.ExStyle | = WS_EX_TRANSPARENT; – Hbas 2012-08-04 15:25:51

5

這是我對吧:

class TransPictureBox : Control 
{ 
    private Image _image = null; 

    public Image Image 
    { 
     get 
     { 
      return _image; 
     } 
     set 
     { 
      _image = value; 
     } 
    } 
    public TransPictureBox() 
    { 
    } 

    protected override void OnPaintBackground(PaintEventArgs pevent) 
    { 
    } 

    protected override void OnPaint(PaintEventArgs pe) 
    { 
     if(Image != null) 
      pe.Graphics.DrawImage(Image, 0, 0); 
    } 
    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams cp = base.CreateParams; 
      cp.ExStyle |= 0x20; 
      return cp; 
     } 
    } 
} 

你應該多增加一些邏輯,如你所願,並相應修改OnPaint方法的形象定位。

0

你應該做

pe.Graphics.DrawImage(Image, 0, 0, Image.Width, Image.Height); 

讓你的圖片不會被streched

2

我已經能夠在VB中做到這一點。但有一些技巧。首先,你必須添加圖片框到對方。其次,圖片框中的圖像必須是PNG。

對於這個應用程序,我必須在背景圖層上顯示3個不同的圖層,並使用複選框打開和關閉它們。如果它不起作用,請仔細研究如何保存您的PNG,對此有點挑剔。

Imports System.Drawing 
Imports System.Drawing.Imaging 
Imports System 

Public Class Form1 

    Dim MarkerBox1 As New PictureBox 
    Dim MarkerBox2 As New PictureBox 
    Dim MarkerBox3 As New PictureBox 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     PictureBox1.Image = New Bitmap("C:\BackGround.bmp") 

     MarkerBox1.Image = New Bitmap("C:\TestOverlay1.png") 
     MarkerBox1.BackColor = System.Drawing.Color.Transparent 
     MarkerBox1.Visible = True 
     MarkerBox1.SizeMode = PictureBoxSizeMode.AutoSize 
     PictureBox1.Controls.Add(MarkerBox1) 

     MarkerBox2.Image = New Bitmap("C:\TestOverlay2.png") 
     MarkerBox2.BackColor = System.Drawing.Color.Transparent 
     MarkerBox2.Visible = True 
     MarkerBox2.SizeMode = PictureBoxSizeMode.AutoSize 
     MarkerBox1.Controls.Add(MarkerBox2) 

     MarkerBox3.Image = New Bitmap("C:\TestOverlay3.png") 
     MarkerBox3.BackColor = System.Drawing.Color.Transparent 
     MarkerBox3.Visible = True 
     MarkerBox3.SizeMode = PictureBoxSizeMode.AutoSize 
     MarkerBox2.Controls.Add(MarkerBox3) 


    End Sub 

    Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged 
     If CheckBox1.Checked Then 
      MarkerBox1.Visible = True 
     Else 
      MarkerBox1.Visible = False 
     End If 
     Visibilitychanged() 
    End Sub 

    Private Sub CheckBox2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox2.CheckedChanged 
     If CheckBox2.Checked Then 
      MarkerBox2.Visible = True 
     Else 
      MarkerBox2.Visible = False 
     End If 
     Visibilitychanged() 
    End Sub 

    Private Sub CheckBox3_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox3.CheckedChanged 
     If CheckBox3.Checked Then 
      MarkerBox3.Visible = True 
     Else 
      MarkerBox3.Visible = False 
     End If 
     Visibilitychanged() 
    End Sub 

    Private Sub Visibilitychanged() 

     PictureBox1.Controls.Clear() 
     MarkerBox1.Controls.Clear() 
     MarkerBox2.Controls.Clear() 
     MarkerBox3.Controls.Clear() 

     Dim PB As PictureBox = PictureBox1 
     If MarkerBox1.Visible Then 
      PB.Controls.Add(MarkerBox1) 
      PB = MarkerBox1 
     End If 
     If MarkerBox2.Visible Then 
      PB.Controls.Add(MarkerBox2) 
      PB = MarkerBox2 
     End If 
     If MarkerBox3.Visible Then 
      PB.Controls.Add(MarkerBox3) 
      PB = MarkerBox3 
     End If 

    End Sub 
+0

該死的,這個真的有用!但請注意,PictureBoxSizeMode.Zoom **不能**,並且您可能需要手動設置子PictureBox的尺寸(如果允許基礎圖像縮放到父容器)。 – 2013-09-19 19:27:48