我有一个 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 不太适合用户控件的透明性,但这是可能的。请参阅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 中,反之亦然)。
最诚挚的问候,
关于c# - 如何使 PictureBox 真正透明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8688295/