C# 窗体实现透明背景

6

我已经看过了WinForms上的透明背景?

但它并没有提供解决我的问题的方法。我正在使用同样的方法尝试实现透明度。

    public Form1()
    {
        this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        InitializeComponent();
        this.BackColor = Color.FromArgb(0, 0, 0, 0);
    }

但是这会给出一个灰色的背景,而不是透明的。我该如何获得实际透明的背景(请注意,透明键解决方案不会提供透明的背景,并且当我用小于255的alpha通道涂画时,它会与设置的窗体背景颜色混合,而不是真实的背景)?我想用alpha < 255绘制屏幕上的某些区域,并与背景混合(而不是表单)。


你最好采用下面 @Zarathos 的解决方案。一旦你有一个透明的“Form”背景,你就可以使用带有alpha通道的32bpp PNG位图等图像。如果你想要更多的灵活性,我建议你研究一下WPF,它可以做很多你想要以不同透明度实现的事情。 - Erik
PNG 对我想要的东西来说过于不灵活了..也许你想展示一下如何开始使用 WPF 来完成这样的事情?谢谢。 - user1207217
请查看@AbZy在此帖子中提出的解决方案:https://dev59.com/E2855IYBdhLWcg3wPBpx#4464161 - AntonioJunior
4个回答

20

我很久以前的做法是找到一个未使用的颜色作为表单背景,然后将透明度设置为该颜色:

this.BackColor = Color.Magenta;
this.TransparencyKey = Color.Magenta;

其他的方法包括:

  • 创建一个背景图像,用特定颜色绘制其透明区域,并将其设置为表单 BackgroundImage...... 然后将 TransparencyKey 设置为该颜色。
  • 覆盖 OnPaintBackground 方法并将其设为空方法。

[编辑] 如Mario所述,通常默认的透明键颜色是洋红色。


3
Color.Magenta 通常被认为是默认的透明关键颜色。这可能使得根据你正在处理的内容,事物更容易被重复使用。另外请记住,颜色关键仅支持1位alpha(即透明/不透明),但不支持真正的8位alpha(或更多),这正是OP所寻找的。 - Mario
1
重写 OnPaintBackground 函数导致我的背景变成了黑色……正如 Mario 所说的那样,这样做不允许我混合 - 在我开始尝试混合之前,我的背景就是这样的。 - user1207217
只专注于TransparencyKey解决方案...您是否尝试在窗体构造函数中调用"SetStyle(ControlStyles.SupportsTransparentBackColor, true);"? 您是否尝试使用"SetStyle(ControlStyles.SupportsTransparentBackColor, true);",然后再使用"this.BackColor = Color.Transparent;"? - Tommaso Belluzzo
这个答案为什么还没有被接受,我不知道原因,+1。 - Jordan LaPrise

3

这是实现WinForm透明背景的最佳方法。

紧接着:

public partial class frmTransparentBackcolor : Form
{
    public frmTransparentBackcolor()
    {
        InitializeComponent();
        //set the backcolor and transparencykey on same color.
        this.BackColor = Color.LimeGreen;
        this.TransparencyKey = Color.LimeGreen;
    }
    protected override void OnPaintBackground(PaintEventArgs e)
    {
        e.Graphics.FillRectangle(Brushes.LimeGreen, e.ClipRectangle);
    }
}

希望这能有所帮助。


0

你可以使用一张图片来完成这项工作。图片的边框颜色为红色,接下来使用这段代码:

this.TransparencyKey = Color.Red;

-1
public partial class TransprtScrcn : Form
    {
        public TransprtScrcn()
        {
            InitializeComponent();
            this.BackColor = Color.Red;
            this.TransparencyKey = Color.Red;
        }


        protected override void OnPaintBackground(PaintEventArgs e)
        {
            e.Graphics.FillRectangle(Brushes.Red, e.ClipRectangle);
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接