如何使PictureBox真正透明

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

问题是,当我在应用程序中移动PictureBox时,PictureBox的背景移动得太奇怪 – 几乎就像PictureBox本身有背景一样。

之前:

在此处输入图像描述

之后(移动时):

在此处输入图像描述

一些代码:

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

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

虽然WinForms不太适合用户控件的透明性,但它是可能的。 在这里看到这篇文章 。 在其中作者建议从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; } } 

最后,覆盖OnPaintfunction,您可以绘制您的图片框。

 protected override void OnPaint(PaintEventArgs e) { Graphics g = e.Graphics; //Do your drawing here } 

使用此function,您可以创建一个具有透明度的自定义图片框,但请注意,如果您实时在屏幕上移动它,将会出现闪烁和模糊。

使用这个和类似的技术,我们设法得到一个WinForms应用程序, Premex XPort渲染与他们的网站类似的品牌。 这涉及多个透明控件,绘画黑客和所有种类,以使其正确显示。

总之,Winforms之所以做得不好,是因为基于Win32的技术,一个控件在屏幕上拥有一个像素。 正如您在HTML或WPF中所期望的那样,无法真正合成具有透明度的像素。 后来的Windows技术(WPF)做得特别好,所以如果你真的希望在应用程序中大量使用透明度,我建议移动到这个平台,至少部分(WPF可以在WinForms中托管,反之亦然)。

最好的祝福,

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

你的选择是:

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