调整大小时无闪烁的表单行为 - 不再重绘

时间:2017-05-23 11:57:47

标签: c# winforms

我正在尝试在调整大小时使表单无闪烁。我使用推荐的方式发送WM_SETREDRAW

protected override void OnResizeBegin(EventArgs e)
{
  //LockWindowUpdate(this.Handle);
  SendMessage(this.Handle, WM_SETREDRAW, false, 0);
  base.OnResizeBegin(e);
}

protected override void OnResizeEnd(EventArgs e)
{
  base.OnResizeEnd(e);
  SendMessage(this.Handle, WM_SETREDRAW, true, 0);
  //LockWindowUpdate(IntPtr.Zero);
}

private const int WM_SETREDRAW = 11;

[DllImport("user32.dll")]
private static extern bool LockWindowUpdate(IntPtr windowHandle);

[DllImport("user32.dll")]
private static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParam);

但它并没有达到我的目的。当我展开表单时,额外的大小变成黑色区域,当我结束调整大小时会重新绘制:

Image expanded

同样,当我缩小表单时,其内容会被剪切并在我结束调整大小后重新计算:

Image shrunk

我想阻止这些中间行为,例如在重新调整大小时仅重新绘制具有新大小的矩形,但除此之外,表单区域应该保持不变,直到我结束调整大小 - 在SplitContainer中移动拆分器时会出现类似的行为控制。

有没有办法在WinForms中为Form执行此操作?

1 个答案:

答案 0 :(得分:0)

我实际上设法解决了这个问题。

解决方案涉及重写WndProc以手动将SPI_SETDRAGFULLWINDOWS设置为0,然后在完成调整大小时重置。此外,还为表单重写了CreateParams以设置标志WS_EX_COMPOSITED。 WM_SETREDRAW也会在开始和结束时调整大小。结合这三种方法给了我想要的结果。