MouseWheeL_2026-06-29_19-36_Scroll_DLL-коррект_закрытие.rar
выше последняя версия с поправками (на Form7 скролятся 7 контролов)
возможности:
MouseScrollEvent генерирует события при скроле колёсика мыши над формой и отдельное событие для привязанных контролов (если они были привязаны) при скроле над привязанным(и) контролом(и) - в событии для привязанного контрола
событие привязаных контролов(на Form5):
Private Sub MouseScrollEvent1_MouseScrollObject(ByVal SCount As Long, ByVal SumSCount As Long, ByVal x As Long, ByVal y As Long, ByVal ObjectIndex As Long, ByVal Object_hWhd As Long, xObj As Long, yObj As Long)
Select Case Object_hWhd
Case Me.VScroll1.hwnd
n = Me.VScroll1.Value - SCount
If n > Me.VScroll1.Max Then n = Me.VScroll1.Max
If n < Me.VScroll1.Min Then n = Me.VScroll1.Min
Me.VScroll1.Value = n
Case Me.HScroll1.hwnd
n = Me.HScroll1.Value + SCount
If n > Me.HScroll1.Max Then n = Me.HScroll1.Max
If n < Me.HScroll1.Min Then n = Me.HScroll1.Min
Me.HScroll1.Value = n
End Select
End SubSCount на сколько провернулось колёсико
SumSCount на сколько провернулось колёсико за всё время
x y координаты от левого верхнего угла монитора
Object_hWhd это hWhd контрола например Me.VScroll1.hwnd
xObj и yObj это координаты мыши от левого верхнего угла контрола
ObjectIndex индекс контрола внутри самого MouseScrollEvent (делается во время привязки)
и простое событие которое происходит всегда (по времени сначала простое событие потом для привязаных контролов):
Private Sub MouseScrollEvent1_MouseScroll(ByVal SCount As Long, ByVal SumSCount As Long, ByVal x As Long, ByVal y As Long) Me.Label2.Caption = SumSCount End Sub
пример инициации и привязки:
Private Sub Form_Load() Me.Show Me.MouseScrollEvent1.a_Init Me.hwnd 'Me.hwnd можно и не указывать(привяжется к себе) но тогда иногда не ловит событие пока не щёлкнеш по контролу Me.MouseScrollEvent1.a_InitFormObject_Add Me.VScroll1.hwnd ', nVS ' необязательная переменая Me.MouseScrollEvent1.a_InitFormObject_Add Me.HScroll1.hwnd ', nHS 'в неё записывается индекс принятого контрола или 0 если не принят End Sub
и пример деинициации (делать обязательно иначе иногда (1 из 10) зависание):
Private Sub Form_Unload(Cancel As Integer) Me.MouseScrollEvent1.a_InitStop End Sub
и желательно (но необязательно)
Private Sub Form_Terminate() 'здесь обычно событие при полном закрытии проекта Me.MouseScrollEvent1.a_InitStop 0 'вызов с нулём сбрасывает все MouseScrollEvent на всех формах End Sub
внимание:
тут пример как НЕ НАДО делать
а именно ставить перехват мыши MouseScrollEvent
НА УРОВЕНЬ UserControl И ЗАПУСКАТЬ ЕГО ИЗ UserControl (т.е. ставить внутрь пользовательского элемента)
Private Sub UserControl_Initialize() UserControl.MouseScrollEvent1.a_Init UserControl.hwnd End Sub
во первых конфликт за мышь при нескольких таких элементах на форме (что уже делает бесмысленным всё это)
во вторых на стадии редактирования контрол уже пытается сделать a_Init
что приводит к обрушению редактора VB6
вывод: перехват надо делать с уровня Form и только одним экземпляром MouseScrollEvent
Private Sub Form_Load() Me.MouseScrollEvent1.a_Init Me.hwnd End Sub Private Sub Form_Unload(Cancel As Integer) Me.MouseScrollEvent1.a_InitStop End Sub
пример передачи события с контрола MouseScrollEvent в другой контрол пользователя показан на Form7
-——————————————————-
состав:
контрол MouseScrollEvent.ctl
модуль MouseWheel1.bas
файл MouseWheel_DLL.dll
Имеется Генерация исключительного события только для привязаного контрола(любой объект на форме) по .hwnd
т.е. кидаеш на форму ОДИН MouseScrollEvent , а потом когда надо (обычно на стадии загрузки формы Private Sub Form_Load() программно привязываешь до 20 объектов с формы и всё - теперь есть событие исключительно для привязаных объектов!!!!!!!!!!!
(ну и просто событие поворота колёсика тоже есть)
[file=191839]
пока такой сырой набор. Не кидайтесь тапками - кодер устал, кодер будет отдыхать
упс
Перезалил - мелкие исправления
[file=191844]
Убрал ошибку зависания если сгенерированое событие выполняется слишком долго
Добавил возможность применить скрол мышки только к заранее выбранным контролам на форме что избавляет от необходимости создавать новые контролы на основе контрола мышки
пример:
Private nVS As Long
Private nHS As Long
Private Sub Form_Load()
Dim nn1 As Long, nn2 As Long
Me.Show
Me.MouseScrollEvent1.a_Init Me.hwnd
Me.MouseScrollEvent1.a_InitFormObject_Add Me.VScroll1.hwnd, nVS 'nVS возращает индекс регистрации 1-10 или 0 если не привязалось
Me.MouseScrollEvent1.a_InitFormObject_Add Me.HScroll1.hwnd, nHS
End Sub
Private Sub Form_Unload(Cancel As Integer)
Me.MouseScrollEvent1.a_InitStop
End Sub
Private Sub MouseScrollEvent1_MouseScrollObject(ByVal SCount As Long, ByVal SumSCount As Long, ByVal x As Long, ByVal y As Long, ByVal ObjectIndex As Long, ByVal Object_hWhd As Long, xObj As Long, yObj As Long)
Dim n As Long
Me.Label2.Caption = Format(ObjectIndex) + " " + Format(SumSCount)
If Me.Check1.Value Then GoTo m10 'выбор по хендлу
'по индексу
Select Case ObjectIndex
Case nVS
n = Me.VScroll1.Value - SCount
If n > Me.VScroll1.Max Then n = Me.VScroll1.Max
If n < Me.VScroll1.Min Then n = Me.VScroll1.Min
Me.VScroll1.Value = n
Case nHS
n = Me.HScroll1.Value + SCount
If n > Me.HScroll1.Max Then n = Me.HScroll1.Max
If n < Me.HScroll1.Min Then n = Me.HScroll1.Min
Me.HScroll1.Value = n
End Select
Exit Sub
'----------------
'по хэндлу
m10:
Select Case Object_hWhd
Case Me.VScroll1.hwnd
n = Me.VScroll1.Value - SCount
If n > Me.VScroll1.Max Then n = Me.VScroll1.Max
If n < Me.VScroll1.Min Then n = Me.VScroll1.Min
Me.VScroll1.Value = n
Case Me.HScroll1.hwnd
n = Me.HScroll1.Value + SCount
If n > Me.HScroll1.Max Then n = Me.HScroll1.Max
If n < Me.HScroll1.Min Then n = Me.HScroll1.Min
Me.HScroll1.Value = n
End Select
End Sub Me.MouseScrollEvent1.a_InitFormObject_Add Me.VScroll1.hwnd, nVS
Me.MouseScrollEvent1.a_InitFormObject_Add Me.HScroll1.hwnd, nHS
второй параметр nVS и nHS необязательны, достаточно .hwnd
Me.MouseScrollEvent1.a_InitFormObject_Add Me.VScroll1.hwnd
Me.MouseScrollEvent1.a_InitFormObject_Add Me.HScroll1.hwnd
ошибку зависания если сгенерированое событие выполняется слишком долго убрал путём отключения перехвата очереди событий для контрола во время генерации события
и обратного включения перехвата после RaiseEvent MouseScroL()
хм а если привязывать только ОДИН контрол с формы к контролу мышки то select case внутри события необязательно делать так как генерация события будет делаться только к одному контролу формы
генерируются 2 типа события общее и для подключенных с формы контролов
'SCount - на сколько сейчас сдвинулось колёсико 'SumSCount сколько всего колёсико накрутило Public Event MouseScroll(ByVal SCount As Long, ByVal SumSCount As Long, ByVal x As Long, ByVal y As Long) Public Event MouseScrollObject(ByVal SCount As Long, ByVal SumSCount As Long, ByVal x As Long, ByVal y As Long _ , ByVal ObjectIndex As Long, ByVal Object_hWhd As Long, xObj As Long, yObj As Long)
List перехватывает мышку и запустить скрол от контрола-мыши(MouseScrollEvent) можно лишь ткнув сначала левой кнопкой над контролом-мыши (белый квадратик) а потом крутить колёсико над List
Малейший щелчок по List и List перехватывает скрол мыши на себя. Так что если на форме уже есть контролы способные работать с колёсиком мыши то будет перетягивание одеяла на себя по принципу получения фокуса на контрол
[file=191848]
демонстрация конфликта за колесо мыши с Form6.List1
List перехватывает мышку и запустить скрол от контрола-мыши
можно лишь ткнув сначала левой кнопкой над контролом-мыши
(белый квадратик) а потом крутить колёсико над List
Малейший щелчок по List и List перехватывает скрол мыши на
себя. Так что если на форме есть контрол способный видить
вращение колёсика то начинается перетягивание одеяла
[file=191849]
пофиксил неправильный показ икс игрек координат внутри привязанного контрола. Пример показа xObj и yObj можно посмотреть на Form5
Кстати забыл сказать один важный момент: все формы надо закрывать крестиком чтобы наверняка закрыть привязку к потоку сообщений Windows. Пример неправильного закрытия это когда в редакторе нажать кнопку стоп для программы - как стоп на плеере квадратик синий
и ещё момент - про ограничения пока могут работать до 40 контролов-маусов(MouseScroLEvent) одновременно и к одному MouseScrollEvent можно привязать до 20 других контролов
ограничения сам поставил чтобы не перегружать поток событий Windows, может можно и больше но боязно проверять
Me.Show Me.MouseScrollEvent1.a_Init Me.hwnd Me.MouseScrollEvent1.a_InitFormObject_Add Me.VScroll1.hwnd Me.MouseScrollEvent1.a_InitFormObject_Add Me.HScroll1.hwnd
теперь события для привязанных контролов генерируются вне зависимости от ограничения поверхностью Me.MouseScrollEvent1 (Me.MouseScrollEvent1.a_Init третий параметр), точнее генерируются любом случае если указатель мыши над привязанным контролом (ну и добавил подсветку нижней зелёной полосой на анимации Me.MouseScrollEvent1 когда мышь над привязанным объектом)
на сегодня всё
упс на Form4 вариант дополнения контрола был сделан на основе старой версии контрола мыши - заменяю