【问题标题】:How to detect popup of a sub-menu of a popup menu (and how to populate it dynamically)?如何检测弹出菜单的子菜单的弹出(以及如何动态填充它)?
【发布时间】:2010-05-11 19:22:17
【问题描述】:

我有一个弹出菜单,其中包含多个菜单项,其中一个可以有子项。此条目右侧有一个小箭头,当您将鼠标悬停 到它上面时,将打开一个子菜单(无需单击)。现在我想在运行时填充这个 子菜单,但前提是用户实际打开它。如果用户从不打开子菜单,它将为空(可能包含占位符)。我怎么能做到这一点?是否可以在弹出菜单已经可见时对其进行修改?

感谢您的帮助!

【问题讨论】:

    标签: delphi winapi


    【解决方案1】:

    标准菜单或上下文(弹出)菜单中的子菜单没有区别:如果菜单项附加了子菜单,则其 OnClick 事件将在子菜单显示之前触发(请注意,您不需要单击以使其显示),并且在该事件处理程序中您可以修改子菜单(设置现有项目的属性,或添加新项目/删除现有项目)。

    一些关于动态添加和删除项目的演示代码:

    procedure TForm1.FormCreate(Sender: TObject);
    var
      Popup: TPopupMenu;
      Item, SubItem: TMenuItem;
    begin
      Popup := TPopupMenu.Create(Self);
      PopupMenu := Popup;
      Item := TMenuItem.Create(Popup);
      Item.Caption := 'Test submenu';
      Item.OnClick := PopupClick;
      Popup.Items.Add(Item);
    
      SubItem := TMenuItem.Create(Item);
      SubItem.Caption := 'dummy';
      Item.Add(SubItem);
    end;
    
    procedure TForm1.PopupClick(Sender: TObject);
    var
      SubmenuItem, Item: TMenuItem;
    begin
      SubmenuItem := Sender as TMenuItem;
      // delete old items (leave at least one to keep the submenu)
      while SubmenuItem.Count > 1 do
        SubmenuItem.Items[SubmenuItem.Count - 1].Free;
      // create new items
      while SubmenuItem.Count < 3 do begin
        Item := TMenuItem.Create(SubmenuItem);
        Item.Caption := Format('new item created %d', [GetTickCount]);
        SubmenuItem.Add(Item);
      end;
    end;
    

    【讨论】:

    • 但我没有点击...我悬停并打开它。无需点击。 (我编辑了问题以更好地反映这一点)
    • 我没说你需要点击。你可以试试吗?
    • 哇,这行得通!很抱歉没有先尝试,我认为这是对是否单击该项目的误解。但悬停实际上会触发 OnClick!谢谢!
    猜你喜欢
    • 2013-06-17
    • 2020-08-29
    • 2016-04-15
    • 1970-01-01
    • 2011-06-13
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    相关资源
    最近更新 更多