Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2009, 10:12   #1
bag
Пользователь
 
Регистрация: 20.06.2008
Сообщений: 95
По умолчанию Скролирование списка колесом мыши в VBA

Доброго времени суток! Написал небольшое приложение на VBA 6.5 для работы с данными в Excel (MS Office 2007). Необходимо скролирование списка (например в ComboBox) с помощью колеса мыши. Нагуглил, что Visual Basic 6.0 не имеет встроенной поддержки колеса мыши. Микрософт на http://support.microsoft.com/kb/837910/ru пишет, что надо скачать и установить патч. Скачал и установил - не работает Подскажите как решить проблемму. Начальник хочет скролирование колесом, а начальникам надо угождать Заранее спасибо!
Не забывайте оставлять отзывы (кнопочка в левом нижнем углу сообщения)
bag вне форума Ответить с цитированием
Старый 29.04.2009, 10:22   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Попробуйте что-то вроде этого:

Код:
'====================================================================================
'' обработка события вращения колёсика мыши, и передача нужных команд форме Ftr. Работает с глюками:(
'====================================================================================
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Public hW As Long ' Хендл пользовательской формы
Private Declare Function CallWindowProcA Lib "user32" (ByVal lpPrevWndFunc As Long, _
ByVal hwnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SetWindowLongA Lib "user32" (ByVal hwnd As Long, _
ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetWindowTextA Lib "user32" (ByVal hwnd As Long, ByVal lpString As String) As Long
Private Const GWL_WNDPROC = -4, WM_MOUSEWHEEL = &H20A
Private lpPrevWndProc As Long, Wheel As Integer


Sub Hook(hwnd As Long):  lpPrevWndProc = SetWindowLongA(hwnd, GWL_WNDPROC, AddressOf WindowProc): End Sub
Sub UnHook(hwnd As Long):  SetWindowLongA hwnd, GWL_WNDPROC, lpPrevWndProc: End Sub
Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  On Error GoTo xErr
  If uMsg = WM_MOUSEWHEEL Then
    If wParam = -7864320 Or wParam = -23592960 Or wParam = -15728640 Then
      ' скролим вниз
'      If FTR.FG_tr.Row < FTR.FG_tr.Rows - 1 Then FTR.FG_tr.Row = FTR.FG_tr.Row + 1
'      Do While FTR.FG_tr.RowIsVisible(FTR.FG_tr.Row) = False
'        DoEvents
'        If FTR.FG_tr.TopRow < FTR.FG_tr.Rows - 1 Then FTR.FG_tr.TopRow = FTR.FG_tr.TopRow + 1
'      Loop

    ElseIf wParam = 7864320 Or wParam = 23592960 Or wParam = 15728640 Then
      ' скролим вверх
'      If FTR.FG_tr.Row > 1 Then FTR.FG_tr.Row = FTR.FG_tr.Row - 1
'      Do While FTR.FG_tr.RowIsVisible(FTR.FG_tr.Row) = False
'        DoEvents
'        If FTR.FG_tr.TopRow > 1 Then FTR.FG_tr.TopRow = FTR.FG_tr.TopRow - 1
'      Loop
    End If
  Else
    WindowProc = CallWindowProcA(lpPrevWndProc, hwnd, uMsg, wParam, lParam)
  End If
xErr:
End Function
EducatedFool вне форума Ответить с цитированием
Старый 29.04.2009, 12:41   #3
bag
Пользователь
 
Регистрация: 20.06.2008
Сообщений: 95
По умолчанию

Как-то все это очень сложно. Насколько я понял, бегло посмотрев листинг, ты только определяешь факт кручения колеса, а обработку листания списка не привел. Что за странные значения параметра wParam? Откуда такие числа? А объявления типа:
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
предполагают наличие какой-то внешней библиотеки "user32"?
Не забывайте оставлять отзывы (кнопочка в левом нижнем углу сообщения)
bag вне форума Ответить с цитированием
Старый 02.05.2009, 12:23   #4
bag
Пользователь
 
Регистрация: 20.06.2008
Сообщений: 95
По умолчанию

А еще есть какие-нибудь варианты?
Не забывайте оставлять отзывы (кнопочка в левом нижнем углу сообщения)
bag вне форума Ответить с цитированием
Старый 02.05.2009, 13:01   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
еще есть какие-нибудь варианты?
Вряд ли...
Проблема в том, что элементы управления из библиотеки FM20 - все эти листбоксы и комбобоксы - не перехватывают (точнее, не обрабатывают) события вращения колеса мыши.

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

Цитата:
Нагуглил, что Visual Basic 6.0 не имеет встроенной поддержки колеса мыши. Микрософт на http://support.microsoft.com/kb/837910/ru пишет, что надо скачать и установить патч.
Там написано немного про другое - про отсутствие скроллинга кода в редакторе VB (VBA), а не в элементах управления.
Поэтому установка этого патча не поможет.

Цитата:
Насколько я понял, бегло посмотрев листинг, ты только определяешь факт кручения колеса, а обработку листания списка не привел.
Да, это не весь код. Там есть ещё несколько строк.

Цитата:
Что за странные значения параметра wParam? Откуда такие числа?
Сам не помню уже, откуда. Главное - работает

Цитата:
А объявления типа Public Declare Function FindWindow Lib "user32"
предполагают наличие какой-то внешней библиотеки "user32"?
Нет. Это внутренняя библиотека Windows.
Просто берешь весь этот непонятный код, и вставляешь его в отдельный модуль.
Потом добавляешь пару строк в код формы, и всё начинает работать.

Если устроит такой вариант - выложи файл, я попробую приспособить этот код к твоей форме.
EducatedFool вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TСhart, клик мыши и координаты XY, Определение координат оси при клике мыши Aravild Компоненты Delphi 1 31.01.2009 16:28
Сортировка списка... Arkuz Помощь студентам 2 11.05.2008 00:53
Научите, пожалуйста, работать с колесом мыши и DBGrid'ом. фЁдОр БД в Delphi 16 11.03.2008 13:44