透かしの印刷に使用される透明な TMetaFile を Canvas に描画したいと思います。
問題は、AlphaBlend 関数が TMetaFile.Handle をソースとして認識しないことです。キャンバス ハンドルが必要です。
透明度のある 32 ビット ビットマップを作成しましたが、その上に描画すると背景が白くなるため、Canvas ではアルファ ブレンドされた四角形が表示されます。透明な TMetaFile をスクリーン/プリンター Canvas にペイントするにはどうすればよいですか?
TMetaFile は確かに透過的です。IE を使用して非標準の背景色で単純な Web ページでテストしました。ソースコード:
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;