C#Windows表单标签BackgroundImage

时间:2014-10-15 06:33:45

标签: c# winforms label

我想在Label上设置背景图片。 我发现Microsoft不允许这样做。但是,我想通过自我实现。 代码在下面,问题是如何以编程方式设置背景图像? 仍然没有BackgroundImage属性可供设置。

class BackgroundImageLabel : Label
{
    public BackgroundImageLabel()
    {

    }

    protected override void OnPaintBackground(PaintEventArgs e)
    {
        return;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        //is BackGroundImage null
        if (this.BackgroundImage != null)
        {

                e.Graphics.DrawImage(this.BackgroundImage, new System.Drawing.Rectangle(0, 0, this.Width, this.Height),
                this.Location.X, this.Location.Y, this.Width, this.Height,
                   System.Drawing.GraphicsUnit.Pixel);      
        }

        e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
        SolidBrush drawBrush = new SolidBrush(this.ForeColor);
        e.Graphics.DrawString(this.Text, this.Font, drawBrush, new System.Drawing.Rectangle(0, 0, this.Width, this.Height));
        //base.OnPaint(e);
    }
}

修改

我遇到的另一个问题是,无论我更改设置,标签都是黑色的。 我不知道原因是什么。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

Label已经具有BackgroundImage属性。但它被描述为"不打算直接在您的代码中使用"。所以你可能需要为自己的财产提供另一个名字。

我认为问题在于OnPaint永远不会被调用。为了使这项工作添加

SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint);

到你的构造函数。

答案 1 :(得分:2)

BackgroundImage属性由Control类(Label的基类)实现。因此,每个控件都能够拥有背景图像。但是正如您可以从Label在设计器中的行为方式看出来的那样,他们通过修改使其无法使用。

你想知道他们用它做了什么。您可以使用反编译器执行此操作,但今天最好使用Reference Source。一个非常灵活的网站,允许您轻松浏览.NET Framework中的源代码。键入" Label.BackgroundImage"在搜索框中。

你会发现没有发生任何特别严重的事情,它只是获得了隐藏财产的几个属性。所以你要做的第一件事就是自己覆盖BackgroundImage并再次取消这些属性:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

class BackgroundImageLabel : Label {
    [Browsable(true), EditorBrowsable(EditorBrowsableState.Always),
     DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    public override Image BackgroundImage {
        get {
            return base.BackgroundImage;
        }
        set {
            base.BackgroundImage = value;
        }
    }
}

宾果,工作正常。

您必须将AutoSize属性设置为False,这是他们决定隐藏属性的可能原因。您也可以覆盖它,如果您愿意,您现在知道如何做到这一点:)