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 的调用。
另外,试试这个:
- 创建一个表单并设置它的背景图片(使用壁纸或其他东西)
- 向表单添加一个面板,并将其背景设置为透明(它使用 DrawThemeParentBackground 来执行此操作!)
- 将透明 PNG 添加到面板中……PNG 将与背景融合。
现在,由于 GDI 缺少 UI 开发人员想要的许多功能,他们都转向 WPF,这是一个完全不同的野兽,但会做你所要求的,没有太多麻烦!