Visual Basic, .NET, ASP, VBA, VBScript
 
  Библиотека кодов  
  Стандартные элементы >>> ListBox  
     
  Определение, какая 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
 
     
  VBNet online (всего: 52050)  
 

Логин:

Пароль:

Регистрация, забыли пароль?


В чате сейчас человек
 
     
  VBNet рекомендует  
   
     
  Лучшие материалы  
 
ActiveX контролы (112)
Hitman74_Library (36119)
WindowsXPControls (20739)
FlexGridPlus (19374)
DSMAniGifControl (18295)
FreeButton (15157)
Примеры кода (546)
Parol (18027)
Passworder (9299)
Screen saver (7654)
Kerish AI (5817)
Folder_L (5768)
Статьи по VB (136)
Мое второе впечатление... (11236)
VB .NET: дорога в будущее (11161)
Основы SQL (9225)
Сообщения Windows в Vi... (8788)
Классовая теория прогр... (8619)
 
     
Техническая поддержка MTW-хостинг | © Copyright 2002-2011 VBNet.RU | Пишите нам