c# - 如何使 PictureBox 真正透明

标签 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);

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

最佳答案

虽然 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/

相关文章:

.net - 有效的单元测试覆盖率(以及实际应该测试什么?)

c# - 当给定的事件属性不存在时,如何为文件目标指定默认路径?

c# - 无需鼠标拖动手势即可移动窗口

c# - 如何更新 ListView 选中的项目?

c# - 使用通用工作单元 C# 模拟通用存储库

c# - 上下文关键字 'var' 可能只出现在局部变量声明问题中

c# - 将 .csv 转换为数据表时的额外引号

c# - 无法通过 Hotmail/live.com/outlook.com 发送电子邮件

.net - Windows 窗体检查器,通过单击

c# - 遍历标签并更改值 c#