如何使PictureBox真正透明

时间:2011-12-31 13:16:07

标签: c# .net winforms transparency picturebox

我有一个PictureBox,可以垂直移动。 PictureBox中显示的图像是透明GIF,因此在图像查看器中查看时,它没有背景。

问题在于,当我在应用程序中移动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);

我也试过将图片框双缓冲,但这也不起作用。

2 个答案:

答案 0 :(得分: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中托管,反之亦然)。

致以最诚挚的问候,

答案 1 :(得分:2)

Win32控件并不是真正透明的。

您的选择是:

  • 更改为WPF
  • 使用PictureBox.Region剪辑控件的不需要(“透明”)区域
  • 查看是否有第三方控件可以执行您想要的操作