Я хотел бы нарисовать прозрачный TMetaFile на холсте, используемом для печати водяного знака.
Проблема в том, что функция AlphaBlend не распознает TMetaFile.Handle в качестве источника, поскольку она ожидает дескриптор холста.
Я создал 32-битное растровое изображение с прозрачностью, но рисование на нем заставит белый фон, поэтому на Canvas вы можете видеть прямоугольник с альфа-смешиванием.Как нарисовать прозрачный TMetaFile на экране / принтере Canvas?
TMetaFile, безусловно, прозрачный, я тестировал его на простой веб-странице с использованием IE с нестандартным цветом фона.Исходный код:
procedure TPainter.DrawAlpha(ACanvas: TCanvas; ARect: TRect; AGraphic: TMetafile; AAlpha: Byte);
var
bmp: TBitmap;
bf: BLENDFUNCTION;
begin
bmp := TBitmap.Create;
try
bmp.PixelFormat := pf32bit;
bmp.SetSize(ARect.Right - ARect.Left, ARect.Bottom - ARect.Top);
bmp.Transparent := True;
bmp.Canvas.Brush.Color := clNone;
bmp.Canvas.Brush.Style := bsClear;
bmp.Canvas.FillRect(Rect(0, 0, ARect.Right - ARect.Left, ARect.Bottom - ARect.Top));
bmp.Canvas.StretchDraw(Rect(0, 0, ARect.Right - ARect.Left, ARect.Bottom - ARect.Top), AGraphic);
bf.BlendOp := AC_SRC_OVER;
bf.BlendFlags := 0;
bf.SourceConstantAlpha := 230;
bf.AlphaFormat := 0;
AlphaBlend(
ACanvas.Handle,
ARect.Left,
ARect.Top,
ARect.Right - ARect.Left,
ARect.Bottom - ARect.Top,
bmp.Canvas.Handle,
0,
0,
ARect.Right - ARect.Left,
ARect.Bottom - ARect.Top,
bf
);
finally
bmp.Free;
end;
end;