C#PNG图像,透明区域为按钮

时间:2013-06-05 14:07:59

标签: c# transparency

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

当然,我的PNG在透明背景下得到了很好的保存。在设计师中,我将forecolor和backcolor都设置为透明。这样,如果我从按钮中删除图像,按钮就完全透明了。但是使用PNG图像分配它不是。

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

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

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

“无法找到指定文化的适当来源”。

我这样做的好方法吗?仅创建此类的实例以使其起作用是否足够?

谢谢

1 个答案:

答案 0 :(得分:0)

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. 在表单中添加一个面板,并将其背景设置为Transparent(它使用DrawThemeParentBackground来执行此操作!)
  3. 将透明PNG添加到面板中...... PNG将与背景混合。
  4. 现在,由于GDI缺乏UI开发人员想要的许多功能,他们都已经转移到WPF,这是一个完全不同的野兽,但会做你想要的,没有太多麻烦!