Mega Code Archive

 
Categories / Delphi / Examples
 

Load a bitmap and palette from a resource file

This routine loads a bitmap from a resource file and gets its palette and bitmap handle: procedure LoadBitmapPalette(szTitle : PChar; var hPal : HPalette; var hBitmap : HBitmap); type TMLogPalette = record palVersion: Word; palNumEntries: Word; palPalEntry: array[0..255] of TPaletteEntry; end; var hOldPal : HPALETTE; pPal : TMLogPalette; dc : hDC; { device context for palette } hRes : THandle; { resource handle for bitmap } pBits : PBITMAPINFOHEADER; { pointer to bitmapinfoheader in resource } pRgb : ^TRGBQUAD; { Zeiger auf DIB-Palettendaten } i : integer; Data : PChar; begin hRes := FindResource(hInstance, szTitle, RT_BITMAP); if hRes <> 0 then hRes := LoadResource(hInstance, hRes); if hRes <> 0 then begin pBits := PBITMAPINFOHEADER (LockResource(hRes)); { so: having 16 colors, we do not need a palette (LoadBitmap is allright) > 256 colors: no palette is needed ("hi-/direct/true color") } if (pBits^.biBitCount <= 8) and { only for <= 256 color bitmaps } (pBits^.biSize = sizeof(TBITMAPINFOHEADER)) { only Windows-bitmaps, not OS/2 } then begin pRgb := pointer (pBits); inc (PChar(pRgb), pBits^.biSize); pPal.palNumEntries := 1 shl pBits^.biBitCount; pPal.palVersion := $300; for i := 0 to pPal.palNumEntries-1 do begin pPal.palPalEntry[i].peRed := pRgb^.rgbRed; pPal.palPalEntry[i].peGreen := pRgb^.rgbGreen; pPal.palPalEntry[i].peBlue := pRgb^.rgbBlue; pPal.palPalEntry[i].peFlags := 0{PC_NOCOLLAPSE}; inc (PChar(pRgb), 4); end; hPal := CreatePalette(PLogPalette(@pPal)^); DC := GetDC(0); hOldPal := SelectPalette(DC, hPal, false); RealizePalette(DC); with pBits^ do begin biClrImportant := 0; biClrUsed := 0; end; Data := pointer(pBits); inc (Data, pBits^.biSize + pPal.palNumEntries * sizeof(TRGBQUAD)); hBitmap := CreateDIBitmap(DC, pBits^, CBM_INIT, Data, PBitmapInfo(pBits)^, dib_RGB_Colors); SelectPalette(DC,hOldPal,FALSE); ReleaseDC(0, DC); end; UnlockResource(hRes); end else hBitmap := LoadBitmap(hInstance, szTitle); end;