功能区控制bug? (导致vista截止)

问题描述 投票:2回答:2

我发现当我拍摄一个只包含一个功能区栏和一个状态栏的简单表格时,它就是截止状态。您在状态栏上方看到的控件后来被删除了。无论发生何种控制,都会发生相同的截止。后来我删除了状态栏并将备忘录控件放在那里,但结果相同。

没有带状条:without ribbon bar (来源:xrw.bc.ca

带状条:with ribbon bar (来源:xrw.bc.ca

我已经用边缘的一些2,4和8像素图示了这一点。

not maximized (来源:xrw.bc.camaximized (来源:xrw.bc.ca

正如克里斯·莱弗利(Chris Lively)在下面所说的那样,显然是错误估计了尺寸。我怎么能纠正这个?

谢谢您的意见!

delphi delphi-2009 ribbon
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位家庭高级版上测试)运行良好。

Image of ribbon left end

Image of ribbon right end

Image of status bar


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

© www.soinside.com 2019 - 2024. All rights reserved.