4

我正在尝试在我的表单顶部添加一个按钮来分散网络内容。该按钮应该是带有一些透明区域的圆形 PNG 图像(因为这些区域我不能只使用 GraphicPath 圆圈来管理它)。

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

我找到了这段代码: C# transparent PNG for buttons, panel...how?

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

     this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));

“不可能找到指定文化的适当来源”。

我这样做是好方法吗?仅仅创建这个类的一个实例来让它工作就足够了吗?

谢谢

4

1 回答 1

1

Windows 窗体是使用 GDI 和 GDI+ 绘制的,它们在正确处理透明度方面的能力有限,因为在首次创建 GDI 时,透明度并不是一个考虑因素。话虽如此,有一些函数可以处理透明度在某种程度上,就像AlphaBlend函数一样。

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

这个技巧是作为 UXTheme 一部分的一个名为DrawThemeParentBackground的函数,它主要查看控件下方的内容,并在绘制子控件之前将其绘制到表面。

尝试子类化一个控件并用 Color.Transparent 填充其客户区:

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 的调用。

另外,试试这个:

  1. 创建一个表单并设置它的背景图片(使用壁纸或其他东西)
  2. 向表单添加一个面板,并将其背景设置为透明(它使用 DrawThemeParentBackground 来执行此操作!)
  3. 将透明 PNG 添加到面板中……PNG 将与背景融合。

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

于 2013-06-05T14:49:22.063 回答