为TreeView控件的Node对象写双击事件代码

转载:http://lxj74111.blog.sohu.com/79232192.html

为TreeView控件的Node对象写双击事件代码 
 以下是我使用TreeView控件一点心得,以此抛砖引玉,希望其它不会的程序员能受到启发,也希望我能从您们当中学到点东西!
大家应该对TreeView控件都不陌生!相信大家都知道,此控件没有节点双击事件,只有节点单击事件(NodeClick)和节点复选事件(NodeCheck)!
但我们在很多情况下都想实现节点双击的功能,要求当用户双击到节点上才引发,而双击控件上其它非节点的位置时不引发,同样地,还有鼠标右键菜单,当用鼠标右键点击节点才弹出此菜单,未点击到节点时不要弹出此菜单!
可能已经有许多人已经用其它方法实现了此功能,但我还是要向大家介绍一下我实现此功能的方法,条条道路通罗马,以供大家参考。
当用户点击一个节点时,节点和控件的事件顺序如下(其它事件与此无关,就不用列出了,下同):
NodeClick()
TreeView_Click()
当用户双击一个节点时
NodeClick()
TreeView_Click()
TreeView_DbClick()
当用户鼠标右键点击一个节点时
NodeClick()
TreeView_MouseUp()
TreeView_Click()
由以上有顺序我们就可以写出相应的控制代码实现了

Private mNodeClick As Integer '记录节点是否被单击了

'在节点单击事件里添加以下代码
Private Sub trvNode_NodeClick(ByVal Node As MSComctlLib.Node)
    mNodeClick = 2 '节点被点击,单击一个节点会先发生节点单击事件,再发生控件单击事件
    ...
End Sub

'在控件单击事件中添加如下代码
Private Sub trvNode_Click()
    mNodeClick = mNodeClick - 1 '控件被点击,记一次数,如果标志为1代表节点被单击,否则节点未被点击
End Sub

'在控件双击事件中添加以下代码
Private Sub trvNode_DblClick()
    If mNodeClick = 1 Then '如果节点被点击后只发生了一次控件被点击的事件,则说明用户双击了节点,否则用户双击了控件的非节点位置
        mNodeClick = 0 '重新开始
        '写节点双击事件代码
    End If
End Sub

以上代码就实现了节点双击事件的控制

'节点右键菜单
Private Sub trvNode_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = vbRightButton Then
        If mNodeClick = 2 Then '鼠标右键点击了节点,节点被点击后,没有发生控件点击事件
   '此时就可以弹出节点的右键菜单了
            PopupMenu menuRight, , , , menuRDesign
        End If
    End If
End Sub

以上代码就实现了节点右键菜单的功能

posted @ 2009-11-22 22:21  chaobj  阅读(2927)  评论(0编辑  收藏  举报