2

Delphi または C++Builder で MDI 子ウィンドウ (FormStyle := fsMDIChild) の配置を制御するにはどうすればよいですか? Left、Top、Position などを設定できることはわかっていますが、特に MDI 子の場合、これらはウィンドウが作成されてデフォルトの場所に表示されるまで有効になりません。その結果、複数のウィンドウを一度に作成して配置すると、ウィンドウがデフォルトの位置に作成され、すぐに移動およびサイズ変更されるため、かなりのちらつきが発生します。

VCL ソースを掘り下げた結果、TCustomForm の CreateParams メソッドをオーバーライドし、Params パラメータの X、Y、Width、および Height フィールドを変更することしか解決策を見つけることができませんでしたが、それはハックのように感じます。これを行うよりクリーンな方法はありますか?

4

2 に答える 2

2

WM_SETREDRAWメインフォームのClientHandleにメッセージを送信できます。1つは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);
}
于 2010-08-18T01:00:06.417 に答える
1

ちらつきはまったく見られませんが、これはコンピューターが速すぎるためか、ちらつきを減らすために Windows 7 で改善された可能性があります。

FormShow で MDI 子ウィンドウの位置を設定します。

procedure TForm2.FormShow(Sender: TObject);
begin
  Top := 200;
  Left := 400;
end;
于 2010-08-17T21:37:47.407 に答える