VirtualStringTree OnNodeRightClick

时间:2012-08-14 05:48:27

标签: delphi-7 virtualtreeview delphi tvirtualstringtree

我正在寻找一个程序或者当我右键单击一个节点(或者通常在VirtualStringTree上)时会被触发的东西

我有以下情况:

  • 我的VST接近列表视图。
  • 我只能使用鼠标选择多个根节点(按住鼠标按钮并移动鼠标)
  • 如果我点击任何子节点(右或左) - 它被选中(+ [VSelected] State)
  • 如果我右键单击根节点,它会自动选择并打开弹出菜单。

现在我希望为所有子节点设置一个不同的popupmenu(1个常用)(并且只有在选中它们时才会这样)。

希望你能理解我的意思,谢谢你的帮助。

2 个答案:

答案 0 :(得分:5)

我不会回答您的问题,但会指出您正确的事件,因为您已经说过要为每个节点设置不同的弹出菜单。右键单击解决方案至少在缺少菜单键按下时会有一个弱点,它也会调用弹出菜单。

1.1如何根据节点级别为每个节点使用不同的弹出菜单?

procedure TForm1.VirtualTreeGetPopupMenu(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; const P: TPoint;
  var AskParent: Boolean; var PopupMenu: TPopupMenu);
begin
  case VirtualTree.GetNodeLevel(Node) of
    0: PopupMenu := PopupMenu1;
    1: PopupMenu := PopupMenu2;
  end;
end;

1.2如何启用鼠标右键单击节点选择?

要允许鼠标右键选择节点,只需将toRightClickSelect选项添加到TreeOptions.SelectionOptions选项集即可。

答案 1 :(得分:2)

您可以使用正常OnMouseDown事件,确保ButtonmbRight,然后使用GetHitTestInfoAt函数检查光标下的哪个节点(如果有)是任何)。

var
  HitInfo : THitInfo;
...
TreeView.GetHitTestInfoAt(X, Y, HitInfo);
if (HitInfo.Node = ?) and (HitInfo.Column = ?) then
  begin
  ...
  end;

还有OnGetPopupMenu为您提供了一个节点和一列,并允许您返回任何TPopupMenu