Access

  MS Access 2010+  |  Aplication Programming Interface API  |   VBA 7.0

• API. Funkcje zarządzania oknami.

Informacje o niektórych właściwościach okien.

Podczas projektowania interfejsu bazy danych potrzebujemy niektórych danych o oknie głównym MS Access, bądź jego okna potomnych (dzieciach). Potrzebny nam może być uchwyt okna rodzica, uchwyt do instancji programu, a zwłaszcza styl konkretnego okna określający, czy okno jest nieaktywne, czy jest zmaksymalizowane, jakie posiada obramowanie, czy ma pasek tytułowy, czy posiada pionowy i poziomy pasek przewijania (scrollbar), czy widoczny przycisk maksymalizacji i minimalizacji i jeszcze kilkanaście innych elementów stylu.

Opis funkcji API GetWindowsLong (...)

Funkcja GetWindowsLong(...) zwraca informacje o określonym oknie o uchwycie hwnd, jak również wartość z określonego przesunięcia do dodatkowej pamięci okna.

Private Declare Function GetWindowLong
	Lib "user32" Alias "GetWindowLongA" _
	(ByVal hwnd As Long, _
	ByVal nIndex As Long) As Long
  • argumenty:
    • hwnd
    • uchwyt okna i pośrednio do klasy, do której należy okno
    • nIndex
    • Przesunięcie (offset) liczony od zera do pobieranej właściwości okna z dodatkowej pamięci okna. Poprawne wartości mieszczą się w zakresie od zera do liczby bajtów dodatkowej pamięci okna, pomniejszonej o wielkość liczby całkowitej Long (w systemie 32-bitowym) lub LongPtr (w systemie 64-bitowym). Aby pobrać niektóre właściwości okna, możemy także podać jedną z poniższych wartości:

        Wartość  Opis
      Const GWL_WNDPROC = (-4)zwraca adres procedury okna
      Const GWL_HINSTANCE = (-6)zwraca uchwyt do instancji programu
      Const GWL_HWNDPARENT = (-8)zwraca uchwyt do okna rodzica
      Const GWL_ID = (-12)zwraca identyfikator okna potomnego
      Const GWL_STYLE = (-16)zwraca styl okna
      Const GWL_EXSTYLE = (-20)zwraca rozszerzony styl okna
      Const GWL_USERDATA = (-21)zwraca dane użytkownika powiązane z oknem
  • zwraca:
  • Przy powodzeniu, zwraca wartość zawierającą żądane informacje o oknie. Przy niepowodzeniu funkcja zwraca 0. Aby uzyskać rozszerzoną informację o zaistniałym błędzie, należy wywołać funkcję GetLastError.

Użycie funkcji GetWindowsLong(...)

Deklaracja jest trochę skomplikowana, gdyż musimy uwzględnić wersję MS Access w jakim będzie uruchamiana funkcja GetWindowsLong(...). Czy MS Access jest 64-bitowy, czy VBA jest w wersji VBA 7 (Access 2010+), czy też jest to VBA 6 (Access 2007-).

 
#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
 
  • Najczęściej funkcji GetWindowsLong(...) używa się do uzyskania stylu okna o uchwycie hwnd. Wywołanie jest bardzo proste:

    lStyle = GetWindowLong(hWind, GWL_STYLE)

    Przy powodzeniu, zwracana wartość lStyle zawiera informacje o stylu okna. Należy tylko z tej zwróconej wartości wyodrębnić elementy stylu okna. O tym jak uzyskać opisowa wartości elementów stylu okna ze zwracanej wartości opisane jest na stronie Styl okna.
  • Funkcji GetWindowsLong(...) można użyć zamiast funkcji GetParent(...) by uzyskać uchwyt okna będącego rodzicem okna hWind

    hParent = GetWindowLong(hWind, GWL_HWNDPARENT)

  • Funkcji GetWindowsLong(...) można także użyć by uzyskać Identyfikator okna potomnego (dziecka) o uchwycie hWind

    hParent = GetWindowLong(hWind, GWL_ID)

Private Sub btnTest_Click()
#If VBA7 Then
	Dim lStyle  As LongPtr
	Dim hParent As LongPtr
	Dim lWndID  As LongPtr
#Else
	Dim lStyle  As Long
	Dim hParent As Long
	Dim lWndID  As Long
#End If



	#If VBA7 Then
		hParent = GetWindowLongPtr(Me.hwnd, GWL_HWNDPARENT)
		lWndID = GetWindowLongPtr(hParent, GWL_ID)
		lStyle = GetWindowLongPtr(hParent, GWL_STYLE)
	#Else
		hParent = GetWindowLong(Me.hwnd, GWL_HWNDPARENT)
		lWndID = GetWindowLong(Me.hwnd, GWL_ID)
		lStyle = GetWindowLong(hParent, GWL_STYLE)
	#End If
 
End Sub