带有透明区域作为按钮的C#PNG图像

带有透明区域作为按钮的C#PNG图像,c#,transparency,C#,Transparency,我正在尝试在表单顶部添加一个按钮,用于传播web内容。按钮应该是一个圆形PNG图像,带有一些透明区域(因为这些区域我不能仅仅使用GraphicPath circle来管理它) 当然,我的PNG在透明背景下保存得很好。在designer中,我将前景色和背景色都设置为透明。这样,如果我从按钮中删除图像,按钮是完全透明的。但对于PNG图像,它不是 我发现这个代码: 我的问题是我无法使用它。如果我只是将其复制到我的应用程序的命名空间中,MainForm designer会给我一个错误: th

我正在尝试在表单顶部添加一个按钮,用于传播web内容。按钮应该是一个圆形PNG图像,带有一些透明区域(因为这些区域我不能仅仅使用GraphicPath circle来管理它)

当然,我的PNG在透明背景下保存得很好。在designer中,我将前景色和背景色都设置为透明。这样,如果我从按钮中删除图像,按钮是完全透明的。但对于PNG图像,它不是

我发现这个代码:

我的问题是我无法使用它。如果我只是将其复制到我的应用程序的命名空间中,MainForm designer会给我一个错误:

     this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
“无法找到指定区域性的适当来源”

我做得好吗?仅仅创建这个类的一个实例就足够了吗


谢谢

Windows窗体是使用GDI和GDI+绘制的,它们正确处理透明度的能力有限,因为在GDI最初创建时,透明度不是一个考虑因素的功能。也就是说,有些函数在某种程度上会处理透明度,比如函数

因此,您可能想知道“如何在Windows窗体中实现透明度?”——这不是“真正的”透明度,更多的是事后考虑(或黑客)为GDI(以及Windows窗体控件)提供“透明度”

这个技巧是UXTheme调用的一个函数,它主要查看控件下面的内容,并在绘制子控件之前将其绘制到表面

尝试将控件子类化并用颜色填充其客户端区域。透明:

public class TestControl : Control
{
    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.Clear(System.Drawing.Color.Transparent);
    }

    protected override void OnPaintBackground(PaintEventArgs pevent)
    {
        pevent.Graphics.Clear(System.Drawing.Color.Transparent);
    }
}
控件绘制为完全黑色,对吗?这是因为GDI并不真正知道什么是“透明的”

因此,您需要覆盖OnPaintBackground事件,并在其中执行对DrawThemeParentBackground的调用

此外,请尝试以下方法:

  • 创建表单并设置其背景图像(使用墙纸或其他东西)
  • 在表单中添加一个面板,并将其背景设置为透明(它使用DrawThemeParentBackground来完成此操作!)
  • 将您的透明PNG添加到面板…PNG将与背景混合

  • 现在,由于GDI缺少UI开发人员想要的许多功能,他们都转向了WPF,这是一个完全不同的野兽,但会按照您的要求去做,不会有太多麻烦

    我对你的确切问题有点困惑。您是否遇到透明度方面的问题(如果是,请阅读GDI和GDI+中的透明度…您是否创建自己的控件作为按钮?按钮是否根本找不到您正在寻找的资源或其他资源?还有,您所说的“扩散web内容”是什么意思?我必须放下一个带有透明区域的PNG图像,作为按钮。在我找到的代码中,人们说我们可以通过创建一个“自定义”控件来获得这个结果。“Web内容”是一个网页,它的内容可以随时间变化,这就是为什么我需要真正的透明度,因为我无法将背景色调整到页面的颜色,使其成为“透明的”。我想你很难用Windows窗体做到这一点。您可能想考虑为此移到WPF。谢谢。我想我会用一种“受限”的方式来做——我会放弃内部的透明度,只使用一些图形路径类来使用一个透明的形式,它只会使我的按钮出现在一个圆圈中。@GrigoryKornilov,没问题。事实上,我已经花了很多时间研究Windows窗体、GDI、GDI+、Windows Glass等的可行性/不可行性。因此,如果您可以更新您的问题,并包括一些您试图实现的目标(理想情况下)、当前的外观等的图片。如果我能够直观地看到问题,我可能会提供更多帮助。