5

TActionMainMenuBar 存在绘制没有子项的根元素的错误。

使用 Delphi XE2 / w7-32bit**

如何重现:
使用 TActionMainMenuBar 构建菜单,向其中添加一些操作:

 file  | options | help
 - New
 - Open
 - Save
  -Exit

为所有操作分配一个空方法

procedure TfrmMain.ActionExecute(Sender: TObject); 
begin 
// 
end;

现在运行应用程序并尝试单击选项或帮助元素。
现在单击表单,但仍然按下菜单元素!

存在任何解决方法吗?

upd:看截图,菜单元素向下,但鼠标光标不在菜单上,自动检查为假,检查也是假的。
在此处输入图像描述
这里表单上没有任何颜色图,管理器样式是平台默认值

4

2 回答 2

1

这是我的解决方法:
像这样创建自定义类:


type
  TFastThemedButton = class(TThemedMenuButton)
  protected
    procedure DrawBackground(var PaintRect: TRect); override;
end;

...


procedure TFastThemedButton.DrawBackground(var PaintRect: TRect);
const
  MenuStates: array[Boolean {MouseInControl}, Boolean {Selected}] of TThemedMenu =
    ((tmMenuBarItemNormal, tmMenuBarItemPushed), (tmMenuBarItemHot, tmMenuBarItemPushed));
var
  BannerRect: TRect;
  StartCol, EndCol: TColor;
begin
   Canvas.Brush.Color := ActionBar.ColorMap.Color;
   Canvas.Font := ActionBar.Font;
   StyleServices.DrawElement(Canvas.Handle, StyleServices.GetElementDetails(MenuStates[MouseInControl, (State=bsDown)]), PaintRect);
end;

现在在你的 TActionMainMenuBar.OnGetControlClass 添加这个简单的代码,并设置为 buggy actionclients tag=-100


procedure TfrmActions.ActionMainMenuBar1GetControlClass(Sender: TCustomActionBar; AnItem: TActionClient; var ControlClass: TCustomActionControlClass);
begin
  if ControlClass.InheritsFrom(TCustomMenuButton) and then
   begin
    if (AnItem.Tag =-100) and (ControlClass = TThemedMenuButton) then
      ControlClass := TFastThemedButton;
   end;
end;

好吧,现在所有带有 -100 标签的根项目都可以按我们的意愿工作

于 2013-02-17T17:53:23.287 回答
0

我在所有带有菜单的表单上使用带有 MainMenu.RecreateControls 的事件 MainMenuExitMenuLoop。到目前为止,这从菜单项中删除了卡住的选择。

于 2016-09-21T15:47:41.570 回答