如何避免在c# Windows窗体中显示MDI子窗体时闪烁
本文关键字:窗体 MDI 闪烁 显示 Windows 何避免 | 更新日期: 2023-09-27 18:03:29
当连接到RDC时,我观察到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;