繁体   English   中英

在C#Windows窗体中显示MDI子窗体时如何避免闪烁?

[英]How to avoid flickering when a MDI child form is shown in C# Windows forms?

当连接到RDC时,Iam观察到mdi子窗体的背景图像的闪烁问题。 我该如何避免它们?

我正在使用此代码,根本没有闪烁。

if (!CheckForm(childForm))
        {
            childForm.WindowState = FormWindowState.Minimized; //avoid flickering
            childForm.Show();
            childForm.WindowState = FormWindowState.Normal;
        }
        else
        {
            childForm.BringToFront();
            childForm.WindowState = FormWindowState.Minimized;
            childForm.Activate();
            childForm.WindowState = FormWindowState.Normal;
        }

我知道这是一个非常晚的答案,但由于这里的所有答案(包括被接受的)都没有对闪烁做任何事情,我仍然想发布为我做的事情

首先,我必须这样做

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;

        // reduce flickering when switching mdi child forms (see also WndProc)
        cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED (which is essentially double buffered)

        return cp;
    }
}

但这还不够,我还必须这样做:

protected override void WndProc(ref Message msg)
{
    const int WM_NCPAINT = 0x85;
    const int WM_SIZE = 0x05;

    // reduce flickering when switching mdi child forms (see also CreateParams)
    if (msg.Msg == WM_NCPAINT)
    {
        if (this.WindowState == FormWindowState.Maximized)
            return;
    }

    // reduce flickering when switching mdi child forms (see also CreateParams)
    if (msg.Msg == WM_SIZE)
    {
        if (this.WindowState == FormWindowState.Maximized)
            return;
    }

    base.WndProc(ref msg);
}

我曾经读过某个地方,我可以通过这样做来实现这一切:

this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);

但是当我这样做时,闪烁只会变得更糟。

无论如何,有了这个解决方案(至少在我的mdi项目中),我完全消除了在mdi子窗体之间切换时的闪烁。
希望这可以帮助任何人寻找这个问题。

你试过以下吗?

this.DoubleBuffered = true;

将它放在InitializeComponent之后的构造函数中。

我一直在努力解决同样的问题,并没有找到任何有用的东西,包括form.DoubleBuffered = true。 所以这对我有用

form.WindowState = FormWindowState.Minimized;
form.Show();
form.WindowState = FormWindowState.Maximized;

在设计器方面,将窗体窗口状态保持为“正常”。

我也长期面对这个问题。 我就是这样出来的。 在“填充停靠”模式下打开表单而不是“最大化”。

//childFrm.WindowState = FormWindowState.Maximized;
childFrm.Dock = DockStyle.Fill;

删除MDI表单中的所有背景图像。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM