菜单最后一项右侧的Shift键菜单、Shift

2023-09-03 12:23:40 作者:难捱

Delphi Xe2U4。主菜单项:文件、选项、帮助(名称:HelpMenuItem)。2个按钮。使用StyleManager XE2(在项目选项中启用了XE2主题,默认设置为‘Metro Blue’)。

Procedure TForm1.RightMenu; // Shift in the right of last item of the menu
var mii: TMenuItemInfo;MainMenu: hMenu; Buffer: array[0..79] of Char;
begin
  MainMenu := Self.Menu.Handle;
  mii.cbSize := SizeOf(mii) ;
  mii.fMask := MIIM_TYPE;
  mii.dwTypeData := Buffer;
  mii.cch := SizeOf(Buffer) ;
  GetMenuItemInfo(MainMenu, HelpMenuItem.Command, false, mii) ;
  mii.fType := mii.fType or MFT_RIGHTJUSTIFY;
  SetMenuItemInfo(MainMenu, HelpMenuItem.Command, false, mii) ;
end;

procedure TForm1.Metro1Click(Sender: TObject); // Not Work
begin
TStyleManager.TrySetStyle('Metro Blue'); // or any other
RightMenu;
end;

procedure TForm1.Windows1Click(Sender: TObject); // Work
begin
TStyleManager.TrySetStyle('Windows'); // standart theme
RightMenu;
end;

为什么在使用主题下不起作用? 是否有将菜单的最后一点向右移动的正常方式,是否应用了依赖方案?

推荐答案

二级菜单如何快捷截屏 图

不幸的是,TMainMenu的VCL样式挂钩没有实现代码来绘制右对齐的特定菜单项。此外,这个VCL样式钩子(TMainMenuBarStyleHook)作为严格的私有成员嵌入到TFormStyleHook(表单的VCL样式钩子)中,因此这里没有太大的修改空间。修正这个问题需要你为TForms和TMainMenus重写一个新的VCL风格的钩子。因此,如果要执行此操作,必须将TFormStyleHook类从Vcl.Forms单元复制到新单元,然后修复TFormStyleHook.TMainMenuBarStyleHook.DrawItemTFormStyleHook.TMainMenuBarStyleHook.Paint方法的实现。

 
精彩推荐
图片推荐