我想在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);
}
}
我遇到的另一个问题是,无论我更改设置,标签都是黑色的。 我不知道原因是什么。任何人都可以帮助我吗?
答案 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,这是他们决定隐藏属性的可能原因。您也可以覆盖它,如果您愿意,您现在知道如何做到这一点:)