Winforms 如何使标签在加载时透明而不闪烁
我有一个面板,上面有一个图片盒。我必须在面板中显示大约20个标签。我希望标签的背景是透明的,即在picturebox中显示图像,标签只显示文本。 现在,由于标签不显示真正的透明度,我将标签作为picturebox的子项Winforms 如何使标签在加载时透明而不闪烁,winforms,picturebox,labels,Winforms,Picturebox,Labels,我有一个面板,上面有一个图片盒。我必须在面板中显示大约20个标签。我希望标签的背景是透明的,即在picturebox中显示图像,标签只显示文本。 现在,由于标签不显示真正的透明度,我将标签作为picturebox的子项 this.lbl1.Parent = pictureBox1; 这解决了我眼前的问题,但现在当表单加载时,所有标签都需要一段时间才能显示出来,并且一次只显示一个标签。如果你们能给出一些解决方案,我将不胜感激 提前感谢标签不支持透明度,您必须创建自己独特的自定义控件,您可以看到
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和更高版本支持。注意绘画作品。看起来很有希望!让我试着报告:)对于值不会更改但某些标签具有定期更新的值的标签很好。我该怎么做