Управление размещением окон fsMDIChild в Delphi - PullRequest
2 голосов
/ 18 августа 2010

Как мне управлять размещением дочернего окна MDI (FormStyle: = fsMDIChild) в Delphi или C ++ Builder?Я знаю, что могу установить Левый, Верхний, Положение и т. Д., Но, в частности, для дочернего элемента MDI, они не вступают в силу до тех пор, пока окно не будет создано и показано в его расположении по умолчанию.В результате, создание и позиционирование нескольких окон одновременно приводит к значительному мерцанию, поскольку окна создаются в своих положениях по умолчанию, а затем сразу же перемещаются и изменяют размеры.я смог найти переопределить метод CreateParams в TCustomForm и изменить поля X, Y, Width и Height параметра Params, но это похоже на хак.Есть ли более чистый способ сделать это?

Ответы [ 2 ]

2 голосов
/ 18 августа 2010

Вы можете отправлять WM_SETREDRAW сообщения в ClientHandle MainForm, одно с 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 голос
/ 18 августа 2010

Я не наблюдаю мерцания вообще, но это может быть из-за того, что мой компьютер работает слишком быстро или может быть улучшение в Windows 7, чтобы уменьшить мерцание.

Я установил положение дочернего окна MDI на его FormShow:

procedure TForm2.FormShow(Sender: TObject);
begin
  Top := 200;
  Left := 400;
end;
...