Как поймать event вращения колесика мышки?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
BorisSS
Новичок
Новичок
 
Сообщения: 44
Зарегистрирован: 12.10.2003 (Вс) 10:18

Как поймать event вращения колесика мышки?

Сообщение BorisSS » 03.03.2005 (Чт) 19:02

И еще, с событиями MouseDown, MouseUP, ... для объектов, расположенных в Форме, это понятно, а вот есть возможность перехватывать эти события самой Формой или какой-нибудь функцией? Типа KeyPreview=true но для мышки.
Заранее благодарен,
Борис.

Arcanoid
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 01.01.2005 (Сб) 15:44

Сообщение Arcanoid » 03.03.2005 (Чт) 19:24

в декларации
Код: Выделить всё
Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" (ByRef lpMsg As WinMSG, ByVal hWnd As Long, ByVal uMsgFilterMin As Long, ByVal uMsgFilterMax As Long, ByVal uRemoveMsg As Long) As Long
Declare Function WaitMessage Lib "user32" () As Long

Public Type WinMSG
    hWnd As Long
    uMessage As Long
    wParam As Long
    lParam As Long
    dwTime As Long
    pt As POINT
End Type

Public Const PM_NOREMOVE As Long = 0
Public Const WM_MOUSEWHEEL As Long = &H20A


цикл обработки (я запихивал его в конец Form_Load())

Код: Выделить всё
Dim msg As WinMSG
While 1
    WaitMessage
    If PeekMessage(msg, hWnd, WM_MOUSEWHEEL, WM_MOUSEWHEEL, PM_REMOVE) Then
        If msg.wParam < 0 Then 'скролл вверх
            Form_MouseWheel 0
        Else
            Form_MouseWheel 1
        End If
    End If
    DoEvents
Wend


и главное не забыть про процедуру обработки. здесь она именуется Form_MouseWheel:
Код: Выделить всё
Sub Form_MouseWheel(byval nScroll as Long)
...
End Sub

Arcanoid
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 01.01.2005 (Сб) 15:44

Сообщение Arcanoid » 03.03.2005 (Чт) 19:26

поправочка! вместо PM_NOREMOVE надо объявить:

Код: Выделить всё
Public Const PM_REMOVE As Long = 1

Arcanoid
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 01.01.2005 (Сб) 15:44

Сообщение Arcanoid » 03.03.2005 (Чт) 19:41

Так можно перехватывать и другие сообщения окну (для мыши: WM_LBUTTONDOWN, WM_LBUTTONUP, ...)

да, забыл расписать тип POINT:
Код: Выделить всё
type POINT
  X as Long
  Y as Long
end type

BorisSS
Новичок
Новичок
 
Сообщения: 44
Зарегистрирован: 12.10.2003 (Вс) 10:18

Сообщение BorisSS » 03.03.2005 (Чт) 19:46

Супер!
А подтормаживать While ...PeekMessage... Wend не сильно будет? А то быстродействие в MouseMove ОЧЕНЬ критично для меня.

Arcanoid
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 01.01.2005 (Сб) 15:44

Сообщение Arcanoid » 03.03.2005 (Чт) 20:51

Ну, это ж АПИ-функции! Если что и будет тормозить, то это скорее всего ВБ! 8)

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 03.03.2005 (Чт) 22:07

Уважаемые, подскажите плиз, как выйти из функции "PeekMessage", и как заставить ее работать в пределах объекта в форме.
Есть таблица (генератор отчетов F1Book1), не работающая нормально со скроллом.
При клике по ней запускаю процедуру обработки Form_MouseWheel. Скролл начинает работать. При закрытии формы она зависает (исчезает с экрана, но остается в диспетчере задач).
Нужно, чтобы скролл срабатывал только в пределах таблицы, или формы. А при щелчке мышью, к примеру по форме, переставал срабатывать. Как отключить обработку события колесика мыши в данной ситуации, с возможностью дальнейшего включения. И еще, что за константа "WM_MOUSEWHEE".
Надеюсь на вашу поддержку и прошу извинения за ламерский вопрос.
С уважением, Сергей.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.03.2005 (Пт) 3:38

Мда...
Такого я ещё не видел...
Влезть в message loop и хозяйничать там... гы...

В общем, так...
Берём subclasser из кирпичей.
Сабклассим грид.
Будет приходить WM_MOUSEWHEEL - обрабатываем.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 04.03.2005 (Пт) 7:00

Прошу прощение за вторжение.
А можно ли поподробнее? Скрипт, или исходник?
Буду благодарен любой информации.
С уважением, Сергей.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.03.2005 (Пт) 7:32

Какой скрипт?

Есть раздел с кирпичами. Там есть сабклассер. Никаких скриптов.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 04.03.2005 (Пт) 22:52

Извини, но я не знаю ни про раздел с кирпичами, ни про сабклассер. Вот и попросил пример листинг программы. Прокомментируй, если не в лом. Буду благодарен любой информации.
С уважением, Сергей.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.03.2005 (Пт) 23:09

sergey-911 писал(а):Извини, но я не знаю ни про раздел с кирпичами, ни про сабклассер. Вот и попросил пример листинг программы. Прокомментируй, если не в лом. Буду благодарен любой информации.
Нет, во дают :roll:
Раздел с кирпичами: http://bbs.vbstreets.ru/viewforum.php?f=28
Сабклассер: http://bbs.vbstreets.ru/viewtopic.php?t=13761

Пожелание админам: перенести раздел с самого низа на самый верх - его не замечают :-(
Изображение

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 05.03.2005 (Сб) 7:30

Спасибо за ссылку. Обязательно изучу. Я , конечно стыжусь своей темноты. Но если не стремиться, то и не узнаешь. Спасибо Вам.
С уважением, Сергей.

Arcanoid
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 01.01.2005 (Сб) 15:44

Сообщение Arcanoid » 05.03.2005 (Сб) 19:01

sergey-911
Можно попробовать ловить сообщения PeekMessage'ем не для hWnd формы, а хэндлами контролов - дочерних окон.
Invalid user or password...

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 06.03.2005 (Вс) 12:34

Спасибо за ценный совет.
С уважением, Сергей.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 162

    TopList