我正在使用C#开发winform应用程序。我创建了UserControl固有的自定义按钮,如下所示:
public partial class UserButton : UserControl
{
public UserButton(string UserID)
{
this.Size = new Size(32, 50);
this.BackColor = Color.Transparent;
}
protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
Img = WaseelaMonitoring.Properties.Resources.T;
g.DrawImage(Img, 0, 0, this.Size.Width, this.Size.Height);
}
}
注意:这是按钮png图像(Click here)
现在,我想使用以下代码在图片框上显示一些按钮:
UserButton TagButton1 = new UserButton("Button1");
TagButton1.Location = Points[0];
UserButton TagButton2 = new UserButton("Button2");
TagButton2.Location = Points[1];
UserButton TagButton3 = new UserButton("Button3");
TagButton1.Location = Points[2];
Picturebox1.Controls.Add(TagButton1);
Picturebox1.Controls.Add(TagButton2);
Picturebox1.Controls.Add(TagButton2);
Picturebox1.Invalidate();
好的,当在图片框上只显示一个按钮时,背景按钮是透明的(如我所愿),如下所示:
但是如果我想在旁边显示两个或更多按钮,背景按钮是白色的不透明,如下所示:
我使用无效的图片框并尝试使用无效按钮,但是没有解决这个问题。
答案 0 :(得分:3)
WinForms不支持组件的真正Z排序;窗口控件(例如Button
和UserControl
)不能具有真正的alpha通道支持,this.Background - Color.Transparent
技巧实际上是一个特殊情况,控件将重新绘制其父窗口的背景图像或首先为自己着色。
如果您正在使用更灵活的用户体验,我建议您切换到WPF,或在单个WinForms Control
中完成所有绘画。
答案 1 :(得分:0)
我通过将此行添加到初始化构造函数来解决了这个问题:
SetStyle(ControlStyles.Opaque, true);
并覆盖了这个功能:
protected override CreateParams CreateParams
{
get
{
const int WS_EX_TRANSPARENT = 0x00000020;
CreateParams cp = base.CreateParams;
cp.ExStyle |= WS_EX_TRANSPARENT;
return cp;
}
}