Winforms 如何使标签在加载时透明而不闪烁

Winforms 如何使标签在加载时透明而不闪烁,winforms,picturebox,labels,Winforms,Picturebox,Labels,我有一个面板,上面有一个图片盒。我必须在面板中显示大约20个标签。我希望标签的背景是透明的,即在picturebox中显示图像,标签只显示文本。 现在,由于标签不显示真正的透明度,我将标签作为picturebox的子项 this.lbl1.Parent = pictureBox1; 这解决了我眼前的问题,但现在当表单加载时,所有标签都需要一段时间才能显示出来,并且一次只显示一个标签。如果你们能给出一些解决方案,我将不胜感激 提前感谢标签不支持透明度,您必须创建自己独特的自定义控件,您可以看到

我有一个面板,上面有一个图片盒。我必须在面板中显示大约20个标签。我希望标签的背景是透明的,即在picturebox中显示图像,标签只显示文本。 现在,由于标签不显示真正的透明度,我将标签作为picturebox的子项

 this.lbl1.Parent = pictureBox1;
这解决了我眼前的问题,但现在当表单加载时,所有标签都需要一段时间才能显示出来,并且一次只显示一个标签。如果你们能给出一些解决方案,我将不胜感激


提前感谢

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

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


再见

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

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


再见

或者您可以放弃标签,自己绘制文本:

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

或者,您可以放弃标签,自己绘制文本:

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

闪烁的标准治疗方法是双缓冲。但这并不能解决这种闪烁现象。这是另一种,由多个窗口相互重叠引起。每个标签都有自己的窗口。当窗体需要自己绘制时,它会绘制其背景,为子窗口留下孔。然后,每个子窗口轮流绘制自身。他们的孩子们的窗户下一个吸引着他们。等等

当一个控件需要一段时间来绘制时,这一点会变得很明显,毫无疑问,这是您的图片框。尤其是当它显示需要调整大小的大型图像时。当图片框绘制时,子窗口的孔保持未绘制状态。它们的背景为白色,使用窗体的透明键或不透明度属性时为黑色。这可能会与图片框中的图像形成严重对比,用户会将这种效果视为闪烁

一个直接的解决办法是不使用控件,这样你就不用为它们的窗口付费。标签非常方便,但仅仅为了显示字符串而烧掉一个窗口是对系统资源的巨大浪费。您可以简单地实现图片框的绘制事件,并使用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和更高版本支持。小心油漆瑕疵。

治疗闪烁的标准方法是双缓冲。但这并不能解决这种闪烁现象。这是另一种,由多个窗口相互重叠引起。每个标签都有自己的窗口。当窗体需要自己绘制时,它会绘制其背景,为子窗口留下孔。然后,每个子窗口轮流绘制自身。他们的孩子们的窗户下一个吸引着他们。等等

当一个控件需要一段时间来绘制时,这一点会变得很明显,毫无疑问,这是您的图片框。尤其是当它显示需要调整大小的大型图像时。当图片框绘制时,子窗口的孔保持未绘制状态。它们的背景为白色,使用窗体的透明键或不透明度属性时为黑色。这可能会与图片框中的图像形成严重对比,用户会将这种效果视为闪烁

一个直接的解决办法是不使用控件,这样你就不用为它们的窗口付费。标签非常方便,但仅仅为了显示字符串而烧掉一个窗口是对系统资源的巨大浪费。您可以简单地实现图片框的绘制事件,并使用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和更高版本支持。注意绘画作品。

看起来很有希望!让我试着报告:)对于值不会更改但某些标签具有定期更新的值的标签很好。我该怎么做