-2

クライアント領域の子ウィンドウを最大化するための優れたコンポーネントがあります(Shiftキーを押したままにする必要があります)-NLDExtraMDIProps

または、次のコードを使用できます。

procedure WMSIZE(var Msg: TMessage); message WM_SIZE;

procedure TForm2.WMSIZE(var Msg: TMessage);
begin
  inherited;
  if Msg.WParam = SIZE_MAXIMIZED then
  begin
    ShowWindow(Handle, SW_RESTORE);
    Left := 0;
    Top := 0;
    Width := Form1.ClientWidth - 4; // The BORDER
    Height := Form1.ClientHeight - 4;
  end;
end;

しかし、最大化は実際の最大化ではありません。子ウィンドウは、クライアント領域にのみ配置されます。親ウィンドウのサイズが変更されたときに、自動的にサイズ変更してクライアント領域に合わせる必要があります。システムの最大化/復元ボタンを変更する必要があります。

以下に説明する効果を達成しようとしています。

写真でわかるように、子ウィンドウは最大化され、

  1. 親ウィンドウ全体を取得するわけではありません(クライアント領域のみ)。

  2. それらは最大化されているため、キャプション/タイトルバー上に移動することはできません

  3. 最大化ボタンではなく、復元ボタンがあります。

  4. それらはクライアント領域に揃えられます(親ウィンドウのサイズを変更すると、クライアント領域内の子ウィンドウのサイズが変更されます)。

私の質問のコードとコンポーネントは、写真の子ウィンドウのようには機能しません。

ウィンドウを本当に最大化することができますか(整列するだけではありません)?

最大化されていません(良くありません。私の質問のコンポーネントとコードは、これらの写真のように最大化されています):

ここに画像の説明を入力してください ここに画像の説明を入力してください

最大化(私が必要なもの):

ここに画像の説明を入力してください ここに画像の説明を入力してください

4

2 に答える 2

6

私はあなたの問題を理解していません。MDI子ウィンドウの最大化が行われます。

  • プログラムで:を使用してShowWindow(ActiveMDIChild.Handle, SW_MAXIMIZE)
  • 手動:[境界線の最大化]アイコンをクリックするか、フォームのキャプションをダブルクリックします。

これらのアクションは両方とも、次の結果になります。

  • 子ウィンドウの境界線の消失(MDIフォームの境界線に折りたたまれます)、
  • メインメニューバーへの小さな境界線アイコン(子ウィンドウ用)の追加、
  • と同様のサイズ変更効果Align=alClient

メインフォーム内の子ウィンドウに使用できるスペースを制限するには、ウィンドウコントロールをフォームの端に揃えてください。

AlignMDI子ウィンドウのまたはプロパティを設定しAnchorsても効果はありません。これらはデフォルトのVCLアラインメント実装の一部ではなくなりました。Windowsがその仕事を引き継ぎました。

MDI子のサイズ変更に介入したい場合、WM_SIZEそのメッセージはサイズ変更後に送信されるため、処理は間違ったアプローチです。代わりに、ここでWM_SYSCOMMAND説明したように処理してください。

あなたが参照している私のコンポーネントについては:

  • [境界線の最大化]アイコンをクリックして手動で最大化すると、まさにそれが実行されます。上記で概説したデフォルトの最大化操作です。
  • Shiftキーを押しながら[境界線の最大化]アイコンをクリックして手動で最大化すると、子ウィンドウのサイズがMDIフォーム内の最大のスペアスペースに変更されます。この場合、MDIメインフォームのサイズを変更しても、MDI子フォームのサイズは変更されません。
于 2012-02-27T03:59:11.090 に答える
-1
if (Msg.WParam = SIZE_MAXIMIZED) then
  begin
    Left := 0;
    Top := 0;
    Width := frmMain.ClientWidth - 4;
    Height := frmMain.ClientHeight - 4;
    SendMessage(Handle, WM_SIZE, SIZE_RESTORED, 0);
  end;
于 2014-02-05T10:37:02.483 に答える