Delphi всегда принимает, что цвет пикселя в левом нижнем углу картинки является фоновым цветом и должен отображаться на экране как прозрачный. Это нигде не документировано, но если у вас есть исходники VCL, вы можете посмотреть код в BUTTONS.PAS .
9. Как отобразить bitmap в 256 цветах?
Как подгрузить 256 цветный bitmap из ресурса и отобразить его в нормальной палитре?
Обычно это делается следующим образом. Код Вадима Пузанова (Красноярск).
Image1.Bitmap.Handle := LoadBitmap(hInstance, 'BMP_NAME');
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
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);
FreeResource(ResDataHandle);
SelectPalette(DC, OldPalette, False);
DeleteDC(DC);
end else
begin
UnlockResource(ResDataHandle);
FreeResource(ResDataHandle);
BitMap := LoadBitmap(Instance, BitmapName);
end;
HB := Bitmap;
HP := Palette;
end;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
HB: HBitmap;
HP: HPalette;
begin
XLoadBitmap(hInstance, 'PHOTO', HB, HP);
Image1.Picture.Bitmap.Handle := HB;
Image1.Picture.Bitmap.Palette := HP;
end;
10. Если я хочу рассылать EXE файл, созданный в Delphi, какие еще файлы нужно посылать с ним?
Hикакие. Все компилируется в .EXE файл. Конечно, если вы разработали другие файлы (HLP, данные и т.д. ), или если вы используете VBX/OCX файлы, тогда вы должны распространять и их заодно. Если вы используете файлы VBX, то в поставку нужно также включать BIVBX11.DLL.