最大化后 WinForms 闪烁 - 双缓冲
WinForms Flickering after Maximizing - Double Buffering
我有一个 "Master" 表单,左侧有导航按钮,右侧有一个面板,用作子表单的支架。这很简单,但代码如下。
public void showForm(Form form)
{
// Disposed Prior Form & Load New
form.Dock = DockStyle.Fill;
form.TopLevel = false;
pnlMain.Controls.Clear();
pnlMain.Controls.Add(form);
form.Show();
}
我遇到的主要问题是一切正常,在从一个表单导航到另一个表单时使用下面的代码几乎没有闪烁,但是一旦我最大化我的 "Master" 表单(在turn 放大 "Child" 表单)...即使我取消最大化并返回到原始大小,当我导航到新表单时它也会开始像疯了似的闪烁。就好像在最大化之后它完全无视最初用于修复闪烁的代码。我还应该提到 "Child" 表单有它自己的表单绘制事件,这就是为什么我有这些东西来减少闪烁,在最大化之前它通常不是问题。
public void drawBackgroundChild(PaintEventArgs e, Form form)
{
// prevents error on resize
if (form.ClientRectangle.Width == 0 || form.ClientRectangle.Height == 0)
return;
using (LinearGradientBrush brush = new LinearGradientBrush(form.ClientRectangle,
UserSettings.secondaryColor1,
UserSettings.secondaryColor2,
90F))
{
e.Graphics.FillRectangle(brush, form.ClientRectangle);
}
}
protected override CreateParams CreateParams
{
get
{
var cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
我在 "Master" 和 "Child" 表单上多次尝试了上面的代码和下面的代码。以多种不同的方式对其进行了测试,但没有运气。有谁知道调整 Windows 表单的大小是否会禁用双缓冲或某种程度的东西?
DoubleBuffered = true;
this.SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor, true);
必须从主窗体中删除任何类型的双缓冲/createparams 等,并将其专门放入子窗体中....
protected override CreateParams CreateParams
{
get
{
var cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
frmChild()
{
ResizeRedraw = true;
this.SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer |
ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor, true);
}
我有一个 "Master" 表单,左侧有导航按钮,右侧有一个面板,用作子表单的支架。这很简单,但代码如下。
public void showForm(Form form)
{
// Disposed Prior Form & Load New
form.Dock = DockStyle.Fill;
form.TopLevel = false;
pnlMain.Controls.Clear();
pnlMain.Controls.Add(form);
form.Show();
}
我遇到的主要问题是一切正常,在从一个表单导航到另一个表单时使用下面的代码几乎没有闪烁,但是一旦我最大化我的 "Master" 表单(在turn 放大 "Child" 表单)...即使我取消最大化并返回到原始大小,当我导航到新表单时它也会开始像疯了似的闪烁。就好像在最大化之后它完全无视最初用于修复闪烁的代码。我还应该提到 "Child" 表单有它自己的表单绘制事件,这就是为什么我有这些东西来减少闪烁,在最大化之前它通常不是问题。
public void drawBackgroundChild(PaintEventArgs e, Form form)
{
// prevents error on resize
if (form.ClientRectangle.Width == 0 || form.ClientRectangle.Height == 0)
return;
using (LinearGradientBrush brush = new LinearGradientBrush(form.ClientRectangle,
UserSettings.secondaryColor1,
UserSettings.secondaryColor2,
90F))
{
e.Graphics.FillRectangle(brush, form.ClientRectangle);
}
}
protected override CreateParams CreateParams
{
get
{
var cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
我在 "Master" 和 "Child" 表单上多次尝试了上面的代码和下面的代码。以多种不同的方式对其进行了测试,但没有运气。有谁知道调整 Windows 表单的大小是否会禁用双缓冲或某种程度的东西?
DoubleBuffered = true;
this.SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor, true);
必须从主窗体中删除任何类型的双缓冲/createparams 等,并将其专门放入子窗体中....
protected override CreateParams CreateParams
{
get
{
var cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
frmChild()
{
ResizeRedraw = true;
this.SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer |
ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor, true);
}