-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

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

为 MDI 子窗口设置AlignorAnchors属性没有任何效果:它们不再是默认 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 回答