Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Visual Basic - Трюки и Хитрости, советы и ответы на вопросы


Служба Рассылок Subscribe.Ru проекта Citycat.Ru
VB Хитрости - советы и ответы на вопросы

Здравствуйте, уважаемые читатели.
Сегодня эта рассылка отметила юбилейного подписчика с номером 10000 . Довольно солидная аудитория.

Определение, какая item находится под курсором мышки в листбоксе

Часто, бывает нужда в определении элемента, над которым пользователь держит мышку. Как наиболее тривиальное применение - вывод дополнительной информации или подсказки в статус бар , причем контекстно зависимой от элемента. Или , например показ текущего элемента в другом листбоксе.

Бэйсик сам не дает нам такой функциональности , но к счастью , используя API функцию SendMessage() и константу LB_ITEMFROMPOINT такая возможность у нас появляется.

Обьявить SendMessage() можно прямо на форме

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 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 < .ListCount Then
Msgbox "текущее значение индекса - : " & P
End If
End Sub

 

Для тех, у кого есть любые вопросы, имеюшие отношение к тематике Visual Basic, хочу порекомендовать место, где на них можно получить ответ. Причем в течении совершенно разумного и небольшего промежутка времени - от нескольких часов до нескольких дней. Место это - конференция RU.Visual.Basic, расположенная на сайте Visual Basic на русском
Для сомневающихся в эффективности такого метода получения ответов, информирую, что за декабрь месяц среднее ежедневное количество сообщений составлило 65 - общее за месяц - 2031 а за январь - 2033 ;-)
Архивы конфференции также доступны с сайта.

Хочу поставить в известность всех подписчиков этого листа - лист создается в html , а потом автоматом на Ситикоте из него создается текстовый вариант. Так что, если вы, по ошибке, подписались на текстовую версию - рекомендую изменить этот параметр, так как за качество конвертации я не отвечаю, а создавать отдельную версию у меня не хватает времени. Сорри
Успехов в программировании!

Борис Рудой

Автор сайта - Visual Basic на русском



http://subscribe.ru/
E-mail: ask@subscribe.ru
Поиск

В избранное