使用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”代码来测试它。
答案 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);
然后你应该看到结果(左边的设计时间,右边的运行时间):