|
Определение, какая item находится под курсором мышки в листбоксе |
|
|
Часто, бывает нужда в определении элемента, над которым пользователь держит мышку. Как наиболее тривиальное применение - вывод дополнительной информации или подсказки в статус бар, причем контекстно зависимой от элемента. Или, например, показ текущего элемента в другом листбоксе. Бэйсик сам не дает нам такой функциональности, но к счастью, используя API функцию SendMessage() и константу LB_ITEMFROMPOINT такая возможность у нас появляется. 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
'LB_ITEMFROMPOINT - это сообщение будет извлекать индекс
(начиная с 0)
'Обьявляем эту константу там же
Private Const LB_ITEMFROMPOINT = &H1A9
'Координаты мыши будут передаваться в параметр
lParam , и значение этих координат должно быть в
пикселях . VB cвои значения выдает в твипсах,
соотвественно мы должны позаботиться о
конвертации перед передачей этих значений в API
функцию.
'Это можно сделать так: ((YPosition * 65536) + XPosition))
'Ну, и наконец, SendMessage() может возвращать вам два
типа значений.
'Если функция определяет, что указатель мыши
находится над листбоксом - то она вернет номер
индекса листбокса.
'Если мышка в другом месте, то функция вернет
значение равного старшему слову координаты плюс
65537. Собственно достаточно будет проверить на
соотвествие возвращаемый индекс.
'Вряд ли кто то будет держать в листбоксе столько
элементов.
'Итак, нижеследующий код показывает как это все
написать.
Private Sub Form_Load()
List1.AddItem "11"
List1.AddItem "22"
List1.AddItem "33"
List1.AddItem "44"
End Sub
Private Sub List1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim P As Long
Dim XPosition As Long, YPosition As Long
XPosition = CLng(X / Screen.TwipsPerPixelX)
YPosition = CLng(Y / Screen.TwipsPerPixelY)
P = SendMessage(List1.hWnd, LB_ITEMFROMPOINT, 0, ByVal ((YPosition * 65536) + XPosition))
If P < List1.ListCount Then
MsgBox "текущее значение индекса - : " & P
End If
End Sub
|
|
|
|
|
|
|