繁体   English   中英

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

[英]C# PNG image with transparent zones as Button

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

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

我发现这个代码: C#透明PNG用于按钮,面板......怎么样?

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

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

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

我这样做的好方法吗? 仅仅创建此类的实例以使其工作就足够了吗?

谢谢

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将与背景混合。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM