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的调用。
而且,试试这个:
- 创建一个表单,并设置它的背景图片(使用墙纸或东西)
- 面板添加到窗体,并设置它的背景为透明(它使用DrawThemeParentBackground要做到这一点!)
- 将您的透明PNG添加到面板中... PNG将与背景融合在一起。
现在,由于GDI缺乏UI开发人员所需的许多功能,他们都转移到了WPF,这是一个完全不同的野兽,但会做你正在问的问题,没有太大麻烦!
我对你确切的问题有点困惑。您是否遇到透明度问题(如果是这样,请阅读GDI和GDI +中的透明度)......您是否创建了自己的控件以充当按钮?该按钮是否找不到您正在查找的资源或其他资源? – series0ne
另外,“扩散网页内容”是什么意思? – series0ne
我必须放下一个带透明区域的PNG图像,这个透明区域可以充当按钮。在我发现的代码中,人们说我们可以通过创建一个“自定义”控件来获得这个结果。 –