Читать «Виртуальная библиотека Delphi» онлайн - страница 115

Unknown

Delphi всегда принимает, что цвет пикселя в левом нижнем углу картинки является фоновым цветом и должен отображаться на экране как прозрачный. Это нигде не документировано, но если у вас есть исходники VCL, вы можете посмотреть код в BUTTONS.PAS .

9. Как отобразить bitmap в 256 цветах?

Как подгрузить 256 цветный bitmap из ресурса и отобразить его в нормальной палитре?

Обычно это делается следующим образом. Код Вадима Пузанова (Красноярск).

Image1.Bitmap.Handle := LoadBitmap(hInstance, 'BMP_NAME');

LoadBitmap загружает только картинку, без палитры. Если палитра у картинки отличается от системной, то ее надо устанавливать "вручную". Могут возникнуть проблемы, если на одной форме расположены две картинки с разными палитрами.

procedure XLoadBitmap(Instance: THandle; BitmapName: PChar; var HB: HBitmap; var HP: Palette);

var

  DC: HDC;

  BI: PBitMapInfo;

  Pal: PLogPalette;

  I: Integer;

  ResIdHandle: THandle;

  ResDataHandle: THandle;

  Bitmap: HBitmap;

  C: HWnd;

  OldPalette, Palette: HPalette;

begin

  Bitmap := 0;

  Palette := 0;

  HB := 0;

  HP := 0;

{ Получить ресурс из модуля }

  ResIDHandle := FindResource(Instance, BitmapName, RT_BITMAP);

  if ResIDHandle <> 0 then

  begin

    ResDataHandle := LoadResource(Instance, ResIDHandle);

    if ResDataHandle <> 0 then

    begin

      BI := LockResource(ResDataHandle);

      if BI <> nil then

      begin

      { 256-цветный битмап? }

        if BI^.bmiHeader.biBitCount = 8 then

        begin

        { Создать палитру }

          GetMem(Pal, SizeOf(TLogPalette) + 256*SizeOf(TPaletteEntry));

          for I := 0 to 255 do with Pal^.palPalEntry[I] do

          begin

            peRed  := BI^.bmiColors[I].rgbRed;

            peGreen:= BI^.bmiColors[I].rgbGreen;

            peBlue := BI^.bmiColors[I].rgbBlue;

            peFlags:= 0;

          end;

          Pal^.palNumEntries := 256;

          Pal^.palVersion := $300;

          Palette := CreatePalette(Pal^);

          FreeMem(Pal, SizeOf(TLogPalette) + 256 * SizeOf(TPaletteEntry));

        { Привести цвета палитры в системные }

          DC := CreateDC('Display', nil, nil, nil);

          OldPalette := SelectPalette(DC, Palette, False);

          UnrealizeObject(Palette);

          RealizePalette(DC);

        { Создать битмап }

          BitMap:= CreateDIBitmap(DC, BI^.bmiHeader, CBM_INIT,

            @PByteArray(BI)^[SizeOf(TBitMapInfo) + SizeOf(TRGBQuad) * 256 - 4], BI^, DIB_RGB_COLORS);

        { Освободить ресурсы }

          UnlockResource(ResDataHandle);