Delphi:MDI应用程序中最大化的子表单

时间:2012-02-24 09:15:07

标签: delphi border mdi maximize

如何最大化仅适合客户区但不适合整个父窗口的子窗口?我不希望子窗口在主窗口或父窗口的其他控件下消失。

我有这段代码

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,则子窗口会显示错误。

1 个答案:

答案 0 :(得分:2)

通常情况下,MDI主窗体的客户端空间应自动计算到没有菜单或条形的空间,前提是这些条形对齐到窗体的边缘。

当条形图或其他控件未对齐时,您确实需要自行调整。处理WM_NCCALCSIZE以告诉窗口您的表单偏离客户端矩形尺寸。

或者当WM_SYSCOMMAND调整MDI子窗口的大小时,查看NLDExtraMDIProps我抓住WParam and $FFF0 = SC_MAXIMIZE的内容。该组件提供了一些额外的属性,如:BackgroundPicture,CleverMaximizing,ShowClientEdge和ShowScrollBars。