Access

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

• WinAPI - Interfejs urządzenia graficznego (GDI)

• Załadowanie do pamięci pliku graficznego z zasobów dyskowych.

Jeżeli chcemy załadować do pamięci bitmapę, ikonę lub kursor z zasobów systemowych (instancji modułu, biblioteki DLL, pliku wykonywalnego) lub skorzystać z zasobów dyskowych zawierających tego typu obrazy, powinniśmy skorzystać z funkcji LoadImage, która:

Opis funkcji LoadImage (...)

wczytuje do pamięci bitmapę, ikonę, kursor, animowany kursor z określonych zasobów:

Public Declare Function LoadImage _
               Lib "user32" Alias "LoadImageA" ( _
               ByVal hInst As Long, _
               ByVal lpszName As String, _
               ByVal uType As Long, _
               ByVal cxDesired As Long, _
               ByVal cyDesired As Long, _
               ByVal fuLoad As Long) As Long
  • argumenty:
    • hInst
    • Uchwyt do instancji modułu, biblioteki DLL lub pliku wykonywalnego (exe), zawierającego obraz do załadowania. Aby załadować obraz OEM, lub obraz z zasobów dyskowych (ikonę, kursor, lub bitmapę) należy ustawić wartość tego argument na ZERO.
    • lpszName
    • Uchwyt obrazu do załadowania. Jeśli argument hInst nie jest pusty, a argument fuLoad nie zawiera stałej LR_LOADFROMFILE, lpszName jest wskaźnikiem do ciągu znaków, zakończonego znakiem końca ciągu, zawierającego nazwę obrazu znajdującego się w zasobach hInst.
           Jeżeli hInst jest równe ZERO i fuLoad nie zawiera stałej LR_LOADFROMFILE, to mniej znaczące słowo argumentu określa identyfikator obrazu OEM przeznaczonego do załadowania. Identyfikatory OEM obrazu są określone w pliku winuser.h i są poprzedzone następującymi prefiksami:
         • OBM_ - bitmapa OEM
         • OIC_ - ikona OEM
         • OCR_ - kursor OEM
      Jeśli argument fuLoad stałą LR_LOADFROMFILE, wartość lpszName jest pełną ścieżką dostępu do pliku zawierającego obraz.
    • uType
    • Określa typ obrazu do załadowania. Argument ten może przyjmować jedną z następujących wartości:
         • IMAGE_BITMAP = 0 - załadowana powinna być bitmapa
         • IMAGE_ICON = 1 - załadowana powinna być ikona
         • IMAGE_CURSOR = 2 - załadowany powinien być kursor
    • cxDesired
    • Określa szerokość ikony lub kursora w pikselach. Jeśli argument ten jest równy ZERO, a argument fuLoad zawiera stałą LR_DEFAULTSIZE, funkcja używa systemowych ustawień SM_CXICON lub SM_CXCURSOR, aby dostosować szerokość wczytywanego obrazu. Jeśli argument ten jest równy ZEROfuLoad nie zawiera stałej LR_DEFAULTSIZE, obraz jest ładowany w oryginalnej szerokości.
    • cyDesired
    • Określa wysokość ikony lub kursora w pikselach. Jeśli argument ten jest równy ZERO, a argument fuLoad zawiera stałą LR_DEFAULTSIZE, funkcja używa systemowych ustawień SM_CYICON lub SM_CYCURSOR, aby dostosować wysokość wczytywanego obrazu. Jeśli argument ten jest równy ZEROfuLoad nie zawiera stałej LR_DEFAULTSIZE, obraz jest ładowany w oryginalnej wysokości.
    • fuLoad
    • Wartość argumentu jest kombinacją następujących stałych:

      WartośćOpis
      LR_DEFAULTCOLOR = &H0 stała domyślna, praktycznie oznacza ona, że ładowany obraz nie będzie monochromatyczny (LR_MONOCHROME)
      LR_CREATEDIBSECTION = &H2000 jeżeli argument uType ma wartość IMAGE_BITMAP, funkcja zwraca sekcji DIB bitmapy, a nie kompatybilną bitmapą. Stała ta jest przydatna do ładowania bitmapy niezależnie od systemu kolorów kontekstu urządzenia wyświetlającego.
      LR_DEFAULTSIZE = &H40 jeśli argumenty cxDesired lub cyDesired są ustawione na zero funkcja używa wartości systemowych określających szerokość lub wysokość kursora lub ikony. Jeżeli stała ta nie jest ustawiona i argumentu cxDesired i cyDesired są przyjmują wartość zero, funkcja używa rzeczywistych rozmiarów podczas ładowania obrazów . Jeśli zasób zawiera więcej niż jeden obraz, funkcja używa rozmiaru pierwszego obrazu.
      LR_LOADFROMFILE = &H10 obraz zostanie załadowany z pliku do którego pełna ścieżka została przekazana w argumencie lpszName. Jeśli stała ta nie została określona, argument lpszName odnosi się do nazwy zasobu.
      LR_LOADMAP3DCOLORS = &H1000 zastępuje w tabeli kolorów obrazu poniższe odcienie szarości kolorem 3D:
      Dk Gray RGB (128,128,128) zastępowany jest kolorem COLOR_3DSHADOW
      Gray RGB (192,192,192) zastępowany jest kolorem COLOR_3DFACE
      Lt Gray RGB(223,223,223) zastępowany jest kolorem COLOR_3DLIGHT
      LR_LOADTRANSPARENT = &H20 Pobiera wartość koloru pierwszego piksela obrazu i zastępuje go odpowiadającym mu wpisem z tablicy domyślnych kolorów (COLOR_WINDOW). Stała ta ma zastosowanie jedynie do obrazów, które mają odpowiednią tabelę kolorów. Jeśli argument fuLoad zawiera zarówno stałą LR_LOADTRANSPARENT i LR_LOADMAP3DCOLORS, to stała LRLOADTRANSPARENT ma większy priorytet, ale kolor zastępczy pobierany jest z tablicy COLOR_3DFACE, a nie COLOR_WINDOW.
      LR_MONOCHROME = &H1 obraz ładowany jest jako czarno-biały.
      LR_SHARED = &H80000 Gdy obraz jest ładowany wielokrotnie tworzy, wspólny uchwyt do załadowanego obrazu. Jeżeli LR_SHARED nie jest ustawiony, to funkcji LoadImage(...) będzie ładowała ten sam obraz ponownie, przez co zwróci inny uchwyt załadowanego obrazu. Nie należy stosować stałej LR_SHARED do obrazów, które mają nietypowe rozmiary i mogą się zmienić podczas ładowania obrazka oraz do obrazów ładowanych z pliku.
      LR_VGACOLOR = &H80 używany jest zestaw kolorów VGA true.
  • zwraca:
  • Przy powodzeniu zwraca uchwyt załadowanego obrazu. Przy niepowodzeniu zwraca ZERO.

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

Po zakończeniu korzystania z bitmapy, kursora lub ikony, należy zwolnić obraz z pamięci poprzez wywołanie:

  • dla bitmapy - funkcji DeleteObject(...)
  • dla kursora - funkcji DestroyCursor(...),
  • dla ikony    - funkcji DestroyIcon(...)

Gdy kończymy proces, który korzysta z tworzonych zasobów, system sam automatycznie usuwa załadowane do pamięci zasoby, jednak wywołanie odpowiedniej funkcji zwalniającej zasoby, oszczędza pamięć i zmniejsza rozmiar obszaru roboczego wykorzystywanego przez proces. Pozostawianie w pamięci niepotrzebnych obiektów może mieć niepożądany wpływ na inne uruchamiane procesy graficzne, a w skrajnym przypadku może doprowadzić do wyczerpania zasobów systemowych w wyniku tzw. „wycieków pamięci” (memory leak).