如何在 Delphi 或 C++Builder 中控制 MDI 子窗口 (FormStyle := fsMDIChild) 的放置?我知道我可以设置“Left”、“Top”、“Position”等,但特别是对于 MDI 子项,这些设置只有在窗口创建并显示在其默认位置之后才会生效。结果是,同时创建和定位多个窗口会导致相当多的闪烁,因为窗口是在默认位置创建的,然后立即移动并调整大小。
通过深入研究 VCL 源代码,我找到的唯一解决方案是重写 TCustomForm 的 CreateParams 方法并更改 Params 参数的 X、Y、宽度和高度字段,但这感觉像是一种 hack。有没有更干净的方法来做到这一点?
最佳答案
您可以向 MainForm 的 ClientHandle 发送 WM_SETREDRAW
消息,先将 wParam 设置为 False,然后再将 wParam 设置为 True,以避免在设置 MDI 子窗口时出现闪烁,例如:
德尔福:
SendMessage(Application.MainForm.ClientHandle, WM_SETREDRAW, False, 0);
try
Child := TChildForm.Create(Self);
Child.Left := ...;
Child.Top := ...;
Child.Show;
finally
SendMessage(Application.MainForm.ClientHandle, WM_SETREDRAW, True, 0);
InvalidateRect(Application.MainForm.ClientHandle, nil, True);
end;
C++:
SendMessage(Application->MainForm->ClientHandle, WM_SETREDRAW, FALSE, 0);
try
{
Child = new TChildForm(this);
Child->Left = ...;
Child->Top = ...;
Child->Show();
}
__finally
{
SendMessage(Application->MainForm->ClientHandle, WM_SETREDRAW, TRUE, 0);
InvalidateRect(Application->MainForm->ClientHandle, NULL, TRUE);
}
关于delphi - 在 Delphi 中控制 fsMDIChild 窗口的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3507144/