Access

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

• WinAPI - Interfejs urządzenia graficznego (GDI)

• Uchwyt kontekstu urządzenia roboczego obszaru okna.

Jeżeli chcemy wykonać jakąkolwiek operację graficzną na roboczym obszarze okna Windows, musimy znać uchwyt kontekstu urządzenia (hdc) odnoszący się do obszaru roboczego okna, który umożliwia dostęp do  bieżących atrybutów graficznych kontekstu, takich jak kolor rysowania, grubość linii, jej styl, rodzaj czcionki i wielu innych atrybutów. Gdy uzyskamy uchwyt kontekstu urządzenia struktura powyższa jest wypełniana odpowiednimi wartościami, które możemy pobierać i zmieniać wykorzystując do tego odpowiednie funkcje GDI. Gdy zakończymy operacje graficzne powinniśmy zwolnić niepotrzebny już kontekst urządzenia DC.

Uchwyt kontekstu urządzenia roboczego obszaru okna Windows możemy pobrać za pomocą funkcji GetDC, która:

Opis funkcji GetDC (...)

dla określonego okna zwraca uchwyt kontekstu urządzenia obszaru roboczego okna (jest to obszar okna bez paska tytułowego, menu i pasków przewijania).

Public Declare Function GetDC _
               Lib "user32.dll" Alias "GetDC" _
               (ByVal hwnd As Long) As Long
  • argumenty:
    • hwnd
    • Uchwyt okna, którego kontekst urządzenia chcemy pobrać. Jeśli wartość ta jest równa ZERO, funkcja GetDC(...) zwraca uchwyt kontekstu urządzenia ekranu.
  • zwraca:
  • Przy powodzeniu funkcja zwraca uchwyt kontekstu urządzenia, przy niepowodzeniu funkcja zwraca ZERO.

Kilka uwag o stosowaniu funkcji GetDC(...).

  • Za pomocą funkcji GetDC(...) uzyskujemy uchwyt kontekstu urządzenia roboczego obszaru okna i możemy wykonywać operacje graficzne na obszarze roboczym okna. Nie mamy natomiast możliwości wykonywania operacji graficznych na pasku tytułowym okna, menu i paskach przewijania. Do tego celu będzie potrzebna opisana niżej funkcja GetWindowDC(...)
  • Po zakończeniu operacji graficznych w kontekście urządzenia hdc, powinniśmy użyć funkcji ReleaseDC(...) w celu zwolnienia kontekstu urządzenia hdc. Nie zwalnianie kontekstu urządzenia okna może mieć poważny wpływ na inne uruchamiane procesy graficzne oraz doprowadzić do wyczerpania zasobów systemowych w wyniku tzw. „wycieków pamięci” (memory leak).

• Uchwyt kontekstu urządzenia całego okna Windows.

Jeżeli chcemy wykonać operacje graficzne na dowolnym obszarze okna Windows, łącznie z paskiem tytułowym, menu i paskami przewijania, musimy pobrać uchwyt kontekstu urządzenia (hdc) odnoszący się do całego obszaru okna. Uchwyt ten możemy pobrać za pomocą funkcji GetWindowDC(...), która:

Opis funkcji GetWindowDC (...)

Dla określonego okna zwraca uchwyt kontekstu urządzenia całego obszaru okna. Zwrócony kontekst urządzenia okna umożliwia malowanie w dowolnym miejscu okna, ponieważ źródłem kontekstu urządzenia jest lewy górny róg okna, a nie obszar roboczy okna.

Public Declare Function GetWindowDC _
               Lib "user32.dll" Alias "GetWindowDC" _
               (ByVal hwnd As Long) As Long
  • argumenty:
    • hwnd
    • Uchwyt okna, którego kontekst urządzenia chcemy pobrać. Jeśli wartość ta jest równa ZERO, funkcja GetWindowDC(...) zwraca uchwyt kontekstu urządzenia ekranu.
  • zwraca:
  • Przy powodzeniu funkcja zwraca uchwyt kontekstu urządzenia, przy niepowodzeniu funkcja zwraca ZERO.

Kilka uwag o stosowaniu funkcji GetWindowDC(...).

  • Za pomocą funkcji GetWindowDC(...) uzyskujemy uchwyt kontekstu urządzenia całego okna i możemy wykonywać operacje graficzne na całym obszarze oknie, łącznie z paskiem tytułowym, menu i paskami przewijania.
  • Po zakończeniu operacji graficznych w kontekście urządzenia hdc, powinniśmy użyć funkcji ReleaseDC(...) w celu zwolnienia kontekstu urządzenia hdc. Nie zwalnianie kontekstu urządzenia okna może mieć poważny wpływ na inne uruchamiane procesy graficzne oraz doprowadzić do wyczerpania zasobów systemowych w wyniku tzw. „wycieków pamięci” (memory leak).

• Zwalnianie kontekstu urządzenia (DC).

Każdy kontekst urządzenia przechowuje atrybuty graficzne kontekstu, takie jak kolor rysowania, grubość linii, jej styl, rodzaj czcionki. Oznacza to, że każdy kontekst zajmuje w systemie pewne zasoby Dlatego, po zakończeniu operacji graficznych, gdy tylko kontekst urządzenia hdc przestaje nam być potrzebny, powinniśmy go zwolnić, zwalniając w ten sposób wszystkie związane z nim zasoby. Zwalnianie kontekstu urządzenia (DC) realizujemy za pomocą funkcji ReleaseDC(...), która:

Opis funkcji ReleaseDC (...)

Zwalnia kontekst urządzenia o uchwycie hdc i utworzony dla określonego okna hwnd.

Public Declare Function ReleaseDC _
               Lib "user32" Alias "ReleaseDC" _
               (ByVal hwnd As Long, _
               ByVal hdc As Long) As Long
  • argumenty:
    • hwnd
    • uchwyt okna, dla którego utworzony kontekst urządzenia będzie zwalniany.
    • hdc
    • uchwyt zwalnianego kontekstu urządzenia
  • zwraca:
  • Przy powodzeniu, gdy kontekst urządzenia został zwolniony, funkcja zwraca 1. W przeciwnym wypadku, gdy kontekst urządzenia nie został zwolniony, funkcja zwraca ZERO.

Kilka uwag o stosowaniu funkcji ReleaseDC(...).

  • Dla każdego wywołania funkcji GetWindowDC(...) oraz funkcji GetDC(...), pobierających kontekst urządzenia DC musi nastąpić wywoływać funkcję ReleaseDC(...).
  • Nie można używać funkcji ReleaseDC(...) do zwolnienia kontekstu urządzenie DC utworzonego przez wywołanie funkcji CreateDC(...). Zamiast tego musi skorzystać z funkcji DeleteDC(...).
  • Funkcja ReleaseDC(...) musi zostać wywołane w tego samego wątku, w którym została wywołana funkcja GetDC(...) lub GetWindowDC(...).