Ang*_*ker 22 c# flicker winforms createparams
我有一个应用程序,它有很多控件.并且它有大量的闪烁,特别是在启动时.
我将此修复程序应用于它.
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // WS_EX_COMPOSITED
return cp;
}
}
Run Code Online (Sandbox Code Playgroud)
这很有效 - 闪烁的数量减少了令人难以置信的数量.但是,副作用是当我将鼠标移动或单击它们时,窗口右上角的最小化,最大化和关闭按钮不会生成动画(尽管它们仍在工作).这给了应用程序一种感觉.
如何在保留最大化,最小化和关闭按钮的可用性的同时保留WS_EX_COMPOSITED?
这种情况发生在Windows XP上.正如@fallenidol所指出的,这不是Windows 7上的问题.
Ang*_*ker 14
我想到了.诀窍是在显示表单后删除WS_EX_COMPOSITED标志.我博客上的完整说明和代码:
我知道这个问题有点老了,但迟到总比没有好.我使用了您链接的原始示例来设置一个在调整大小时切换它,然后将其切换回来以完美地绘制其他所有内容.希望它能帮助其他人寻找这个问题的解决方案.正如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;
}
Run Code Online (Sandbox Code Playgroud)