Access

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

• WinAPI - Interfejs urządzenia graficznego (GDI)

• Tworzenie pamięciowego kontekstu urządzenia.

Jeżeli chcemy wykonać jakąkolwiek operację graficzną na bitmapie, musimy wcześniej utworzyć pamięciowy kontekst urządzenia (DC) zgodny z wzorcowym kontekstem urządzenia o uchwycie hdc. Pamięciowy kontekst urządzenia możemy utworzyć za pomocą funkcji CreateCompatibleDC(...), która:

Opis funkcji CreateCompatibleDC (...)

Funkcja CreateCompatibleDC(...) tworzy pamięciowy kontekst urządzenia (DC) zgodny z kontekstem urządzenia o określonym uchwycie hdc:

Public Declare Function CreateCompatibleDC _
       Lib "gdi32" Alias "CreateCompatibleDC" _
       (ByVal hdc As Long) As Long
  • argumenty:
    • hdc
    • uchwyt istniejącego kontekstu urządzenia. Jeśli wartość ta jest równa ZERO, funkcja CreateCompatibleDC(...) tworzy kontekst urządzenia zgodny z ekranem
  • zwraca:
  • Przy powodzeniu funkcja zwraca uchwyt pamięciowego kontekstu urządzenia, przy niepowodzeniu funkcja zwraca ZERO.

Kilka uwag o pamięciowym kontekście urządzenia.

  • Jak sama nazwa wskazuje pamięciowy kontekst urządzenia istnieje tylko w pamięci. Nie jest to więc rzeczywiste urządzenie wyjściowe. Jest ono określane, jako kontekst urządzenia „kompatybilny” z rzeczywistym kontekstem. Bezpośrednio po utworzeniu, kontekst urządzenia jest monochromatyczny i jego szerokość oraz wysokość wynosi 1 piksel, a wszystkie atrybuty ustawione są na wartości domyślne.

  • Pamięciowy kontekstu urządzenia możemy używać jak zwykły kontekst urządzenia. Można ustawić dla niego niestandardowe wartości atrybutów, pobierać aktualne wartości atrybutów kontekstu oraz wybierać pióra, pędzle i regiony kontekstu.

  • Funkcja CreateCompatibleDC(...) może być używana tylko z urządzeniami obsługującymi operacje rastrowe. Aby określić, czy urządzenie obsługuje operacje rastrowe, należy wywołać funkcję GetDeviceCaps(...)

  • Jeśli hdc ma wartość ZERO, wątek wywołujący funkcję CreateCompatibleDC(...) jest właścicielem utworzonego uchwytu hdc. Kiedy ten wątek zostanie zniszczony, uchwyt hdc będzie już nieważny. Tak więc, jeśli zostanie utworzony uchwyt hdc i następnie przekazany do innego wątku, to po zakończeniu pierwszego wątku, drugi wątek nie będzie mógł korzystać z uchwytu hdc.

  • Po zakończeniu operacji graficznych na utworzonym pamięciowym kontekście urządzenia hdc, powinniśmy użyć funkcji DeleteDC(...) w celu usunięcia z pamięci niepotrzebnego kontekstu urządzenia hdc. Można również wywołać funkcję DeleteObject(...), aby usunąć kontekst urządzenia DC, ale zalecanym sposobem jest użycie funkcji DeleteDC(...)
  • Pozostawianie w pamięci niepotrzebnych kontekstów urządzenia 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).
 

• Usuwanie pamięciowego kontekstu urządzenia.

Po zakończeniu wykonywania operacji graficznych w pamięciowym kontekście urządzenia, musimy zwolnić ten kontekst (DC) za pomocą funkcji DeleteDC, która:

Opis funkcji DeleteDC (...)

Usuwa pamięciowy kontekst urządzenia (DC) o określonym uchwycie hdc

Public Declare Function DeleteDC _
               Lib "gdi32" Alias "DeleteDC" _
               (ByVal hdc As Long) As Long
  • argumenty:
    • hdc
    • uchwyt kontekstu urządzenia
  • zwraca:
  • Przy powodzeniu funkcja zwraca wartość różną od ZERA, przy niepowodzeniu funkcja zwraca ZERO.

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

  • Nie może usunąć kontekstu urządzenia, którego uchwyt uzyskano poprzez wywołanie funkcji GetDC(...).
    By tak uzyskany kontekst urządzenia usunąć, należy wywołać funkcję ReleaseDC(...)
  • Po zakończeniu operacji graficznych na utworzonym pamięciowym kontekście urządzenia hdc, powinniśmy zawsze używać funkcji DeleteDC w celu usunięcia z pamięci niepotrzebnego kontekstu urządzenia hdc. Pozostawianie w pamięci niepotrzebnych kontekstów urządzenia 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).