在VB TreeView节点上创建“鼠标悬停”效果

时间:2011-05-02 17:50:20

标签: vba treeview mouseover

TreeView控件的节点没有要测试的“鼠标悬停”属性。我希望“突出显示”节点(以便向用户提供有关选择哪个节点的反馈)。

例如,当MouseMove控件上的TreeView事件触发时,我可以将节点对象设置为“HitTest”返回的内容:

Set nde = trvChoices.HitTest(x, y * 15)

我正在寻找一种方法让鼠标悬停在此节点上“突出显示”(或某事),以便向用户提供有关TreeView中哪个节点被选中的反馈。是的,我使用TreeView作为“右键单击”菜单。我不想使用不同的控制,虽然我可能不得不......

3 个答案:

答案 0 :(得分:2)

在悬停时让节点成为Bold是明智的选择。但是,将BackColor或ForeColor设置为任何颜色,例如wdYellow只会使整个节点变黑......

发布示例代码以防其他人遇到此问题:

    Private Sub trvChoices_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As stdole.OLE_XPOS_PIXELS, ByVal y As stdole.OLE_YPOS_PIXELS)

    If Not (trvChoices.HitTest(x, y * 15) Is Nothing) Then

        Dim nde As Node
        Set nde = trvChoices.HitTest(x, y * 15)

        'I have three nodes only, but the proper way would be to loop through the trvChoices and set      each node to Bold = False
        trvChoices.Nodes(1).Bold = False
        trvChoices.Nodes(2).Bold = False
        trvChoices.Nodes(3).Bold = False

        nde.Bold = True

        Set nde = Nothing
    End If

End Sub

答案 1 :(得分:0)

我一直试图让OLEDragDrop与Treeview和Listview一起工作,并且遇到了一个问题,StartDrag试图在用户启动StartDrag之前接管Treeview中活动的项目,而不是而不是他们试图拖过的项目。我曾在其他地方看到过要求用户在拖动之前单击某个项目的解决方案,但这是违反直觉的。通过稍微修改您的代码,我可以将鼠标下的项目设置为活动项目:
(a)向用户提供反馈和 (b)使OLEDragDrop正常工作。

Private Sub trvChoices_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As stdole.OLE_XPOS_PIXELS, ByVal y As stdole.OLE_YPOS_PIXELS)

  If Not (trvChoices.HitTest(x * 15, y * 15) Is Nothing) Then

    Dim nde As node
    Set nde = trvChoices.HitTest(x * 15, y * 15)

    nde.Selected = True

    Set nde = Nothing
  End If

End Sub

答案 2 :(得分:0)

* 15用于像素/缇转换。不幸的是,它不适用于所有监视器,因为不同的监视器在像素和缇之间的比率取决于监视器的比率。但BUT 15确实符合标准4:3监视器。

Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, _
  ByVal nIndex As Long) As Long

Const WU_LOGPIXELSX = 88
Const WU_LOGPIXELSY = 90

在上方使用此功能。

另外,由于不同的版本使用不同的输出x,y值,因此您还需要检查是否完全需要进行转换。