2012-07-21 37 views
1

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; 

为什么在使用主题不工作? 无论是否有正常的方法来转移右侧菜单的最后一个点,是否应用不依赖方案?

回答

3

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

0
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;