有一个很好的组件可以最大化客户区中的子窗口(必须保留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)它们对齐到客户区(调整父窗口的大小会导致子客户区域的大小调整)。
我的问题和组件中的代码与图片上的子窗口不一样。
我们可以让窗口真正最大化(不仅仅是对齐)吗?
未最大化(不好;我的问题中的组件和代码在这些图片上最大化):
最大化(我需要的):
答案 0 :(得分:6)
我不明白你的问题。最大化MDI子窗口:
ShowWindow(ActiveMDIChild.Handle, SW_MAXIMIZE)
,这两项行动都会导致:
Align=alClient
的调整大小效果。要限制主窗体中子窗口的可用空间,请确保将窗口控件与窗体边缘对齐。
为MDI子窗口设置Align
或Anchors
属性无效:它们不再是默认VCL对齐实现的一部分; Windows接管了这项工作。
如果您想干预调整MDI子级的大小,那么处理WM_SIZE
是错误的方法,因为该消息是在调整大小后发送的。相反,按我解释here处理WM_SYSCOMMAND
。
至于你所指的我的组件:
答案 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;