Paski przewijania okna roboczego MS Access.
Chcąc programowo zmienić położenie formularza, bądź kilku formularzy, a zwłaszcza jeżeli chcemy go dosunąć do prawej lub dolnej krawędzi okna roboczego musimy wiedzieć, czy paski przewijania są widoczne. Co prawda pasek przewijanie zajmuje tylko, lub aż ok. 20 pikseli szerokości (wysokości), ale jak to mówią „sztuka cierpi”, gdy przesuwany formularz znajdzie się kilka pikseli pod np. pionowym paskiem i pojawi się poziomy pasek okna roboczego, który przesłoni elementy formularza np. Przyciski nawigacyjne.

Poziomy pasek przewijania zasłania Przyciski nawigacyjne
Czy widoczny jest pionowy i (lub) poziomy pasek przewijania okna MS Access?
Niestety, okno robocze MS Access nie ma „Arkusza właściwości”
i w żaden sposób nie ułatwia nam pracy przez udostępnienie swoich właściwości wprost.
Na stronie GetWindowsLong(...)
znajduje się opis funkcji API GetWindowsLong(...) za pomocą której możemy pobrać styl okna,
a na stronie Styl okna, jak wyodrębnić elementy
stylu ze zwracanej liczbowej wartości.
Jeszcze tylko jedna uwaga.
Okno robocze MS Access to okno „rodzic”, w którym otwierane są „dzieci” tj. obiekty MS Access
takie jak tabele, kwerendy, formularze, raporty, makra.
Okno to, jak prawie każde okno Windows, ma swój uchwyt hwnd, ale także niedostępny wprost.
Ale od czego jest wspomniana już funkcja GetWindowsLong(...) i stała GWL_HWNDPARENT.
Nie należy mylić uchwytu tego okna z uchwytem hWndAccessApp określającym uchwytu przypisany przez
system Windows do głównego okna programu MS Access.
⊗ Private Function accScrollBars(hWind As Long) As Long
- Sprawdza, które paski przewijania są widoczne w oknie o uchwycie hwnd
- argumenty:
- hWind
- uchwyt okna
- zwraca:
-
Przy powodzeniu zwraca liczbę określającą, które paski przewijania są widoczne:
- 0 - żaden pasek przewijania nie jest widoczny
- 1 - tylko poziomy pasek przewijania jest widoczny
- 2 - tylko pionowy pasek przewijania jest widoczny
- 3 - pionowy i poziomy pasek przewijania są widoczne
- autor: Zbigniew Bratko
- data: 08.01.2019
Option Compare Database
Option Explicit
#If Win64 Then
Private Declare PtrSafe Function GetWindowLongPtr Lib "user32" _
Alias "GetWindowLongPtrA" _
(ByVal hwnd As LongPtr, _
ByVal nIndex As Long) As LongPtr
#ElseIf VBA7 Then
Private Declare PtrSafe Function GetWindowLongPtr Lib "user32" _
Alias "GetWindowLongA" _
(ByVal hwnd As LongPtr, _
ByVal nIndex As Long) As LongPtr
#Else
Private Declare Function GetWindowLong Lib "user32" _
Alias "GetWindowLongA" _
(ByVal hwnd As Long, _
ByVal nIndex As Long) As Long
#End If
' stałe określające przesunięcie argumentu nIndex :
Private Const GWL_HWNDPARENT = (-8) 'uchwyt do okna rodzica
Private Const GWL_STYLE = (-16) 'style okna
' stałe określające styl okna
Private Const WS_HSCROLL = &H100000 'okno posiada poziomy pasek przewijania
Private Const WS_VSCROLL = &H200000 'okno posiada pionowy pasek przewijania
#If VBA7 Then
Private Function accScrollBars(hWind As LongPtr) As Long
#Else
Private Function accScrollBars(hWind As Long) As Long
#End If
#If VBA7 Then
Dim lStyle As LongPtr
#Else
Dim lStyle As Long
#End If
' pobierz styl okna
#If VBA7 Then
lStyle = GetWindowLongPtr(hWind, GWL_STYLE)
#Else
lStyle = GetWindowLong(hWind, GWL_STYLE)
#End If
If lStyle = 0 Then
' coś poszło nie tak
accScrollBars = -1
Exit Function
End If
' porównaj bitowo styl okna ze stylem pasków przewijania
If ((lStyle And WS_HSCROLL) = WS_HSCROLL) And ((lStyle And WS_VSCROLL) = WS_VSCROLL) Then
accScrollBars = 3
ElseIf (lStyle And WS_VSCROLL) = WS_VSCROLL Then
accScrollBars = 2
ElseIf (lStyle And WS_HSCROLL) = WS_HSCROLL Then
accScrollBars = 1
End If
End Function
' przykładowe wywołanie:
Private Sub btnTest_Click()
#If VBA7 Then
Dim hParent As LongPtr
#Else
Dim hParent As Long
#End If
Dim lRetVal As Long
' pobierz uchwyt okna będącego Rodzicem formularza
#If VBA7 Then
hParent = GetWindowLongPtr(Me.hwnd, GWL_HWNDPARENT)
#Else
hParent = GetWindowLong(Me.hwnd, GWL_HWNDPARENT)
#End If
' pobierz pseudowłaściwość ScrollBar
lRetVal = accScrollBars(hParent)
Select Case lRetVal
Case 0
MsgBox "Żaden pasek przewijania."
Case 1
MsgBox "Poziomy pasek przewijania."
Case 2
MsgBox "Pionowy pasek przewijania."
Case 3
MsgBox "Oba paski przewijania."
Case Else
MsgBox "Nieprzewidziany błąd."
End Select
End Sub
Paski przewijania formularza.
Przy próbie zastosowania funkcji:
lStyle = accScrollBars(Me.hwnd)
w celu sprawdzenia jakie paski przewijania są widoczne na formularzu, spotka nas porażka. Zwracana wartość lStyle nie
zawiera stylu WS_HSCROLL ani WS_VSCROLL, czyli w oknie formularza nie są widoczne żadne paski przewijania.

Paski przewijania okna formularza nie są identyfikowane.
Jednak paski przewijania formularza są widoczne. Jak rozwiązać problem identyfikacji pasków przewijania w formularzu będzie przedstawione na stronie Paski przewijania formularza.
Do pobrania:
•