我正在尝试在表单顶部添加一个按钮来扩散Web内容。该按钮应该是一个带有一些透明区域的圆形PNG图像(由于这些区域我不能只使用GraphicPath圆来管理它。)
当然,我的PNG在透明背景下得到了很好的保存。在设计师中,我将forecolor和backcolor都设置为透明。这样,如果我从按钮中删除图像,按钮就完全透明了。但是使用PNG图像分配它不是。
我找到了这段代码: C# transparent PNG for buttons, panels...how?
我的问题是我无法使用它。如果我只是将其复制到我的应用程序的命名空间中,MainForm设计器会给我一个错误:
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
“无法找到指定文化的适当来源”。
我这样做的好方法吗?仅创建此类的实例以使其起作用是否足够?
谢谢
答案 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的调用。
另外,试试这个:
现在,由于GDI缺乏UI开发人员想要的许多功能,他们都已经转移到WPF,这是一个完全不同的野兽,但会做你想要的,没有太多麻烦!