C# Windows窗体选项卡控件随背景闪烁

C# Windows窗体选项卡控件随背景闪烁,c#,vb.net,tabcontrol,windows-forms-designer,C#,Vb.net,Tabcontrol,Windows Forms Designer,我在windows窗体上有一个面板。表单根据其单击的按钮加载到面板中。加载到面板中的其中一个表单具有选项卡控件。表单的背景是一个图像,每当我在选项卡之间切换时,表单就会闪烁。当我将背景图像设置为“无”或纯色时,效果很好,因此它必须是图像。这有什么办法吗?提前感谢。查看图像和/或选项卡控件/ 如果将其设置为true,闪烁可能会停止。图像的绘制成本很高,尤其是在窗体背景上。我发现唯一有帮助的方法是将BackgroundImageLayout设置为None,这有助于减少我开发的应用程序中的闪烁 您也可

我在windows窗体上有一个面板。表单根据其单击的按钮加载到面板中。加载到面板中的其中一个表单具有选项卡控件。表单的背景是一个图像,每当我在选项卡之间切换时,表单就会闪烁。当我将背景图像设置为“无”或纯色时,效果很好,因此它必须是图像。这有什么办法吗?提前感谢。

查看
图像
和/或
选项卡控件
/


如果将其设置为true,闪烁可能会停止。

图像的绘制成本很高,尤其是在窗体背景上。我发现唯一有帮助的方法是将
BackgroundImageLayout
设置为
None
,这有助于减少我开发的应用程序中的闪烁

您也可以尝试将
DoubleBuffered
属性设置为
true
,但我不确定您将从中获得多少里程


问题在于,当放置在表单上的控件必须重新绘制时(如在更改选项卡页面时),该控件下的所有内容也必须重新绘制。这会导致表单背景无效并重新绘制,有时会在多个控件上发生多次无效(它们不会批处理)

要解决关于转换为PArgb32的后续问题,下面的代码将完成以下步骤:

using System.Drawing;
using System.Drawing.Imaging;

Bitmap originalBmp;
var converted = new Bitmap(originalBmp.Width, originalBmp.Height, PixelFormat.Format32bppPArgb);
using (var g = Graphics.FromImage(converted))
{
    g.DrawImage(0, 0, originalBmp);
}

您仍然需要使用双缓冲控件来减少闪烁,但将图像转换为PArgb32应该会大大加快绘图速度。

您可以使用无闪烁选项卡面板来解决此问题:

以下是面板控制的示例代码:

public partial class NonFlickerPanel : Panel
{
   public NonFlickerPanel() : base()
   {
          this.SetStyle(ControlStyles.AllPaintingInWmPaint,
                              ControlStyles.UserPaint 
                              ControlStyles.OptimizedDoubleBuffer, 
                              true);
   }
}

所以每次点击选项卡时,表单都必须在表单上重新绘制背景图像?我试图在开始时设置我的背景图像,并用透明的背景调用我的所有表单,但我没有做到这一点。这个理论是正确的,但是创建一个透明的表单似乎是不可能的。你可以创建透明表单(使用
Opacity
属性)或形状表单(搜索谷歌)。但是,是的,每次点击一个标签,表单都会失效(带有区域,但会进入脏细节),因此它必须重新绘制背景,通常是多次(这就是为什么它会闪烁,而不仅仅闪烁一次)我认为最好的方法是在启动时设置背景图像,这样只需创建一次,而不是每次加载表单时。我尝试使用不透明属性,但从来没有任何运气与他们。double buffer属性似乎与backgroundimagelayout=none一样有帮助。如果我能让透明窗体在图像上工作,它可能会解决这个问题。另外,请注意,当像素格式不是PArgb32时,图像的绘制速度要慢得多。将图像转换为PArgb32可以将绘图速度提高10倍。它可能还需要不缩放以获得全面的性能优势。你们中的任何人都有一个示例代码或网站,我可以将图像转换为PArgb32。看来这可能会有很大帮助。谢谢。双重缓冲应该足够了。试着让图像有正确的大小,并使其为32bpp。嗯,我的水晶球说,它是选项卡控件闪烁。它对选项卡条使用透明度,您可以看到选项卡后面的表单。对于背景图像来说,这会很昂贵,而且图像的像素格式很差,或者需要大幅重新缩放才能适应。双缓冲不能解决这一问题,您需要预先缩放图像。使用32bppPArgb使其速度更快。我的应用程序因surface pro和windows desktop而异,因此我几乎必须将背景图像布局设置为“拉伸”,否则设置为“无”会很好。doubleBuffered属性似乎很有帮助,并将获得反馈。32bppPArg到底是什么?我如何将其转换为它?以前从没听说过这么做谢谢!谢谢你的回答,我也不知道你为什么有负面评论