在Delphi中控制fsMDIChild窗口的位置

时间:2010-08-17 21:32:26

标签: delphi c++builder mdi mdichild

如何在Delphi或C ++ Builder中控制MDI子窗口(FormStyle:= fsMDIChild)的位置?我知道我可以设置Left,Top,Position等,但对于MDI子项,这些只有在窗口创建并显示在其默认位置之后才会生效。结果是,在默认位置创建窗口然后立即移动并调整大小,一次创建和定位多个窗口会导致相当多的闪烁。

从深入研究VCL源代码,我能找到的唯一解决方案是覆盖TCustomForm的CreateParams方法并更改Params参数的X,Y,Width和Height字段,但这感觉就像一个黑客。有没有更简洁的方法呢?

2 个答案:

答案 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;