2

我发现当我采用仅包含功能区和状态栏的简单表单时,它会被截断。您在状态栏上方看到的控件后来被删除。无论碰巧存在什么控制,都会发生相同的截止。后来我删除了状态栏并在那里放置了一个备忘录控件,结果相同。

没有丝带栏:( 来源:xrw.bc.ca不带色带条

带丝带栏:( 来源:xrw.bc.ca带条形条

我已经用边缘的一些 2、4 和 8 像素来说明这一点。

未最大化
(来源:xrw.bc.ca(来源:xrw.bc.ca
最大化

正如 Chris Lively 在下面所说,显然是对尺寸的错误计算。我该如何纠正这个?

谢谢您的意见!

4

2 回答 2

2

我误解了我之前的答案的问题。

对于这个计算错误的问题,我可以(很快)想出一个解决方法。

您可以使用带有 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 位家庭高级版上测试)工作正常。

色带左端的图像

色带右端的图像

状态栏图片

于 2009-03-10T23:40:58.743 回答
1

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,... 但它对我有用。

于 2010-01-13T21:28:20.397 回答