我正在尝试在调整大小时使表单无闪烁。我使用推荐的方式发送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);
但它并没有达到我的目的。当我展开表单时,额外的大小变成黑色区域,当我结束调整大小时会重新绘制:
同样,当我缩小表单时,其内容会被剪切并在我结束调整大小后重新计算:
我想阻止这些中间行为,例如在重新调整大小时仅重新绘制具有新大小的矩形,但除此之外,表单区域应该保持不变,直到我结束调整大小 - 在SplitContainer中移动拆分器时会出现类似的行为控制。
有没有办法在WinForms中为Form执行此操作?
答案 0 :(得分:0)
我实际上设法解决了这个问题。
解决方案涉及重写WndProc以手动将SPI_SETDRAGFULLWINDOWS设置为0,然后在完成调整大小时重置。此外,还为表单重写了CreateParams以设置标志WS_EX_COMPOSITED。 WM_SETREDRAW也会在开始和结束时调整大小。结合这三种方法给了我想要的结果。