delphi - 如何检测弹出菜单的子菜单的弹出(以及如何动态填充它)?

标签 delphi winapi

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

感谢您的帮助!

最佳答案

标准菜单或上下文(弹出)菜单中的子菜单没有区别:如果菜单项附加了子菜单,则其 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;

关于delphi - 如何检测弹出菜单的子菜单的弹出(以及如何动态填充它)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2809862/

相关文章:

c++ - 为什么这段代码被认为是可重入的?当操作系统中断线程时究竟发生了什么?

xml - 如何从 XPath 选择中获取 IXMLNodeList?

delphi - 自定义对象检查器组件?

winapi - 如何使用通过 VirtualAlloc 分配的 windbg 轨道内存?

c# - 为什么通过 timeBeginPeriod 增加定时器分辨率会影响功耗?

perl - 如何从 Windows 上的 ActivePerl 输出带有 unix 行结尾的 UTF-8 编码 XML 文件?

delphi - 相当于数据源的 'AutoInsert' 属性?

ios - 添加 XSuperObject 时项目无法在 iOS 中启动

delphi - T图像未显示

windows - 渲染透明窗口