Я нашел решение, которое позволит вам нарисовать изображение BMP с альфа-каналом в форме, используя только Windows API:
const
AC_SRC_OVER = 0;
AC_SRC_ALPHA = 1;
type
BLENDFUNCTION = packed record
BlendOp,
BlendFlags,
SourceConstantAlpha,
AlphaFormat: byte;
end;
function WinAlphaBlend(hdcDest: HDC; xoriginDest, yoriginDest, wDest, hDest: integer;
hdcSrc: HDC; xoriginSrc, yoriginSrc, wSrc, hSrc: integer; ftn: BLENDFUNCTION): LongBool;
stdcall; external 'Msimg32.dll' name 'AlphaBlend';
procedure TForm4.FormClick(Sender: TObject);
var
hbm: HBITMAP;
bm: BITMAP;
bf: BLENDFUNCTION;
dc: HDC;
begin
hbm := LoadImage(0,
'C:\Users\Andreas Rejbrand\Skrivbord\RatingCtrl.bmp',
IMAGE_BITMAP,
0,
0,
LR_LOADFROMFILE);
if hbm = 0 then
RaiseLastOSError;
try
if GetObject(hbm, sizeof(bm), @bm) = 0 then RaiseLastOSError;
dc := CreateCompatibleDC(0);
if dc = 0 then RaiseLastOSError;
try
if SelectObject(dc, hbm) = 0 then RaiseLastOSError;
bf.BlendOp := AC_SRC_OVER;
bf.BlendFlags := 0;
bf.SourceConstantAlpha := 255;
bf.AlphaFormat := AC_SRC_ALPHA;
if not WinAlphaBlend(Canvas.Handle,
10,
10,
bm.bmWidth,
bm.bmHeight,
dc,
0,
0,
bm.bmWidth,
bm.bmHeight,
bf) then RaiseLastOSError;
finally
DeleteDC(dc);
end;
finally
DeleteObject(hbm);
end;
end;
Используя GIMP, я преобразовал изображение PNG.
![](https://i.stack.imgur.com/RJZBA.png)
нашел здесь 32-битное растровое изображение RGBA, нашел здесь, и результат очень хороший:
![](https://privat.rejbrand.se/gdiblend1.png)
![](https://privat.rejbrand.se/gdiblend2.png)
![](https: / /privat.rejbrand.se/gdiblend3.png )
person
Andreas Rejbrand
schedule
11.05.2011
TImage
. Delphi 7 не поддерживает PNG ... - person Andreas Rejbrand   schedule 11.05.2011TImage
, а на самом деле используетеTntImage
! - person Andreas Rejbrand   schedule 11.05.2011