Вело-изобретателиФорумНюансы программирования на VB6

Контрол для опроса Mouse Wheel (колёсико мыши)

Страницы: 1 2 3 4 5 6 Следующая »
#0
(Правка: 29 июня 2026, 17:49) 11:13, 17 июня 2026

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 Sub

SCount          на сколько провернулось колёсико
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 объектов с формы и всё - теперь есть событие исключительно для привязаных объектов!!!!!!!!!!!
(ну и просто событие поворота колёсика тоже есть)

#1
(Правка: 14:26) 14:18, 17 июня 2026

[file=191839]
пока такой сырой набор. Не кидайтесь тапками - кодер устал, кодер будет отдыхать
упс
Перезалил - мелкие исправления

#2
(Правка: 23 июня 2026, 17:06) 17:10, 17 июня 2026

[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
#3
(Правка: 23 июня 2026, 17:06) 17:22, 17 июня 2026

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

#4
17:25, 17 июня 2026

ошибку зависания если сгенерированое событие выполняется слишком долго убрал путём отключения перехвата очереди событий для контрола во время генерации события
и обратного включения перехвата после RaiseEvent MouseScroL()

#5
17:31, 17 июня 2026

хм а если привязывать только ОДИН контрол с формы к контролу мышки то select case внутри события необязательно делать так как генерация события будет делаться только к одному контролу формы

#6
(Правка: 23 июня 2026, 17:07) 17:35, 17 июня 2026

генерируются 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)
#7
(Правка: 23 июня 2026, 17:08) 19:03, 17 июня 2026

List перехватывает мышку и запустить скрол от контрола-мыши(MouseScrollEvent) можно лишь ткнув сначала левой кнопкой над контролом-мыши (белый квадратик) а потом крутить колёсико над List
Малейший щелчок по List и List перехватывает скрол мыши на себя. Так что если на форме уже есть контролы способные работать с колёсиком мыши то будет перетягивание одеяла на себя по принципу получения фокуса на контрол

#8
19:11, 17 июня 2026

[file=191848]
демонстрация конфликта за колесо мыши с Form6.List1
List перехватывает мышку и запустить скрол от контрола-мыши
можно лишь ткнув сначала левой кнопкой над контролом-мыши
(белый квадратик) а потом крутить колёсико над List
Малейший щелчок по List и List перехватывает скрол мыши на
себя. Так что если на форме есть контрол способный видить
вращение колёсика то начинается перетягивание одеяла

#9
19:43, 17 июня 2026

[file=191849]
пофиксил неправильный показ икс игрек координат внутри привязанного контрола. Пример показа xObj и yObj  можно посмотреть на Form5

#10
19:46, 17 июня 2026

Кстати забыл сказать один важный момент: все формы надо закрывать крестиком чтобы наверняка закрыть привязку к потоку сообщений Windows. Пример неправильного закрытия это когда в редакторе нажать кнопку стоп для программы - как стоп на плеере квадратик синий

#11
(Правка: 23 июня 2026, 17:08) 19:50, 17 июня 2026

и ещё момент - про ограничения пока могут работать до 40 контролов-маусов(MouseScroLEvent) одновременно и к одному MouseScrollEvent можно привязать до 20 других контролов
ограничения сам поставил чтобы не перегружать поток событий Windows, может можно и больше но боязно проверять

#12
(Правка: 23 июня 2026, 17:13) 20:02, 17 июня 2026
 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 когда мышь над привязанным объектом)

#13
20:05, 17 июня 2026

на сегодня всё

#14
7:24, 18 июня 2026

упс на Form4 вариант дополнения контрола был сделан на основе старой версии контрола мыши - заменяю

Страницы: 1 2 3 4 5 6 Следующая »
Вело-изобретателиФорумНюансы программирования на VB6