假设我在一个窗体中绘制了一个TreeView控件,以及一个按钮控件。
Global VarAll_NodeX As Node'在公共模块中定义
点击按钮控件可以在TreeView控件中生成一些节点,代码如下:
'在TreeView控件中生成节点
    .TVModuls.Nodes.Clear'TVModuls是TreeView控件的名称
    
    .TVModuls.LineStyle = tvwRootLines
    
    Set VarAll_NodeX = .TVModuls.Nodes.Add(, , "ModulName", "模型")
    VarAll_NodeX.Expanded = True
    
    Set VarAll_NodeX = .TVModuls.Nodes.Add(, , "OtherName", "其他")
    VarAll_NodeX.Expanded = True
    
    Set VarAll_NodeX = .TVModuls.Nodes.Add("ModulName", tvwChild, "kk", "Child 1")
    Set VarAll_NodeX = .TVModuls.Nodes.Add("kk", tvwChild, , "Child 11")
    Set VarAll_NodeX = .TVModuls.Nodes.Add("ModulName", tvwChild, , "Child 2")
    Set VarAll_NodeX = .TVModuls.Nodes.Add("ModulName", tvwChild, , "Child 3")    Set VarAll_NodeX = .TVModuls.Nodes.Add("OtherName", tvwChild, , "Child 4")
    Set VarAll_NodeX = .TVModuls.Nodes.Add("OtherName", tvwChild, , "Child 5")
    Set VarAll_NodeX = .TVModuls.Nodes.Add("OtherName", tvwChild, , "Child 6")现在我希望的是右键单击TreeView控件中的任何一个节点之后(不是点击TreeView控件中的空白处)回弹出一个菜单,
我可以在菜单中加入一个“删除”一个“增加”菜单项,我分别点击之后可以实现我的不同效果。假设我实现制作
的菜单叫"MenuCtrlNode"。右键单击后用可以用PopupMenu FrmMain.MenuCtrlNode弹出菜单。但是我不知道在什么事件
中嵌入PopupMenu FrmMain.MenuCtrlNode代码。才能实现右键点击任何一个节点之后产生此菜单。此外由于我需要
删除以及增加节点,所以我还希望在右键点击时不但产生一个菜单还要知道右键点击的是那一个节点,比如知道我点击
的当前节点索引号,因改怎样编写代码呢?望得到大家的帮助,谢谢!

解决方案 »

  1.   

    Private Sub TreeView1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
        Dim oNode As Node
        Set oNode = TreeView1.HitTest(x, y)
        If Not oNode Is Nothing And Button = vbRightButton Then
            'oNode就是你现在点击的节点
            PopupMenu mnu
        End If
    End Sub
      

  2.   

    Private Sub TreeView1_Mousedown(Button As Integer, Shift As Integer, x As Single, y As Single)
        Dim xnode As Node
        Set xnode = Me.TreeView1.HitTest(x, y)
        If Button=2 And Not ObjPtr(xnode) = 0 Then PopupMenu FrmMain.MenuCtrlNode
        MsgBox xnode.Index
    End Sub
      

  3.   

    谢谢大家的帮助!
    但是在使用时还是有一些问题:
    1。点击空白的地方就会报错。
    2。我希望点击了某个节点后,此节点会反色显示,即背景显示成蓝色。该如何编写代码?
    3。HitTest(x, y)这个方法我很陌生,有没有别的实现方法呀?
      

  4.   

    1做个判断
    if not tv.hitTest(x,y) is nothing then
    Set xnode = Me.TreeView1.HitTest(x, y)
    end if2.这个还真没没试验过:可以让其他节点选中,且不隐藏选中的节点,可能可行。3.这个方法很好用,一会生,二回熟。以后再作tv的时候会用到呢
      

  5.   

    Private Sub TreeView1_Mousedown(Button As Integer, Shift As Integer, x As Single, y As Single)
        Dim xnode As Node
        Set xnode = Me.TreeView1.HitTest(x, y)
        If ObjPtr(xnode) = 0 Then
        Exit Sub
        ElseIf Button = 2 Then
        PopupMenu FrmMain.MenuCtrlNode
        TreeView1.Nodes.Item(xnode.Index).Selected = True
        End If
    End Sub