Delphi:最大化MDI项目中的子窗口

时间:2012-02-27 03:35:32

标签: delphi window mdi childwindow maximize

有一个很好的组件可以最大化客户区中的子窗口(必须保留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)它们对齐到客户区(调整父窗口的大小会导致子客户区域的大小调整)。

我的问题和组件中的代码与图片上的子窗口不一样。

我们可以让窗口真正最大化(不仅仅是对齐)吗?

未最大化(不好;我的问题中的组件和代码在这些图片上最大化):

enter image description here enter image description here

最大化(我需要的):

enter image description here enter image description here

2 个答案:

答案 0 :(得分:6)

我不明白你的问题。最大化MDI子窗口:

  • 以编程方式:使用ShowWindow(ActiveMDIChild.Handle, SW_MAXIMIZE)
  • 手动:点击最大化边框图标,或双击表格标题。

这两项行动都会导致:

  • 子窗口边框消失(折叠到MDI窗体边框),
  • 在主菜单栏中添加小边框图标(对于子窗口)
  • 类似于Align=alClient的调整大小效果。

要限制主窗体中子窗口的可用空间,请确保将窗口控件与窗体边缘对齐。

为MDI子窗口设置AlignAnchors属性无效:它们不再是默认VCL对齐实现的一部分; Windows接管了这项工作。

如果您想干预调整MDI子级的大小,那么处理WM_SIZE是错误的方法,因为该消息是在调整大小后发送的。相反,按我解释here处理WM_SYSCOMMAND

至于你所指的我的组件:

  • 通过单击“最大化”边框图标手动最大化确实完成了:如上所述的默认最大化操作,
  • 通过单击“最大化”边框图标手动最大化 - 按住Shift键 - 会将子窗口的大小调整为MDI窗体中的largest spare space。在这种情况下,调整MDI主窗体的大小不会调整MDI子窗体的大小。

答案 1 :(得分:-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;