主菜单项的位置

问题描述

Total命令程序中的“帮助”菜单项右对齐。怎么做?

Example

解决方法

啊,另一千年的振动;)。这样做是可行的,如下所示,但我看不到任何优势。

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

enter image description here

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

注意ModifyMenu函数已被SetMenuItemInfo函数取代。但是,如果不需要SetMenuItemInfo的任何扩展功能,则仍然可以使用ModifyMenu。


编辑:在注释中,您链接到带有非渐变白色背景的渐变菜单栏上绘制了“帮助”项目的图像。根据您的图像,我相信您正在使用Windows 7,因此我启动了一台旧的W7计算机,并使用Delphi XE7测试了相同的代码,结果如下:

enter image description here

如果您不能帮助我重现问题,我真的不知道该如何进一步帮助您。


Edit2:感谢Remy Lebeau的评论,我对第四个参数进行了更正。从我这边来看,确实是一个很大的错误,就是不从旧存储库中更新代码。

未公开的MF_HELP与未公开的MF_RIGHTJUSTIFY的值相同(均为$ 4000)。后者更好地表明了目的,所以我改为了。

,

在Delphi中,VCL的TMenuItem本身不支持设置其对齐方式,但是您可以使用Win32 API SetMenuItemInfo()函数在运行时修改菜单项以为其提供MFT_RIGHTJUSTIFY标志,例如:

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,info);
  // or: SetMenuItemInfo(Help1.Parent.Handle,info);
end;

image

在FreePascal / Lazarus中,LCL的TMenuItem具有已发布的RightJustify属性,您可以将其设置为True