新答案:覆盖 WndProc 并在应用新的 Window 属性时阻止 WM_PAINT 消息。
旧答案:覆盖 WndProc,并阻止WM_ERASEBKGND
消息。
解释以下代码的作用:
当窗口的区域无效时,Windows 会向控件发送一系列消息,从而生成新绘制的小部件。本系列的早期信息是WM_ERASEBKGND
. 通常,为响应此消息,控件会将自身绘制为纯色。稍后,为了响应WM_PAINT
消息(通常由我们在 OnPaint 事件中使用),实际的绘图就完成了。如果这个绘图很重要,在小部件更新之前会有延迟,你会得到一个恼人的闪烁。
再次查看您的代码,我显然正在解决一个不同的问题。试试这个新的例子。bAllowPaint
如果未设置标志,它将阻止窗体/控件的绘制。
新示例:
private const int WM_PAINT = 0x000F;
protected override void WndProc(ref Message m)
{
if ((m.Msg != WM_PAINT) ||
(bAllowPaint && m.Msg == WM_PAINT))
{
base.WndProc(ref m);
}
}
旧示例:
private const int WM_ERASEBKGND = 0x0014;
protected override void WndProc(ref Message m)
{
if (m.Msg != WM_ERASEBKGND) // ignore WM_ERASEBKGND
{
base.WndProc(ref m);
}
}