在Windows窗体应用程序中闪烁

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标志.我博客上的完整说明和代码:

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

  • @Hossein同时,请点击此处:https://web.archive.org/web/20160405111506/http://www.angryhacker.com/blog/archive/2010/07/21/how-to-get-rid-的闪烁式窗口,表单applications.aspx (3认同)

Joh*_*uit 8

我知道这个问题有点老了,但迟到总比没有好.我使用了您链接的原始示例来设置一个在调整大小时切换它,然后将其切换回来以完美地绘制其他所有内容.希望它能帮助其他人寻找这个问题的解决方案.正如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)