在Windows窗体应用程序中闪烁

我有一个应用程序,它有很多控件。 并且它有大量的闪烁,特别是在启动时。

我将此修复程序应用于它。

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

这很有效 – 闪烁的数量减少了令人难以置信的数量。 但是,副作用是当我将鼠标移动或单击它们时,窗口右上角的最小化,最大化和关闭按钮不会生成动画(它们仍然有效)。 这给应用程序带来了一种感觉。

如何在保留最大化,最小化和关闭按钮的可用性的同时保留WS_EX_COMPOSITED?

这种情况发生在Windows XP上。 正如@fallenidol所指出的,这不是Windows 7上的问题。

我想到了。 诀窍是在显示表单后删除WS_EX_COMPOSITED标志。 我博客上的完整说明和代码:

如何消除Windows窗体应用程序上的闪烁

我知道这个问题有点老了,但迟到总比没有好。 我使用了您链接的原始示例来设置一个在resize时切换它,然后将其切换回来以完美地绘制其他所有内容。 希望它能帮助其他人寻找这个问题的解决方案。 正如OP所知,DoubleBuffering单独的属性不能解决闪烁问题。

这是一个解决方法,当用户调整表单大小时停止闪烁,但不会搞乱DataGridView,NumericUpDown等控件的绘制。如果您的表单名称是“Form1”:

 int intOriginalExStyle = -1; bool bEnableAntiFlicker = true; public Form1() { ToggleAntiFlicker(false); InitializeComponent(); this.ResizeBegin += new EventHandler(Form1_ResizeBegin); this.ResizeEnd += new EventHandler(Form1_ResizeEnd); } protected override CreateParams CreateParams { get { if (intOriginalExStyle == -1) { intOriginalExStyle = base.CreateParams.ExStyle; } CreateParams cp = base.CreateParams; if (bEnableAntiFlicker) { cp.ExStyle |= 0x02000000; //WS_EX_COMPOSITED } else { cp.ExStyle = intOriginalExStyle; } return cp; } } private void Form1_ResizeBegin(object sender, EventArgs e) { ToggleAntiFlicker(true); } private void Form1_ResizeEnd(object sender, EventArgs e) { ToggleAntiFlicker(false); } private void ToggleAntiFlicker(bool Enable) { bEnableAntiFlicker = Enable; //hacky, but works this.MaximizeBox = true; } 

请尝试以下代码。 这应该在主窗体中以及您拥有的任何其他自定义用户控件中。

  // Enable double duffering to stop flickering. this.SetStyle(ControlStyles.DoubleBuffer, true); this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); this.SetStyle(ControlStyles.UserPaint, true); this.SetStyle(ControlStyles.SupportsTransparentBackColor, false); this.SetStyle(ControlStyles.Opaque, false); this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); this.SetStyle(ControlStyles.ResizeRedraw, true); 

您应该尝试名为DoubleBuffered的标准Windows窗体控件属性。 http://msdn.microsoft.com/en-us/library/system.windows.forms.control.doublebuffered.aspx

我刚看到这篇文章并意识到它有点老了。 但是,我对我的表单有同样的问题并且发现(对于XP,无论如何)一个不优雅的解决方案似乎没有启用视觉样式。