我发现当我拍摄一个只包含一个功能区栏和一个状态栏的简单表格时,它就是截止状态。您在状态栏上方看到的控件后来被删除了。无论发生何种控制,都会发生相同的截止。后来我删除了状态栏并将备忘录控件放在那里,但结果相同。
没有带状条: (来源: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,......但它对我有用。