在VB6中,使弹出菜单显示在树状视图的选定项处

在VB6中,使弹出菜单显示在树状视图的选定项处,vb6,keydown,popupmenu,Vb6,Keydown,Popupmenu,我在VB6中有一个树状视图,在右键单击节点时使用弹出菜单。由于VB6 PopupMenu将其位置默认为鼠标坐标,因此该菜单将显示在正确的位置 我想实现的是,当选择TreeView节点时,在按键事件中,弹出菜单也会出现在正确的位置。我如何才能做到这一点?您需要获取项目的坐标。为此,您需要首先获得它的句柄。当你得到矩形时,你必须把它转换成坐标 Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByV

我在VB6中有一个树状视图,在右键单击节点时使用弹出菜单。由于VB6 PopupMenu将其位置默认为鼠标坐标,因此该菜单将显示在正确的位置
我想实现的是,当选择TreeView节点时,在按键事件中,弹出菜单也会出现在正确的位置。我如何才能做到这一点?

您需要获取项目的坐标。为此,您需要首先获得它的句柄。当你得到矩形时,你必须把它转换成坐标

Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Private Declare Function MapWindowPoints Lib "user32.dll" (ByVal hwndFrom As Long, ByVal hwndTo As Long, ByRef lppt As Any, ByVal cPoints As Long) As Long

Private Type RECT
  Left As Long
  Top As Long
  Right As Long
  Bottom As Long
End Type

Private Type RECTF
  Left As Single
  Top As Single
  Right As Single
  Bottom As Single
End Type

Private Const TV_FIRST As Long = &H1100&
Private Const TVM_GETITEMRECT As Long = (TV_FIRST + 4)
Private Const TVM_GETNEXTITEM As Long = (TV_FIRST + 10)
Private Const TVGN_CARET As Long = &H9&


Private Function GetSelectedItemRect(ByVal tv As TreeView, ByRef outRect As RECTF) As Boolean
  Dim hItem As Long
  hItem = SendMessage(tv.hwnd, TVM_GETNEXTITEM, TVGN_CARET, ByVal 0&)

  If hItem Then
    Dim r As RECT
    r.Left = hItem

    If SendMessage(tv.hwnd, TVM_GETITEMRECT, 1, r) Then
      MapWindowPoints tv.hwnd, Me.hwnd, r, 2

      outRect.Left = Me.ScaleX(r.Left, vbPixels, Me.ScaleMode)
      outRect.Top = Me.ScaleY(r.Top, vbPixels, Me.ScaleMode)
      outRect.Right = Me.ScaleX(r.Right, vbPixels, Me.ScaleMode)
      outRect.Bottom = Me.ScaleY(r.Bottom, vbPixels, Me.ScaleMode)

      GetSelectedItemRect = True
    End If
  End If

End Function
用法:

Dim r As RECT

If GetSelectedItemRect(TreeView1, r) Then
  PopupMenu whatever, , r.Right, r.Top
End If

谢谢我必须将包含表单的ScaleMode更改为像素,以使其开箱即用。对于Twips等,我想转换是必要的。