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

时间:2009-03-10 19:45:34

标签: delphi delphi-2009 ribbon

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

没有功能区栏: without ribbon bar
(来源:xrw.bc.ca

带条带的

with ribbon bar
(来源:xrw.bc.ca

我用边缘画了2,4和8个像素来说明这一点。

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

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

感谢您的评论!

2 个答案:

答案 0 :(得分: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 :(得分: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,......但是它可以工作对我来说。