WinForm:如何实现具有正确背景颜色的按钮

时间:2015-03-25 00:05:42

标签: c# winforms

我正在使用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();

好的,当在图片框上只显示一个按钮时,背景按钮是透明的(如我所愿),如下所示:

enter image description here

但是如果我想在旁边显示两个或更多按钮,背景按钮是白色的不透明,如下所示:

enter image description here

我使用无效的图片框并尝试使用无效按钮,但是没有解决这个问题。

2 个答案:

答案 0 :(得分:3)

WinForms不支持组件的真正Z排序;窗口控件(例如ButtonUserControl)不能具有真正的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;
        }
    }