2

德尔福 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;

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

4

2 回答 2

4

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

于 2012-07-21T18:25:05.743 回答
2
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;
  if SetMenuItemInfo(MainMenu, HelpMenuItem.Command, false, mii) then DrawMenuBar(self.Menu.WindowHandle);

end;
于 2015-12-17T12:08:35.507 回答