【问题标题】:Transparent background on winforms?winforms透明背景?
【发布时间】:2010-12-08 12:57:40
【问题描述】:

我想让我的窗口窗体透明,因此删除了边框、控件和所有内容,只留下窗体框,然后我尝试将 BackColor 和 TransparencyKey 设置为透明但它没有成功,因为 BackColor 不接受透明颜色。在四处搜索后,我在 msdn 上找到了这个:

SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.BackColor = Color.Transparent;
this.TransparencyKey = BackColor;

不幸的是,它也不起作用。我仍然得到灰色或任何其他选定的颜色背景。

我想要做的就是让窗体透明,这样我就可以使用一个背景图像,就好像它是我的窗体一样。

我在这里搜索了很多关于不透明度的主题,这不是我想要的,还看到了一些关于我正在尝试但尚未找到答案的方法。

希望任何人都可以照亮我的道路。

更新:

问题解决后删除图片

【问题讨论】:

  • 你能澄清一下你想做什么吗?我不明白你想用背景图片实现什么。
  • 我想以一种简单的方式制作自己的自定义应用程序窗口,因此我不使用 winforms 默认窗口,而是尝试使其透明以使用我的背景图像。
  • 您的意思是背景图像将绘制在您的窗口后面的某个其他窗口上吗?我不明白为什么你不能只覆盖 OnPaint 并在那里绘制背景图像......
  • @Ran 我已经更新了一个例子,绿色部分是我想要完全透明的窗口窗体的剩余部分。
  • 我明白了。所以还有2个问题...:)您是否将图像文件设置为Form的BackgroundImage属性?图片的格式是什么?

标签: c# winforms background transparent


【解决方案1】:

我之前使用的方式是使用百搭颜色(没有人会使用的颜色)作为背景色,然后将透明度键设置为该颜色。

this.BackColor = Color.LimeGreen;
this.TransparencyKey = Color.LimeGreen;

【讨论】:

  • 这不起作用,当我这样做时,我简单地得到一个石灰背景。我已经在其他主题中看到了这个答案并尝试过,但是谢谢。
  • @Prix - 我看到使用图像作为表单透明背景的唯一方法是使用Graphics.Clipmsdn.microsoft.com/en-us/library/…。这变得非常复杂。
  • 它不是透明背景的图像,它是透明窗体上的图像。我唯一的问题是 Windows 窗体的背景不会透明图像应该是 100%。
  • @Prix - 我发布的解决方案为 Framework 4.0 中的 Windows 窗体提供了透明背景。 (我也刚刚测试过)。但是,如果您将图像注入到需要透明度的背景中,则必须使用透明位图来完成它。如果您使用上面的解决方案,您可以将您的图像放入标签或面板控件中,并确保它“发送到后面”。不过,您的图像仍需要是透明位图。只是在里面扔一个png是不行的。
  • 这是一个透明的 png,如果我将背景颜色设置为任何我可以通过图像的透明部分完美看到的东西,我就无法将表单设置为透明。我会用 4.0 再试一次,正在使用 3.5 不确定它是否会有所作为。
【解决方案2】:

在 windows 窗体中获得透明背景的简单解决方案是覆盖 OnPaintBackground 方法,如下所示:

protected override void OnPaintBackground(PaintEventArgs e)
{
    //empty implementation
}

(注意 base.OnpaintBackground(e) 已从函数中删除)

【讨论】:

  • 我注意到接受的答案有时会在透明度开始之前闪烁默认背景颜色。这似乎对我的目的可靠地工作。谢谢!
  • 这个答案更好,因为它不会导致像这样奇怪的事情:i.imgur.com/lYFunRT.png(注意奇怪的“石灰绿”阴影)
【解决方案3】:

我已经尝试了上述解决方案(以及其他帖子中的许多其他解决方案。

就我而言,我使用以下设置:

public partial class WaitingDialog : Form
{
    public WaitingDialog()
    {
        InitializeComponent();

        SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        this.BackColor = Color.Transparent;

        // Other stuff
    }

    protected override void OnPaintBackground(PaintEventArgs e) { /* Ignore */ }
}

如您所见,这是先前给出的答案的混合。

【讨论】:

【解决方案4】:

这是我的解决方案:

在构造函数中添加这两行:

this.BackColor = Color.LimeGreen;
this.TransparencyKey = Color.LimeGreen;

在你的表单中,添加这个方法:

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

请注意,此表单不仅在框架内完全透明,而且您还可以单击它。但是,在其上绘制图像并让表单能够被拖动到任何地方以创建自定义形状的表单可能会很酷。

【讨论】:

  • 嗨,艾拉!我想知道...我可以让这个不点击吗?我正在尝试做一个截图程序...
【解决方案5】:

我的解决方案非常接近 Joel 的(不是 Etherton,只是简单的 Joel):

public partial class WaitingDialog : Form
{
    public WaitingDialog()
    {
        InitializeComponent();

        SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        this.BackColor = Color.Transparent;
        this.TransparencyKey = Color.Transparent; // I had to add this to get it to work.

        // Other stuff
    }

    protected override void OnPaintBackground(PaintEventArgs e) { /* Ignore */ }
}

【讨论】:

  • 这对我不起作用。我在表单上的其他控件也变得半透明,而不仅仅是背景。
【解决方案6】:

对我有用的是使用特定的颜色而不是 .png 的真实能力来表示透明度。

因此,您可以做的是获取背景图像,并用特定颜色绘制透明区域(洋红色对我来说总是合适的......)。

图片设置为Form的BackgrounImage属性,颜色设置为Form的TransparencyKey。不需要改变Control的样式,也不需要BackColor。

我现在已经尝试过了,它对我有用...

【讨论】:

    【解决方案7】:

    我几乎尝试了所有这些。但仍然无法工作。 最后我发现是因为 24bitmap 的问题。如果您尝试了一些小于 24 位的位图。上述大多数方法都应该有效。

    【讨论】:

      【解决方案8】:

      我在 VS2013 中绘制了一个带有“透明”背景颜色的闪屏(32bpp BGRA),并将一个图片框放在一个表单中进行显示。对我来说,上述答案的组合有效:

      public Form1()
      {
          InitializeComponent();
      
          SetStyle(ControlStyles.SupportsTransparentBackColor, true);
          this.BackColor = this.pictureBox1.BackColor;
          this.TransparencyKey = this.pictureBox1.BackColor;
      }
      

      因此,请确保在任何地方都使用相同的 BackColor,并将该颜色设置为 TransparencyKey。

      【讨论】:

        猜你喜欢
        • 2011-03-08
        • 2021-09-20
        • 2019-02-07
        • 2020-10-15
        • 2017-06-22
        • 2010-10-20
        • 2011-02-01
        • 2013-12-10
        • 2013-07-31
        相关资源
        最近更新 更多