在 SW_MAXIMIZE 上防止表单调整大小
Prevent Form resize on SW_MAXIMIZE
我想自己模拟 Aero Snap 功能。为了将 Form
粘贴到屏幕一侧,我使用了来自此 question 的解决方案。
问题是我打电话后:
ShowWindow(Handle, SW_MAXIMIZE);
Form
立即最大化并在调用后 MoveWindow
将其大小更改为所需大小。 Form
的这种跳转是可见且烦人的。为了防止它,我试图禁用 WndProc
中消息 WM_GETMINMAXINFO, WM_SIZE, WM_MOVE, WM_NCCALCSIZE, WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANGED
的处理。它有帮助但不完全。 Form
调整大小是否有任何模拟 SuspendLayout()/ResumeLayout()
?
在 WndProc
中禁用消息处理帮助我减少了闪烁(WM_NCPAINT
除外):
bool ignoreMessages = false;
public void DockWindow()
{
ignoreMessages = true;
ShowWindow(handle, SW_MAXIMIZE);
ignoreMessages = false;
MoveWindow(handle, 0, 0, Screen.PrimaryScreen.WorkingArea.Width / 2, Screen.PrimaryScreen.WorkingArea.Height, true);
}
protected override void WndProc(ref Message message)
{
if (ignoreMessages &&
message.Msg != WM_NCPAINT)
return;
base.WndProc(ref message);
}
我想自己模拟 Aero Snap 功能。为了将 Form
粘贴到屏幕一侧,我使用了来自此 question 的解决方案。
问题是我打电话后:
ShowWindow(Handle, SW_MAXIMIZE);
Form
立即最大化并在调用后 MoveWindow
将其大小更改为所需大小。 Form
的这种跳转是可见且烦人的。为了防止它,我试图禁用 WndProc
中消息 WM_GETMINMAXINFO, WM_SIZE, WM_MOVE, WM_NCCALCSIZE, WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANGED
的处理。它有帮助但不完全。 Form
调整大小是否有任何模拟 SuspendLayout()/ResumeLayout()
?
在 WndProc
中禁用消息处理帮助我减少了闪烁(WM_NCPAINT
除外):
bool ignoreMessages = false;
public void DockWindow()
{
ignoreMessages = true;
ShowWindow(handle, SW_MAXIMIZE);
ignoreMessages = false;
MoveWindow(handle, 0, 0, Screen.PrimaryScreen.WorkingArea.Width / 2, Screen.PrimaryScreen.WorkingArea.Height, true);
}
protected override void WndProc(ref Message message)
{
if (ignoreMessages &&
message.Msg != WM_NCPAINT)
return;
base.WndProc(ref message);
}