3

親ウィンドウ全体ではなく、クライアント領域のみに適合する子ウィンドウを最大化するにはどうすればよいですか?親ウィンドウのメインメニューまたはその他のコントロールの下に子ウィンドウが表示されないようにしたくありません。

私はこのコードを持っています

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;

しかし、それだけでは十分ではありません。ウィンドウは実際には最大化されていません。に変更SW_RESTOREするとSW_MAXIMIZE、子ウィンドウにバグが表示されます。

4

1 に答える 1

2

通常、MDIメインフォームのクライアントスペースは、メニューやバーのないスペースに対して自動的に計算されます。ただし、これらのバーがフォームの端に配置されている場合に限ります。

バーやその他のコントロールが揃っていない場合は、実際に自分で調整する必要があります。WM_NCCALCSIZEフォームのクライアントの長方形の寸法がずれていることをウィンドウに通知するためのハンドル。

または、MDI子ウィンドウのサイズをいつ調整するかを確認できるNLDExtraMDIPropsを見てください。このコンポーネントは、BackgroundPicture、CleverMaximizing、ShowClientEdge、ShowScrollBarsなどのいくつかの追加プロパティを提供します。WM_SYSCOMMANDWParam and $FFF0 = SC_MAXIMIZE

于 2012-02-24T11:36:41.623 に答える