Ciao, alla fine mi sono divertito sul serio!!!
Non mi sono limitato a studiare solo il modo di settare il valore della scroll ma ho studiato anche quello relativo alla lettura della posizione attuale perchè credo che lo riutilizzerò.
Per il
settaggio della posizione della Scroll credo sia sufficiente conoscere anche solo
HWND della maschera che lo ospita (io ho dovuto accedere a quello della subform).
' Dichiarazione personalizzata per funzionare in SO 64 bit
Public Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const WM_HSCROLL = &H114
Public Const SB_THUMBPOSITION = 4
Dim lngRetVal As Long
'Posizione rappresenta il valore che deve assumere la scrollbar
lngRetVal = SendMessage(Me.SubForm.Form.hwnd, WM_HSCROLL, MakeDWord(Posizione, SB_THUMBPOSITION), 0)
Per la parte relativa alla
lettura della posizione invece:
E' necessario HWND della scrollbar solo quando si vuole leggere il valore attualmente impostato nella stessa.
In tal caso sarà necessario richiamare anche EnumChildWindows, GetWindowLong, GetClassName e GetScrollPos.
in particolare segnalo che, nel caso dei SO 64 bit la funzione "EnumChildWindows" andrà richiamata come segue:
Public Declare PtrSafe Function EnumChildWindows Lib "user32" (ByVal hWndParent As LongPtr, ByVal lpEnumFunc As LongPtr, ByVal lParam As LongPtr) As Long
e non
Public Declare PtrSafe Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Analizzando il codice del file scaricato nel link che mi hai proposto ho capito che:
- HWND è un valore variabile che cambia ogni volta che sia apre la maschera;
- Conoscere il ClassName è necessario in quanto, altrimenti, non si ha un valore di riferimento con cui confrontare quello degli oggetti figlio, e quindi a ricavarene il relativo HWND necessario alla lettura delle relative informazioni (questo avviene nella funzione cwCBProc)
- Per conoscere i ClassName Spi++ può essere unostrumento valido;
- il 2 parametro della funzione "findscrollbar" avente valore "AddressOf cwCBProc", nel momento in cui viene eseguita l'istruzione EnumChildWindows serve a determinare hwnd (ma quin non ho capito bene come funziona il tutto anche se ne intuisco il funzionamento... magari mi confonde "AddressOf");
Ho vuoluto elencare queste considerazioni per avere conferma che effettivamente ho intuito bene il codice proposto nel link che mi hai suggerito e per condividere con chi dovesse incorrere nelle stesse necessità.
Grazie.