// AlphaBlendRect: Zeichnet das Rechteck ARect alphageblendet in der Farbe AColor
// und der Intensität AIntensity (0 = durchsichtig, 255 = deckend) auf den übergebenen DC.
procedure AlphaBlendRect(
DC: HDC;
const ARect: TRect; AColor: TColor; AIntensity: Byte);
var
Bitmap: TBitmap;
BlendParams: TBlendFunction;
rClip, rBlend: TRect;
function GetBlendColor: TRGBQuad;
function PreMult(b: Byte): Byte;
begin
Result := (b * AIntensity)
div $FF;
end;
var
cr: TColorRef;
begin
cr := ColorToRGB(AColor);
Result.rgbBlue := PreMult(GetBValue(cr));
Result.rgbGreen := PreMult(GetGValue(cr));
Result.rgbRed := PreMult(GetRValue(cr));
Result.rgbReserved := AIntensity;
end;
begin
GetClipBox(
DC, rClip);
//NormalizeRect(rClip); // Kannst du ignorieren
rBlend := ARect;
//NormalizeRect(rBlend); // Kannst du ignorieren
if not Windows.IntersectRect(rBlend, rClip, rBlend)
then
Exit;
Bitmap := TBitmap.Create;
try
Bitmap.PixelFormat := pf32bit;
Bitmap.SetSize(1, 1);
PRGBQuad(Bitmap.ScanLine[0])^ := GetBlendColor;
BlendParams.BlendOp := AC_SRC_OVER;
BlendParams.BlendFlags := 0;
BlendParams.SourceConstantAlpha := $FF;
BlendParams.AlphaFormat := AC_SRC_ALPHA;
Windows.AlphaBlend(
DC, rBlend.Left, rBlend.Top, RectWidth(rBlend), RectHeight(rBlend),
Bitmap.Canvas.Handle, 0, 0, 1, 1,
BlendParams);
finally
Bitmap.Free;
end;
end;