Листинг 1
Attribute VB_Name = "ListMenu"
Option Explicit
Private Declare Function SendMessage Lib "user32"_
Alias "SendMessageA" (ByVal hWnd As Long, _
ByVal wMsg As Long, ByVal wParam _
As Long, lParam As Any) As Long
Const LB_GETITEMHEIGHT = &H1A1
Public Sub ListMenuMouse(cl As Control, fm As Form, _
Y As Single)
'
' Выделение текущей позиции списка
' в соответствии с перемещением курсора мыши
Dim ItemHeight As Long, NewIndex As Long
With cl
' Высота элемента списка в пикселах
ItemHeight = SendMessage(.hWnd, LB_GETITEMHEIGHT, _
0, 0)
' Преобразование из пикселов в твипы
ItemHeight = fm.ScaleY(ItemHeight, vbPixels, vbTwips)
' Вычисление индекса элемента списка
NewIndex = .TopIndex + (Y \ ItemHeight)
' Проверка -- не вышел ли индекс за пределы списка?
If NewIndex < .ListCount Then .ListIndex = NewIndex
End With
End Sub