如何在Delphi或C ++ Builder中控制MDI子窗口(FormStyle:= fsMDIChild)的位置?我知道我可以设置Left,Top,Position等,但对于MDI子项,这些只有在窗口创建并显示在其默认位置之后才会生效。结果是,在默认位置创建窗口然后立即移动并调整大小,一次创建和定位多个窗口会导致相当多的闪烁。
从深入研究VCL源代码,我能找到的唯一解决方案是覆盖TCustomForm的CreateParams方法并更改Params参数的X,Y,Width和Height字段,但这感觉就像一个黑客。有没有更简洁的方法呢?
答案 0 :(得分:2)
您可以将WM_SETREDRAW
消息发送到MainForm的ClientHandle,其中一个将wParam设置为False,然后将wParam设置为True,以避免在设置MDI子窗口时出现闪烁,例如:
的Delphi:
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);
}
答案 1 :(得分:1)
我发现根本没有闪烁,但这可能是因为我的电脑太快或者在Windows 7中可能是一种改进以减少闪烁。
我在其FormShow上设置了MDI子窗口位置:
procedure TForm2.FormShow(Sender: TObject);
begin
Top := 200;
Left := 400;
end;