【发布时间】:2015-12-05 15:02:13
【问题描述】:
我编写了一个支持透明背景(除其他外)的用户控件。
但是,我发现了一个问题,当背景是透明的,并且您更改了用户控件的文本时,以前的文本仍然显示在屏幕上,在新文本下方,无法阅读。
我已经在谷歌上搜索了半天,发现各种在我的情况下不起作用的建议,其中大多数涉及将父控件绘制到位图上并在我的控件表面上绘制该位图。
但是,在我的情况下,父控件也是透明的,所以我尝试像建议的here 一样提升到表单的级别,但我得到了一个 InvalidArgumentException,
我试过像建议的here 那样使父控件无效,但也没有运气。
我的代码基本上是这样的(截断到最低限度):
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x20;
return cp;
}
}
protected override void OnPaintBackground(PaintEventArgs e)
{
if(this.BackColor != Color.Transparent)
{
base.OnPaintBackground(e);
}
}
【问题讨论】:
-
Winforms /sigh... 您可以尝试使所有控件无效(
form.Invalidate()),但这会导致大量闪烁。然后您将尝试减少闪烁(双缓冲、位图等)。然后你切换到 wpf。 -
@Sinatr 我很想转wpf,不幸的是我的老板似乎认为学习曲线太长,项目的截止日期太短......还有其他建议吗?
-
您没有重新绘制背景,因此没有过度绘制旧文本的像素。所以这完全是意料之中的。 UserControl 对透明度的支持很好,只需将其 BackColor 设置为透明即可。删除您发布的两种方法。在透明背景上绘制文本通常是不明智的,抗锯齿像素会出现错误的颜色,使文本看起来非常难看。最好用“blobby”来形容。您必须使用 TextRenderingHint.SingleBitPerPixelGridFit 来避免这种情况。
-
为什么首先需要透明度?也许您可以将它们组合成一个控件并完全控制
Paint,而不是在某些东西上使用控件? -
@HansPassant:我已经知道这是保留旧文本的原因(抱歉在我的问题中忘记提及它)。我试图删除 CreateParams 和 OnPaintBackground 的覆盖,但它在显示中给了我很差的结果。无论如何,由于 Sinatr 的第一条评论和this answer,我想我已经找到了解决方案。很快就会发布答案
标签: c# winforms user-controls transparency