2013-06-05 50 views
3

我试图在扩散Web内容的表单上添加一个按钮。该按钮应该是带有一些透明区域的圆形PNG图像(因为这些区域不能使用GraphicPath圆来管理它)。带有透明区域的C#PNG图像作为按钮

当然,我的PNG很好的保存了透明背景。在设计师中,我将前景色和背景色都设置为透明。这样,如果我从按钮中删除图像,该按钮是完全透明的。但与PNG图像assigne它不是。

我发现这个代码: C# transparent PNG for buttons, panels...how?

我的问题是,我不能去使用它。如果我只是在我的应用程序的命名空间中复制,MainForm的设计师给我一个错误:

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

“不可能找到指定的文化拨款源”。

我这样做的好方法吗?仅仅创建这个类的一个实例就足以让它起作用了?

谢谢

+0

我对你确切的问题有点困惑。您是否遇到透明度问题(如果是这样,请阅读GDI和GDI +中的透明度)......您是否创建了自己的控件以充当按钮?该按钮是否找不到您正在查找的资源或其他资源? – series0ne

+0

另外,“扩散网页内容”是什么意思? – series0ne

+0

我必须放下一个带透明区域的PNG图像,这个透明区域可以充当按钮。在我发现的代码中,人们说我们可以通过创建一个“自定义”控件来获得这个结果。 –

回答

1

Windows窗体使用GDI绘制和GDI +,这是在他们的正确处理透明度的能力有限,因为在最初创建GDI时,透明度是不是在因素的特征。话虽这么说,有一些功能会在某种程度上处理透明度,如AlphaBlend函数。

因此,您可能想知道“您如何在Windows Forms中实现透明度?” - 它不是“真正的”透明度,更多的是为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,这是一个完全不同的野兽,但会做你正在问的问题,没有太大麻烦!

+0

谢谢。我认为我会以一种“受限制”的方式来做 - 我会放弃内部透明度,并使用一些Graphic Path类来使用透明窗体,只显示一个圆圈,在其中放置我的按钮。 –

+0

@GrigoryKornilov,没问题。实际上,我花了很多时间来研究Windows Forms,GDI,GDI +,Windows Glass等不可能实现的功能。因此,如果您可以更新您的问题并包含您尝试实现的某些图片(理想情况下),目前看起来像什么等等。如果我可以直观地看到问题,我可能会多提供一些帮助。 – series0ne