【问题标题】:Align a TPopupMenu to the right hand side of the form?将 TPopupMenu 对齐到表单的右侧?
【发布时间】:2012-07-25 10:31:06
【问题描述】:

如何将 TPopupMenu 对齐到表单的右侧?问题是在调用Popup(X, Y: Integer) 之前似乎没有办法获得弹出菜单的宽度。

我正在尝试获得类似于 Chrome 中系统菜单的行为。

【问题讨论】:

  • @Sertac - 我不明白这是一个重复的问题。 a) 它用 Delphi 标记。 b)这不是简单地移动弹出窗口。它要求知道菜单的宽度,以便计算位置。
  • 在移动菜单窗口之前,您可以获得它的大小/位置。 VCL 不提供您要求的功能,因此您必须使用 api 调用。我认为这使它成为重复,但也许不是..

标签: delphi winapi


【解决方案1】:

最简单的解决方案是自己启动弹出菜单:

procedure TForm1.Panel1ContextPopup(Sender: TObject; MousePos: TPoint;
  var Handled: Boolean);
var
  PopupPt: TPoint;
begin
  PopupPt := ClientToScreen(Point(ClientWidth, 0));
  TrackPopupMenu(PopupMenu1.Handle, TPM_RIGHTALIGN or TPM_TOPALIGN,
      PopupPt.X, PopupPt.Y, 0, PopupList.Window, nil);
end;

请参阅TrackPopupMenuTrackPopupMenuEx 的文档,了解各种标志的含义。

【讨论】:

  • 感谢您发布此信息!我一直试图弄清楚如何强制弹出菜单向上扩展。我知道一定有办法,但这是我找到的最接近的话题。带有 TPM_BOTTOMALIGN 的 TrackPopupMenu 正是我所需要的。我说这一切是为了防止其他人正在寻找类似的东西。
【解决方案2】:

您也可以将Alignment 设置为paRight 并调用

with ClientToScreen(Point(ClientWidth - 1, 0)) do
  Popup(X, Y);

【讨论】:

  • +1 用于纯 VCL 解决方案(如“知道 Win API 很好,但知道如何不使用它更好”)
  • 这个解决方案有一个奇怪的buglet。如果您有双显示器并且应用程序已最大化,则弹出窗口将出现在第二个显示器上。简单的解决方法是使用 ClientWidth - 1。
猜你喜欢
  • 2017-07-28
  • 1970-01-01
  • 2020-06-27
  • 2012-03-25
  • 1970-01-01
  • 2022-12-29
  • 2016-03-04
  • 1970-01-01
  • 2017-04-27
相关资源
最近更新 更多