Bitmaps im Label anzeigen


Das Label lässt sich auch als Grundlage zur Anzeige von Bitmaps verwenden, wie man es von der TImage-Komponente der VCL kennt. Als Beispiel erzeugen wir ein zweites Control, auf der Grundlage des Labels, mit zwei erweiterten Stilelementen:

hwndImage := CreateWindowEx(0, 'STATIC', '',
  WS_VISIBLE or WS_CHILD or {neue Stilattribute ->} SS_BITMAP or SS_REALSIZEIMAGE,
  9, 6, {w & h werden ignoriert ->} 0, 0, hWnd, IDC_IMAGE, hInstance, nil);

Die Attribute SS_BITMAP und SS_REALSIZEIMAGE geben an, dass eine Bitmap aus den Ressourcen im Control angezeigt werden soll, und dass die Größe der Bitmap nicht geändert wird, nachdem sie geladen oder gezeichnet wurde. Ist die Grafik größer als der zur Verfügung stehende Bereich, wird sie entsprechend abgeschnitten.

Im nächsten Schritt holen wir die Bitmap aus den Ressourcen und zeigen Sie im Control an. Dazu nutzen wir die Nachricht "STM_SETIMAGE", mit der wir auch Symbole und Cursor anzeigen lassen können:

hBmp := LoadBitmap(hInstance,MAKEINTRESOURCE(300));
SendMessage(hwndImage,STM_SETIMAGE,IMAGE_BITMAP,hBmp);

Nachteilig ist aber, dass (in diesem Fall) die Bitmap Teil des Programms sein muss. Je nach Größe der Grafik nimmt also auch der Umfang des kompilierten Programms zu. Die Funktion LoadImage ist daher vorzuziehen, denn hier können wir einen Dateinamen angeben. Die Bitmap muss nicht mit kompiliert werden, und das Programm bleibt klein:

hBmp := LoadImage(0,                // Null bei der Verwendung von Dateien
                  'image.bmp',      // Dateiname
                  IMAGE_BITMAP,     // Typ
                  165, 314,         // Breite, & Höhe
                  LR_LOADFROMFILE); // notwendiges Flag

In der Hilfe und im MSDN finden Sie die Parameter genauer erklärt. Hier soll nur wichtig sein, dass Sie das Flag LR_LOADFROMFILE setzen müssen, und dass Sie den Dateinamen dann als zweiten Parameter angeben. Sie sollten zur Sicherheit aber den kompletten Pfadnamen angeben.

Und vergessen Sie bitte nicht, die Bitmap beim Beenden des Programms wieder freizugeben:

DeleteObject(hBmp);