我有一个 PictureBox,可以垂直移动。 PictureBox 中显示的图像是透明的 GIF,因此在图像查看器中查看时,它没有背景。
问题是,当我在应用程序中移动 PictureBox 时,PictureBox 背景移动得太奇怪 - 几乎就像 PictureBox 本身有背景一样。
Before:
之后(移动时):
一些代码:
path = "C:\\note.gif";
note.Image = Image.FromFile(path);
note.Visible = true;
note.BackColor = Color.Transparent;
panel.Controls.Add(note);
我也尝试过使图片框双缓冲,但这也不起作用。
虽然 WinForms 不太适合用户控件的透明性,但这是可能的。看本文这里。在其中,作者建议从面板而不是用户控件派生,并重写 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 应用程序,普雷梅克斯 XPort使用与其网站类似的品牌进行渲染。这涉及多个透明控件、绘画技巧以及各种使其正确显示的方法。
总之,Winforms 在这方面表现不佳的原因是在基于 Win32 的技术中,一个控件在屏幕上拥有一个像素。无法像您在 HTML 或 WPF 中所期望的那样真正地合成具有透明度的像素。后来的 Windows 技术 (WPF) 在这方面做得特别好,因此如果您确实希望在应用程序中大量使用透明度,我建议至少部分地迁移到此平台(WPF 可以托管在 WinForms 中,反之亦然)。
此致,
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)