[英]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.