我发现当我采用仅包含功能区和状态栏的简单表单时,它会被截断。您在状态栏上方看到的控件后来被删除。无论碰巧存在什么控制,都会发生相同的截止。后来我删除了状态栏并在那里放置了一个备忘录控件,结果相同。
没有丝带栏:(
来源:xrw.bc.ca)
带丝带栏:(
来源:xrw.bc.ca)
我已经用边缘的一些 2、4 和 8 像素来说明这一点。
正如 Chris Lively 在下面所说,显然是对尺寸的错误计算。我该如何纠正这个?
谢谢您的意见!
我误解了我之前的答案的问题。
对于这个计算错误的问题,我可以(很快)想出一个解决方法。
您可以使用带有 SC_MAXIMIZE wParam 参数的 WM_SYSCOMMAND 的自定义消息处理程序。然后,您可以使用以下方法调整表单大小:
type
TForm1 = class(TForm)
// other stuff
procedure WMSyscommand(var Msg: TWMSYSCOMMAND); message WM_SYSCOMMAND;
procedure TForm1.WMSysCommand(var Msg: TWMSYSCOMMAND);
var
R: TRect;
begin
// Test for SC_MAXIMIZE. If found...
if Msg.CmdType = SC_MAXIMIZE then
begin
SystemParametersInfo(SPI_GETWORKAREA, 0, @R, 0);
Top := R.Top;
Left := R.Left;
Width := R.Right - R.Left;
Height := R.Bottom - R.Top;
Msg.Result := 0; // Message handled
end
else
DefaultHandler(Msg);
end;
上面的代码(在启用 Aero/Glass 的 Vista 32 位家庭高级版上测试)工作正常。
Ken White 提出的解决方案有几个问题:
所以我提出以下建议:
// add to form object
procedure WMGetMinMaxInfo(var mmInfo : TWMGETMINMAXINFO); message WM_GETMINMAXINFO;
// implementation
procedure TfrmMain.WMGetMinMaxInfo(var mmInfo: TWMGETMINMAXINFO);
var
R: TRect;
begin
with mmInfo.MinMaxInfo^ do
begin
SystemParametersInfo(SPI_GETWORKAREA, 0, @R, 0);
ptMaxPosition.X := R.Left;
ptMaxPosition.Y := R.Top;
ptMaxSize.X := R.Right - R.Left;
ptMaxSize.Y := R.Bottom - R.Top-1;
end;
end;
不理想,因为我必须(出于某种原因)将 maxHeight 调整为 -1 以使默认处理程序不会重新声明自身并将窗口移动到 -8,-8,... 但它对我有用。