【问题标题】:Ribbon control bug? (causes cutoff in vista)功能区控制错误? (导致vista中断)
【发布时间】:2009-03-10 19:45:34
【问题描述】:

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

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

带功能区:
(来源:xrw.bc.ca

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


(来源:xrw.bc.ca

(来源:xrw.bc.ca

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

感谢您的 cmets!

【问题讨论】:

  • erm... 与编程无关?实际上,这甚至是一个问题吗?
  • 确定它与编程有关。我正在编写一个 delphi 应用程序。
  • Luis,这怎么和编程无关?如果你不知道 Delphi 是什么,或者这是关于编写 Delphi 应用程序,也许你不应该对这个问题发表评论。
  • 这听起来像是 Delphi 中的标准错误,即表单没有正确开始定位。首先尝试将 PositionpoScreenCenter' to poDefault. Then try turning off AutoSize` 更改(任何 AutoSize 都会暴露另一个 Delphi 错误,标题栏大小不同)
  • 感谢您提供的信息,伊恩。没有什么不同的。我想知道他们是否在 d2010 中修复了它。

标签: delphi delphi-2009 ribbon


【解决方案1】:

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

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

您可以将 WM_SYSCOMMAND 的自定义消息处理程序与 SC_MAXIMIZE wParam 参数一起使用。然后,您可以使用以下方法调整表单大小:

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

【讨论】:

  • 干得好,肯!谢谢你!对以后可能会使用它的人进行一些微小的更正: if Msg.CmdType = SC_MAXIMIZE then ... SystemParametersInfo(SPI_GETWORKAREA, 0, @R, 0);跨度>
  • 干得好,肯!谢谢你!对以后可能使用它的人进行一些微小的更正:[由于 HTML 未呈现而重新发布]。 if Msg.CmdType = SC_MAXIMIZE then ... SystemParametersInfo(SPI_GETWORKAREA, 0, @R, 0);
  • 感谢您的更正,X 射线。我会改正错字(我知道我应该复制和粘贴而不是重新输入。
  • 我还发现只有在设计时未将表单设置为 wsMaximized 时它才有效,这是行不通的。我可以做到,但是如果您也知道解决方案,那就太好了。我当然可以更改为仅在运行时最大化。
  • 嗯...您是否也尝试在 FormCreate 或 FormShow 中使用代码(当然,没有与消息相关的内容)? FormCreate 可能为时过早......我自己从不使用 wsMaximized;我将选择权留给用户。 (您可以将 API 调用和大小代码分离到单独的方法中,(更多)
【解决方案2】:

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,... 但它可以工作对我来说。

【讨论】:

  • 听起来很有趣。谢谢你;当我回到这个时,我会试一试!
猜你喜欢
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 2013-11-02
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-21
相关资源
最近更新 更多