涂漆形式的透明控件

时间:2011-06-09 15:15:43

标签: c# winforms gdi

使用C#WinForms我有一个表单,我正在绘制渐变背景,从淡蓝色到深蓝色。我有一些按钮和几个标签,我已经尝试将背景设置为透明,因为我希望背景显示 - 特别是对于标签,但这不是似乎工作。

但是我注意到这幅画也使标签变得痛苦,即使代码只在form_paint事件上。

如何使标签不包含相同的等级阴影,但要透明?例如表格顶部的标签为浅蓝色,底部的标签为深蓝色。

private void frmOptions_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
    Rectangle rectangle = e.ClipRectangle;

    using (Brush aBrush = new LinearGradientBrush(rectangle, Color.LightBlue, Color.DarkBlue, LinearGradientMode.Vertical))
    {
        e.Graphics.FillRectangle(aBrush, rectangle);
    }
}

非常感谢您提供任何帮助。

修改 我刚刚通过代码行来调试它,并注意到在表单上为EACH对象调用了paint事件 - 标签&按钮,上面第2行的矩形每次都有大小。所以我现在真的很困惑,为什么要为表单上的每个对象调用它。

编辑2: 刚刚单步执行我的快速测试项目的代码(请参阅下面的评论),并且还注意到为每个对象调用了paint事件。不同之处在于测试项目没有“Rectangle rectangle = e.ClipRectangle;” - 它基本上使用了宽度和宽度。形式的高度。上面我的代码将矩形设置为ClipRectangle - 这是每个标签的大小&按钮...这是正常行为吗?如果是这样,那么看起来我需要通过Reniuz得到以下答案。

编辑3 我已经将cliprectangle行更改为“Rectangle rectangle = new Rectangle(0, 0, this.Width, this.Height);”这似乎使透明看起来应该如何,但仍然为表单上的每个对象调用paint事件 - 干得好,只有7个,所以它正在绘制8次:(想想我仍然会看“TransparentLabel”代码来测试它。

1 个答案:

答案 0 :(得分:3)

查看this文章。

编辑:

您也可以使用此代码:

public class TransparentLabel : Control
{
    public TransparentLabel(Label label)
    {
        //setting default properties
        this.Text = label.Text;
        this.Font = label.Font;
        this.Location = label.Location;
        this.Size = label.Size;
        this.Parent = label.Parent;
        this.BringToFront();
        label.Dispose();

        TabStop = false;
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x20;
            return cp;
        }
    }

    protected override void OnPaintBackground(PaintEventArgs e)
    {
        // do nothing
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        DrawText();
    }

    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
        if(m.Msg == 0x000F)
        {
            DrawText();
        }
    }

    private void DrawText()
    {
        using(Graphics graphics = CreateGraphics())
        using(SolidBrush brush = new SolidBrush(ForeColor))
        {
            SizeF size = graphics.MeasureString(Text, Font);

            // first figure out the top
            float top = 0;
            switch(textAlign)
            {
                case ContentAlignment.MiddleLeft:
                case ContentAlignment.MiddleCenter:
                case ContentAlignment.MiddleRight:
                    top = (Height - size.Height) / 2;
                    break;
                case ContentAlignment.BottomLeft:
                case ContentAlignment.BottomCenter:
                case ContentAlignment.BottomRight:
                    top = Height - size.Height;
                    break;
            }

            float left = -1;
            switch(textAlign)
            {
                case ContentAlignment.TopLeft:
                case ContentAlignment.MiddleLeft:
                case ContentAlignment.BottomLeft:
                    if(RightToLeft == RightToLeft.Yes)
                        left = Width - size.Width;
                    else
                        left = -1;
                    break;
                case ContentAlignment.TopCenter:
                case ContentAlignment.MiddleCenter:
                case ContentAlignment.BottomCenter:
                    left = (Width - size.Width) / 2;
                    break;
                case ContentAlignment.TopRight:
                case ContentAlignment.MiddleRight:
                case ContentAlignment.BottomRight:
                    if(RightToLeft == RightToLeft.Yes)
                        left = -1;
                    else
                        left = Width - size.Width;
                    break;
            }
            graphics.DrawString(Text, Font, brush, left, top);
        }
    }

    public override string Text
    {
        get
        {
            return base.Text;
        }
        set
        {
            base.Text = value;
            RecreateHandle();
        }
    }

    public override RightToLeft RightToLeft
    {
        get
        {
            return base.RightToLeft;
        }
        set
        {
            base.RightToLeft = value;
            RecreateHandle();
        }
    }

    public override Font Font
    {
        get
        {
            return base.Font;
        }
        set
        {
            base.Font = value;
            RecreateHandle();
        }
    }

    private ContentAlignment textAlign = ContentAlignment.TopLeft;
    public ContentAlignment TextAlign
    {
        get { return textAlign; }
        set
        {
            textAlign = value;
            RecreateHandle();
        }
    }
}

透明标签将替换您现有的标签,以便您可以像这样使用它:

TransparentLabel transparentLabel1 = new TransparentLabel(label1);
TransparentLabel transparentLabel2 = new TransparentLabel(label2);

然后你应该看到结果(左边的设计时间,右边的运行时间):

labels