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

本文关键字:窗体 MDI 闪烁 显示 Windows 何避免 | 更新日期: 2023-09-27 18:03:29

当连接到RDC时,我观察到mdi子窗体的背景图像闪烁问题。我怎样才能避免它们呢?

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

我知道这是一个很晚的回答,但由于这里的所有答案(包括接受的)都没有做任何反对闪烁的事情,我仍然喜欢张贴为我做了什么

首先,我要做这个

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之后的构造函数中

我正在使用这个代码,没有闪烁。

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;
        }

我也一直在努力解决同样的问题,没有找到任何工作,包括形式。DoubleBuffered = true。这就是对我有用的

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

在设计器端,将窗体状态设置为Normal

我也曾长期面临这个问题。我就是这样出来的。在填充码头模式下打开表单,而不是最大化模式。

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