主菜单项的位置

The location of the main menu items

Total commander 中的“帮助”菜单项是右对齐的。它是怎么做到的?

啊,来自另一个千年的振动;)。这是可行的,如下所示,但我真的没有看到任何优势。

procedure TForm33.FormCreate(Sender: TObject);
begin
  ModifyMenu(MainMenu1.Handle,
             MainMenu1.Items.Count -1,
             MF_BYPOSITION or MF_RIGHTJUSTIFY, // MF_HELP = MF_RIGHTJUSTIFY = 00
             MainMenu1.Items[MainMenu1.Items.Count-1].Command,
             '&Help' );
end;

您可能需要阅读 documentation 并考虑以下注意事项:

Note The ModifyMenu function has been superseded by the SetMenuItemInfo function. You can still use ModifyMenu, however, if you do not need any of the extended features of SetMenuItemInfo.


编辑:在评论中,您链接到一张图像,其中“帮助”项已绘制在具有非渐变白色背景的渐变菜单栏上。根据你的图片,我相信你正在使用 Windows 7,所以我启动了一台旧的 W7 机器并用 Delphi XE7 测试了相同的代码,结果如下:

如果你不能帮我重现问题,我真的不知道我怎么可能进一步帮助你。


Edit2:感谢 Remy Lebeau 的评论,我对第四个参数进行了更正。没有从我的旧存储库更新代码,这对我来说是一个真正的错误。

未记录的 MF_HELP 与同样未记录的 MF_RIGHTJUSTIFY 具有相同的价值(均为 $4000)。后者更能说明目的,所以我改成了后者。

在Delphi中,VCL的TMenuItem does not natively support setting its justification, however you can use the Win32 API SetMenuItemInfo()函数在运行时修改一个菜单项,赋予它MFT_RIGHTJUSTIFY标志,eg:

uses
  ..., Windows;

procedure TForm1.FormCreate(Sender: TObject);
var
  info: TMenuItemInfo;
begin
  ZeroMemory(@info, sizeof(info));
  info.cbSize := sizeof(info);
  info.fMask := MIIM_FTYPE;

  GetMenuItemInfo(Help1.Parent.Handle, Help1.Command, False, info);
  // or: GetMenuItemInfo(Help1.Parent.Handle, Help1.MenuIndex, True, info);

  info.fType := info.fType or MFT_RIGHTJUSTIFY;

  SetMenuItemInfo(Help1.Parent.Handle, Help1.Command, False, info);
  // or: SetMenuItemInfo(Help1.Parent.Handle, Help1.MenuIndex, True, info);
end;

在FreePascal/Lazarus中,拼箱的TMenuItem has a published RightJustify属性可以设置为True.