如何使标签透明,在加载时没有任何闪烁

时间:2011-07-08 12:28:03

标签: winforms picturebox labels

我有一个小组,我有一个图片框。我将在面板中显示大约20个标签。我希望Label的背景是透明的,即显示图片框中的图像,标签只显示文本。 现在,由于标签没有表现出真正的透明度,因此我将标签作为picturebox的子项

 this.lbl1.Parent = pictureBox1;

这解决了我当前的问题,但现在当表单加载时,所有标签需要一段时间才能显示,并且一次只能执行一次。如果你们能为此提供一些解决方案,我将不胜感激。

提前致谢

3 个答案:

答案 0 :(得分:4)

闪烁的标准治疗方法是双缓冲。但这无法解决这种闪烁问题。它是一种不同的类型,由多个窗口相互重叠引起。每个标签都是自己的窗口。当表单需要自己绘制时,它会绘制背景,为子窗口留下空洞。然后每个子窗口轮流绘制一次。然后他们的儿童窗户自己画画。等等。

当一个控件需要一段时间绘制时,这一点变得明显,毫无疑问是你的图片框。特别是当它显示需要调整大小的大图像时。当图片框绘制时,儿童窗户的孔保持未上漆。当您使用表单的TransparencyKey或Opacity属性时,它们具有白色背景,黑色。这可能与图片框中的图像形成鲜明对比,用户将该效果视为闪烁效果。

一个直接的解决方法是不使用控件,因此您不需要支付窗口费用。标签非常方便,但是为了显示字符串而烧毁窗口是一个巨大的系统资源浪费。您可以简单地实现图片框'Paint事件并使用TextRenderer.DrawText()绘制字符串。 PictureBox默认启用双缓冲,因此图像和文本绘制完全平滑,不再闪烁。明显的缺点是你失去了点击的便利,你必须编写代码。

还有其他可能的修复方法。其中之一是防止图片框为子窗口留下孔。它将绘制整个图像,标签弹出它们。那仍然是闪烁但不是那么引人注目。在项目中添加一个新类并粘贴此代码:

using System;
using System.Windows.Forms;

internal class MyPictureBox : PictureBox {
    protected override CreateParams CreateParams {
        get {
            var parms = base.CreateParams;
            parms.Style &= ~0x02000000;  // Turn off WS_CLIPCHILDREN
            return parms;
        }
    }
}

将新图片框控件从工具箱顶部编译并拖放到表单上。

另一种可能的解决方法是使表单及其所有子项双重缓冲。这根本不会加速绘画,但所有窗口都会渲染到内存缓冲区中,结果会显示在屏幕上。您会注意到延迟,但窗口突然弹出窗口。这称为合成。 Winforms不直接支持此功能,因为它可能有副作用,但很容易启用。将此代码粘贴到表单类中:

protected override CreateParams CreateParams {
    get {
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED
        return cp;
    }
} 

XP及更高版本支持。注意绘画文物。

答案 1 :(得分:1)

或者你可以抛弃标签并自己绘制文字:

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
  TextRenderer.DrawText(e.Graphics, "Label1", SystemFonts.DefaultFont,
                        new Point(10, 10), Color.Black, Color.Empty);
}

答案 2 :(得分:0)

标签不支持透明度,您必须创建自己独特的自定义控件,您可以看到这些代码示例。

http://www.codeproject.com/KB/dotnet/transparent_controls_net.aspx http://www.codeproject.com/KB/vb/uLabelX.aspx

再见