powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / И снова о скроллинге колесом мыши. MSFlexGrid
25 сообщений из 63, страница 1 из 3
И снова о скроллинге колесом мыши. MSFlexGrid
    #36249168
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно, поиском попользовался, почитал о решениях проблемы со скроллингом например для DataGrid - http://sql.ru/forum/actualthread.aspx?tid=93660

У MSFlexGrid, правда, нет метода Scroll. Т.е., видимо, надо пользоваться TopRow...

Но, собственно, вопрос такой. Вот тут: http://support.microsoft.com/kb/837910/en-us сказано:

microsoftMouse wheel support in Visual Basic 6.0 is a function of the mouse driver. The WM_MOUSEWHEEL message is sent to the Focus window when you rotate the mouse wheel. Because the Visual Basic 6.0 IDE does not have built-in support for scrolling by using the mouse wheel, the IDE ignores the WM_MOUSEWHEEL message. However, IntelliPoint software version 4.12 provides mouse wheel support and converts the WM_MOUSEWHEEL message to WM_SCROLL. IntelliPoint software version 4.9 and later versions do not have this feature.


Так может просто перехватывать сообщение WM_MOUSEWHEEL для окна и конвертировать его в WM_SCROLL? Тогда метод будет достаточно универсальный и его можно будет применять везде, где нужна прокрутка (например в комбобоксах). Ведь при установке некоторых драйверов (в частности драйвер genius-овский драйвер от NetScroll "с глазами") скролл работает во всех Vb-шных контролах.

Кто тут силен в API? Можно ли так сделать?
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36249649
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все уже давно сделано.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
Option Explicit

Private Declare Function SystemParametersInfo Lib "user32.dll" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByRef lpvParam As Any, ByVal fuWinIni As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (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 SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function GetProp Lib "user32" Alias "GetPropA" (ByVal hwnd As Long, ByVal lpString As String) As Long
Private Declare Function SetProp Lib "user32" Alias "SetPropA" (ByVal hwnd As Long, ByVal lpString As String, ByVal hData As Long) As Long
Private Declare Function RemoveProp Lib "user32" Alias "RemovePropA" (ByVal hwnd As Long, ByVal lpString As String) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Const WM_MOUSEWHEEL As Long = &H20A
Private Const WM_CLOSE As Long = &H10
Private Const GWL_WNDPROC As Long = - 4 
Private Const WHEEL_DELTA As Long =  120 
Private Const SPI_GETWHEELSCROLLLINES As Long =  104 

Private Const PROP_PREVPROC = "prevptr"
Private Const PROP_GRIDPTR = "gridptr"
Private Const PROP_DELTA = "delta"

Private Type POINTAPI
    X As Long
    Y As Long
End Type

Public Sub AddScroll2Grids(Form As Form)
Dim Grid As Object
Dim p As Long
Dim hwnd As Long
    If Form.MDIChild Then
        hwnd = GetParent(Form.hwnd)
        hwnd = GetParent(hwnd)
    Else
        hwnd = Form.hwnd
    End If
    If GetProp(hwnd, PROP_PREVPROC) =  0  Then
        p = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf FrmProc)
        SetProp hwnd, PROP_PREVPROC, p
    End If
    For Each Grid In Form.Controls
        Select Case TypeName(Grid): Case "DataGrid", "DBGrid", "MSFlexGrid", "MSHFlexGrid"
            p = SetWindowLong(Grid.hwnd, GWL_WNDPROC, AddressOf GridProc)
            SetProp Grid.hwnd, PROP_PREVPROC, p
            SetProp Grid.hwnd, PROP_GRIDPTR, ObjPtr(Grid)
        End Select
    Next
End Sub

Private Function GridProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim lPrevWndProc As Long
Dim lLines2Scroll As Long
Dim GridPtr As Long
Dim Delta As Long
Dim hwnd As Long
Dim oList As Object
Dim pa As POINTAPI
Dim dScroll As Integer
    lPrevWndProc = GetProp(hw, PROP_PREVPROC)
    If lPrevWndProc =  0  Then Exit Function
    Select Case uMsg
        Case WM_MOUSEWHEEL
            GetCursorPos pa
            hwnd = WindowFromPoint(pa.X, pa.Y)
            GridPtr = GetProp(hwnd, PROP_GRIDPTR)
            If GridPtr <>  0  Then
                SystemParametersInfo SPI_GETWHEELSCROLLLINES,  0 , lLines2Scroll,  0 
                Delta = GetProp(hw, PROP_DELTA) + wParam / &H10000
                dScroll = -lLines2Scroll * (Delta \ WHEEL_DELTA) * ( 10  +  9  * (Not (wParam = - 7864316  Or wParam =  7864324 )))
                Set oList = ObjFromPtr(GridPtr)
                Select Case TypeName(oList)
                    Case "DataGrid", "DBGrid"
                        oList.Scroll  0 , dScroll
                    Case "MSFlexGrid", "MSHFlexGrid"
                        On Error GoTo errh
                        If oList.TopRow + dScroll <= oList.FixedRows -  1  Then
                            oList.TopRow = oList.FixedRows
                        ElseIf oList.TopRow + dScroll >= oList.Rows Then
                            oList.TopRow = oList.Rows -  1 
                        Else
                            oList.TopRow = oList.TopRow + dScroll
                        End If
                End Select
                SetProp hw, PROP_DELTA, Delta Mod WHEEL_DELTA
            End If
        Case WM_CLOSE
            RemoveProp hw, PROP_PREVPROC
            RemoveProp hw, PROP_GRIDPTR
            RemoveProp hw, PROP_DELTA
            SetWindowLong hw, GWL_WNDPROC, lPrevWndProc
        Case Else
            GridProc = CallWindowProc(lPrevWndProc, hw, uMsg, wParam, lParam)
    End Select
    Exit Function
errh:
    Debug.Print Err.Description, oList.Row + dScroll
End Function

Private Function FrmProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim lPrevWndProc As Long
Dim hwnd As Long
Dim pa As POINTAPI
    lPrevWndProc = GetProp(hw, PROP_PREVPROC)
    Select Case uMsg
        Case WM_MOUSEWHEEL
            GetCursorPos pa
            hwnd = WindowFromPoint(pa.X, pa.Y)
            If GetProp(hwnd, PROP_PREVPROC) <>  0  Then SendMessage hwnd, uMsg, wParam, lParam
        Case WM_CLOSE
            RemoveProp hw, PROP_PREVPROC
            SetWindowLong hw, GWL_WNDPROC, lPrevWndProc
        Case Else
            FrmProc = CallWindowProc(lPrevWndProc, hw, uMsg, wParam, lParam)
    End Select
End Function

Private Function ObjFromPtr(lObjPtr As Long) As Object
Dim LoTmp As Object
    If lObjPtr <>  0  Then
        CopyMemory LoTmp, lObjPtr,  4 
        Set ObjFromPtr = LoTmp
        CopyMemory LoTmp,  0 &,  4 
    End If
End Function

Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36249921
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProТогда метод будет достаточно универсальный и его можно будет применять везде, где нужна прокрутка (например в комбобоксах).Во всех остальных стандартных контролах колесо и так работает.


Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36249977
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ещё не забывает про чудо-мышки от компании гениус, у них траблы с дровами для работы с vb-прогами , где колесо нужно
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36251327
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyВсе уже давно сделано.

Спасибо!

Первичное курение кода показало, что он рассчитан на то, что грид тупо лежит на форме. У меня же гриды лежат в основном внутри юзерконтролов, юзерконтролы могут лежать в других юзерконтролах и фреймах в произвольной комбинации. Кроме того, обработку скролла хочется реализовать на уровне нижнего контрола, содержащего грид, он лежит в отдельной ActiveX-библиотеке и не представляет, куда его закинет судьба, а, тем временем, приведенный вами код требует наличие hwnd от формы, причем, в случае MDI-проекта - от MDI-формы.

Я могу спустить на уровень юзерконтрола MYMDIForm.hwnd - это решит поблему?
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36252533
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЯ могу спустить на уровень юзерконтрола MYMDIForm.hwnd - это решит поблему?Если это вообще возможно, то только добавит новые.

Shocker.Proтем временем, приведенный вами код требует наличие hwnd от формы, причем, в случае MDI-проекта - от MDI-формыПервым делом WM_MOUSEWHEEL получает форма, а пооследним — тот контрол, в котором находится фокус. Мне хотелось сделать скролл, который не зависит от фокуса, это удобней. Если это вам не надо, можете избавиться от FrmProc.

Shocker.ProКроме того, обработку скролла хочется реализовать на уровне нижнего контролаНикаких проблем, лишнее убрал.
Код: plaintext
1.
2.
3.
4.
5.
Public Sub AddScroll2Grids(Grid as Object)
Dim p As Long
    p = SetWindowLong(Grid.hwnd, GWL_WNDPROC, AddressOf GridProc)
    SetProp Grid.hwnd, PROP_PREVPROC, p
    SetProp Grid.hwnd, PROP_GRIDPTR, ObjPtr(Grid)
End Sub

Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36252544
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyЕсли это вообще возможно, то только добавит новые.Упс, не правильно понял. Да, можете и решит.

Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36252610
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyМне хотелось сделать скролл, который не зависит от фокуса, это удобней. Если это вам не надо, можете избавиться от FrmProc.

А, ну то есть я спокойно могу перехватывать сообщение на уровне MSFlexGrid.hwnd и будет работать (но при условии, что фокус стоит на сетке)?

А в вашем варианте получается, что скролл будет работать в активной форме, даже если курсор не находится непосредственно над сеткой? или он дополнительно проверяет координаты? (извините, в функциях АПИ совсем не силен).
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36253030
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proили он дополнительно проверяет координаты?Именно.
FrmProc:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
…
Case WM_MOUSEWHEEL 'в форму пришел скролл

    'получаем координаты курсора
    GetCursorPos pa

    'получаем hWnd окна, оказавшегося под курсором
    hwnd = WindowFromPoint(pa.X, pa.Y)

    'проверяем наличие свойства PROP_PREVPROC у найденного окна
    'если нашлось, то это определенно один из наших гридов и мы перенаправляем WM_MOUSEWHEEL непосредственно ему, другие окна его не получат
    If GetProp(hwnd, PROP_PREVPROC) <>  0  Then SendMessage hwnd, uMsg, wParam, lParam

Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36253048
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProА, ну то есть я спокойно могу перехватывать сообщение на уровне MSFlexGrid.hwnd и будет работать (но при условии, что фокус стоит на сетке)?Да.

Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36254315
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ух!

Работает без обработки напильником!

Спасибо.


Я разнес использование: GridProc затолкал внутрь юзерконтрола и он там себе спокойно переваривается и инициализируется в момент загрузки контрола, а FrmProc определил на уровне MDI_Form-ы, инициализация идет в момент загрузки приложения.

Единственная осталась неприятность: Если фокус стоит на комбобоксе или, скажем treeview, то крутится не сетка, а фокусный контрол, даже если курсор летает над сеткой. Особенно неприятно с комбобоксом, так как, как правило, это фильтр или сортировка для сетки и его смена заставляет сетку обновляться. Уважаемый гуру, можно это победить?
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36259345
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оп, и еще одна проблемка возникла: если в режиме отладки возникает неперехватываемая ошибка - Debug не работает, видимо из-за того, что обработчик сообщений для главного окна программы уже испорчен, но сама прога на VB уже не выполняется.

Видимо, придется запретить перехват для MDI формы при работе из-под IDE.

По пердыдущему вопросу - UP!
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36271823
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

UP :(
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36272337
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyПервым делом WM_MOUSEWHEEL получает форма, а пооследним — тот контрол, в котором находится фокус.Здесь я наврал. На самом деле первым получает контрол, если он событие отработал, то дальше оно не идет.

По-видимому с этим ничего не сделаешь. При фокусе в комбо в форму приходит только WM_COMMAND.

Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36272372
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyЗдесь я наврал. На самом деле первым получает контрол, если он событие отработал, то дальше оно не идет.

По-видимому с этим ничего не сделаешь. При фокусе в комбо в форму приходит только WM_COMMAND.


Гм. А если перехватить обработку на уровне комбобокса (благо он тоже обернут в ActiveX-юзерконтрол)? И, если курсор мыши не находится непосредственно над ним, отменить и передать дальше?
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36272539
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ради бога) Можно передавать его форме.

Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36272574
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyРади бога) Можно передавать его форме.


Я имел ввиду не передачу куда-то конкретно, а передачу по цепочке. Таким образом, чтобы оно дошло до вышестоящего уровня (MDI-формы) вне зависимости от того, сколько вложенных hwnd встретится на его пути.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36273056
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По цепочке не надо. Лучше вставить обработку WM_MOUSEWHEEL из FrmProc.

Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36273742
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyПо цепочке не надо. Лучше вставить обработку WM_MOUSEWHEEL из FrmProc.

Вставил, в принципе работает, кроме самого себя, т.е. при попытке навести мыша на сам комбобокс и прокрутить, прога вылетает мгновенно вместе с IDE без всяких сообщений (видимо из-за переполнения стека, так как он видимо зацикливается на отправке сообщений самому себе).

P.S.
Помогла доработка процедуры FrmProc до:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
        Case WM_MOUSEWHEEL
            GetCursorPos pa
            hwnd = WindowFromPoint(pa.X, pa.Y)
            If hwnd <> hw Then
              If GetProp(hwnd, PROP_PREVPROC) <>  0  Then SendMessage hwnd, uMsg, wParam, lParam
            Else
              FrmProc1 = CallWindowProc(lPrevWndProc, hw, uMsg, wParam, lParam)
            End If

Таким образом работает и сетка и сам комбобокс, когда курсор находится над ними. Но если фокус стоит на комбобоксе, а курсор летает над TreeView, то TreeView не крутится. Почему так, он игнорирует SendMessage?
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36274248
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SendMessage до него не доходит из-за проверки наличия PROP_PREVPROC. Наверное можно ее убрать в вашем случае.

Jah loves you.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36275716
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariySendMessage до него не доходит из-за проверки наличия PROP_PREVPROC. Наверное можно ее убрать в вашем случае.

Тогда возникают другие глюки....
Пытаюсь подобрать рабочую комбинацию...

Скажите, а в чем разница между
SendMessage hwnd, uMsg, wParam, lParam
и
FrmProc = CallWindowProc(lPrevWndProc, hwnd, uMsg, wParam, lParam)
?
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36276513
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Скажите, а в чем разница между
> SendMessage hwnd, uMsg, wParam, lParam

Это ты посылаешь uMsg с помощью сообщений Windows, и пока сообщение не будет принято, отправляемая программа ждет,
иногда лучше использовать PostMessage, которая просто отправляет сообщение и не задерживает программу.

> FrmProc = CallWindowProc(lPrevWndProc, hwnd, uMsg, wParam, lParam)

А это просто вызов функции, со всеми вытекающими последствиями

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36276611
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,

Как раз "вытекающие последствия" меня и интересуют.
Я понимаю, что одно из них "отправить сообщение", другое "вызвать функцию"

Но так как в вышеприведенной программе используются оба способа в рамках одной функции (FrmProc), значит есть какая-то принципиальная разница, вот я ее я и хочу понять для отладки.
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36276839
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Как раз "вытекающие последствия" меня и интересуют.
> Но так как в вышеприведенной программе используются оба способа в рамках одной функции (FrmProc), значит есть
> какая-то принципиальная разница, вот я ее я и хочу понять для отладки.

принципиальная разница в том, что сообщения можно слать кому угодно, не только своим контролам и при этом задействуется
внешний механизм передачи сообщений Windows, а вызывать функцию, можно только получив доступ в адресное пространство

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
И снова о скроллинге колесом мыши. MSFlexGrid
    #36277373
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбоноспринципиальная разница в том, что сообщения можно слать кому угодно, не только своим контролам и при этом задействуется
внешний механизм передачи сообщений Windows, а вызывать функцию, можно только получив доступ в адресное пространство


Ну это с точки зрения вызова. А с точки зрения функционирования в данном конкретном случае (то есть в пределах моего приложения) есть какая-то разница?
...
Рейтинг: 0 / 0
25 сообщений из 63, страница 1 из 3
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / И снова о скроллинге колесом мыши. MSFlexGrid
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]