我想在Canvas上绘制一个透明的TMetaFile,用于打印水印。
问题是AlphaBlend函数不会将TMetaFile.Handle识别为源,因为它需要画布处理。
我创建了一个具有透明度的32位位图,但绘制它会强制白色背景,因此在Canvas上你可以看到一个alpha混合矩形。 如何在屏幕/打印机画布上绘制透明TMetaFile?
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;
答案 0 :(得分:4)
如果您查看MSDN官方文档,您将收到以下声明: http://msdn.microsoft.com/en-us/library/dd183351(VS.85).aspx
如果源设备上下文标识增强型图元文件设备上下文,则会发生错误(并且函数返回FALSE)。
我的第一个猜测是,即使MSDN只讨论源设备上下文,你的代码也不会使用AlphaBlend,它可以在两个位图之间工作。
但是,在第二次调查之后,Meta File枚举函数中有一个专用的TEMRAlphaBlend记录类型。所以它应该按预期工作。
你用什么来显示元文件? 我们需要您在此处显示元文件的代码。
我的建议是将元文件保存到emf文件中,然后使用emfexplorer检查其上下文。
我们开发了一个名为SynGdiPlus的开源单元,用于使用GDI +绘制元文件,因此在纯Delphi中使用抗锯齿。但是我们还没有实现TEMRAlphaBlend记录类型。如果您觉得有兴趣在您的应用程序中使用抗锯齿绘图,我可以看看实现它。