gpt4 book ai didi

c# - 绘制窗体上的透明控件

转载 作者:行者123 更新时间:2023-11-30 15:44:05 25 4
gpt4 key购买 nike

我使用 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);
}
}

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

编辑:我刚刚逐步调试代码行,注意到正在为表单上的每个对象调用绘画事件 - 标签和按钮,上面第 2 行的矩形具有每次的大小。所以我现在真的很困惑为什么要为表单上的每个对象调用它。

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

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

最佳答案

看看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

关于c# - 绘制窗体上的透明控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6295146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com