Programmieren mit C++

Borland C++

32-Bit-Programmierung

Zugriff auf ImageLists

Wie kann man auf die System-ImageList mit den Desktop-Symbolen zugreifen, die von der Shell verwaltet wird?

Frage

Die Shell verwaltet alle Symbole des Desktops, die bereits einmal für die Anzeige geladen wurden, in einer systemweit verfügbaren ImageList, die als Folder ohne Namen über SHGFI_SYSICONINDEX angesprochen werden kann.

SHFILEINFO sfi;
HIMAGELIST g_Images;
 
g_Images = (HIMAGELIST) SHGetFileInfo(
      „“, 0, &sfi, sizeof(sfi),
      SHGFI_SYSICONINDEX, SHGFI_ICON);

Als Ergebnis resultiert ein Handle auf eine ImageList-Struktur, die alle Symbole in normaler Darstellung enthält. Es kann jedoch auch die kleine Symboldarstellung ermittelt werden, da die Shell die Symbole nicht nur für die normale Darstellung, sondern auch als kleine Symbole verwaltet. Um diese zu erhalten, müßte anstelle von SHGFI_ICON die Konstante SHGFI_SMALLICON eingesetzt werden.

Lösung

Wie kann ein einzelnes Image aus einer ImageList als Bitmap isoliert und verfügbar gemacht werden?

Frage

Eine ImageList verwaltet die Einzelbilder in Form von Bitmaps. Auf die jeweiligen Einzelbilder kann via ImageList_ExtractIcon ein Bild aus einer ImageList als eigenständiges Icon extrahiert werden. Soll das Image als Bitmap im Originalformat geliefert werden, muß eine neue Bitmap erzeugt werden, die als Funktionsergebnis retunierbar ist. Die Funktion IL_GetBitmap übernimmt als Parameter die betroffene ImageList und den Index des gewünschten Bildes.

HBITMAP IL_GetBitmap( HIMAGELIST hIL, int iIndex )
{
  HDC     hdcDST; 
  HBITMAP hbmDST, hbmOLD; 
  int     cx, cy; 

Als erstes ist die Größe der Bilder in der übergebenen ImageList zu ermitteln und eine kompatible Bitmap zu erzeugen.

  ImageList_GetIconSize( hIL, &cx, &cy );
  hdcDST  = CreateCompatibleDC( NULL ); 
  hbmDST  = CreateBitmap( cx, cy,
                          GetDeviceCaps( hdcDST, PLANES ),
                          GetDeviceCaps( hdcDST, BITSPIXEL ),
                          NULL );
  hbmOLD  = SelectObject( hdcDST, hbmDST ); 

Auf die neu erzeugte Bitmap wird mittels ImageList_Draw das Image ausgegeben.

  ImageList_Draw( hIL, iIndex, hdcDST, 0, 0, ILD_NORMAL );

In hbmDST steht jetzt das Einzelbild als Bitmap, die als Funktionsergebnis zurückgeliefert wird.

  SelectObject( hdcDST, hbmOLD ); 
  DeleteDC( hdcDST ); 
  return hbmDST; 
}

Lösung





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-05-22 08:26:11 von textarchiv.alojado.de