2009-08-05 146 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