Windows Programmierung: Bitmaps
Willemers Informatik-Ecke

Quelle der Bitmap

Mit der Funktion LoadBitmap kann eine Bitmap aus der Ressource geladen werden. Das ist praktikabel, wenn eine begrenzte Zahl festgelegter Bitmaps im Programm verwendet werden.

Als Ergebnis erhält man ein Handle auf eine Bitmap vom Typ HBITMAP.

Die BITMAP-Struktur

typedef struct tagBITMAP {
   LONG   bmType; 
   LONG   bmWidth; 
   LONG   bmHeight; 
   LONG   bmWidthBytes; 
   WORD   bmPlanes; 
   WORD   bmBitsPixel; 
   LPVOID bmBits; 
} BITMAP; 

bmType wird auf 0 gesetzt
bmWidth die Breite der Bitmap in Pixeln
bmHeight die Höhe der Bitmap in Pixeln
bmWidthBytes die benötigten Byte pro Zeile (muss durch 2 teilbar sein)
bmPlanes Anzahl der Farbebenen
bmBitsPixel Anzahl der Bits pro Pixel
bmBits Zeiger auf das Bit-Array

Ermitteln der BITMAP aus einem HBITMAP:

	HBITMAP hBitmap;
	BITMAP bmp;
	hBitmap = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP1));
	GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bmp);

Darstellen einer Bitmap

Kompatibler Devicekontext

Man kann zu einem aktuellen Devicekontext (DC) einen kompatiblen erzeugen, diesen mit der Bitmap verbinden und anschliessend eine Kopie an eine beliebige Stelle des aktuellen DC erzeugen.

	BITMAP bmp; GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bmp);
	HDC hdcBmp; hdcBmp = CreateCompatibleDC(hdc); 
	SelectObject(hdcBmp, hBitmap);
	BitBlt(hdc,150,120, bmp.bmWidth,bmp.bmHeight, hdcBmp, 0,0, SRCCOPY);

Im ersten Schritt wird per GetObject eine BITMAP-Struktur gefüllt, um daraus später die Grösse der Bitmap für das Kopieren zu ermitteln. Dann wird der kompatible DC erzeugt (CreateCompatibleDC) und mit der Bitmap verbunden (SelectObject). Jetzt wird per BitBlt in den Ausgangs-DC an die Position 150,120 die Bitmap aus dem kompatiblen DC kopiert.

Bitmap als Pattern

Aus einer Bitmap kann man einen BRUSH erzeugen. Dieser Brush wird für den Device-Kontext angelegt (selektiert) und anschliessend ein Rechteck mit dem Muster gefüllt. Nach dem Zeichnen muss das BRUSH-Objekt wieder freigegeben werden.

HBRUSH hbr, hbrPrevious;
RECT rc;

	hbr = CreatePatternBrush(hBitmap);
	hbrPrevious = (HBRUSH)SelectObject(hdc, hbr);
	GetClientRect(hWnd, &rc);
	PatBlt(hdc, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, PATCOPY);
	SelectObject(hdc, hbrPrevious);
	DeleteObject(hbr);

Das Beispiel füllt den gesamten Fensterbereich kachelweise mit der Bitmap.