【问题标题】:Form with Transparent Background具有透明背景的表格
【发布时间】:2014-04-29 13:52:56
【问题描述】:

我想将表单的背景颜色设置为透明。我知道这可以通过设置TransparencyKey 来实现,但这对我不起作用,因为我在表单上呈现了具有不同 alpha 值的图像。我试图覆盖OnPaintBackground 方法,但后来我得到了黑色背景。有没有更好的方法来设置表单背景透明度?

【问题讨论】:

    标签: c# winforms background transparency transparent


    【解决方案1】:

    那行不通,透明的颜色可以让背景发光。但是表单的背景本身并没有背景。在创建窗口时,您将看到在视频适配器的帧缓冲区中初始化的像素。通常是白色的,如果你使用 Opacity 或 TransparencyKey 属性,它在某些机器上会是黑色的。

    要在窗户本身上打一个洞,以便您看到它后面的任何窗户,您必须使用分层窗户。视频适配器本身将帧缓冲区中的像素与窗口的像素组合在一起,存储在单独的叠加层中。您在电视上看到的与气象员站在气象图前面的效果相同,称为颜色键控。

    这很简单,只需将表单的 BackColor 设置为与 TransparencyKey 属性相同的值。选择一种不会出现在窗口中其他任何地方的“不寻常”颜色,Color.Fuchsia 是一种极好的 fuchsed 颜色。

    【讨论】:

    • 可以通过设置透明度键,但问题是这不适用于具有 0 和 1 之外的 alpha 透明度的图像。
    • 这是图片的问题,不是 TransparencyKey 属性的问题。在使用 24bpp GDI 进行渲染的任何应用程序中,每像素 alpha 的效果都非常差。就像工具箱中的许多标准 Windows 控件一样。它们也变得透明。如果需要每个像素的 alpha,那么您要么必须放弃那些标准控件并自己制作,要么转移到不使用它们的类库,如 WPF、Silverlight 或 Windows-Runtime。
    【解决方案2】:

    不要设置 TransparencyKey。设置不透明度:

    this.Opacity = 0.5d;
    

    注意:这会使整个窗口(半)透明,包括它的边框和标题!如果你将它设置为 0.0d 它将完全不可见!

    【讨论】:

    • 但是随后表格和表格的内容消失了。内容应该仍然可见。
    【解决方案3】:

    您仍然需要绘制背景以使其透明(或者您会看到黑色背景)。

    protected override void OnPaintBackground(PaintEventArgs e)
    {
        using (SolidBrush brush = new SolidBrush(this.TransparencyKey))
            e.Graphics.FillRectangle(brush, ClientRectangle);
    }
    

    不要忘记设置透明度键和背景色

    TransparencyKey = BackColor = Color.LavenderBlush; // to example
    

    和用户绘画风格。

    【讨论】:

    • 嗯,实际上绘画可能没有必要。我从我使用HatchBrush的项目中撕下它(所以它不是完全透明的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多