代码之家  ›  专栏  ›  技术社区  ›  too

用Delphi在TCanvas上绘制透明TMetaFile

  •  2
  • too  · 技术社区  · 15 年前

    问题是AlphaBlend函数无法将TMetaFile.Handle识别为源,因为它需要画布句柄。

    如何在屏幕/打印机画布上绘制透明的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;
    
    1 回复  |  直到 15 年前
        1
  •  4
  •   A.Bouchez    15 年前

    如果您查看MSDN官方文档,您将得到以下声明: http://msdn.microsoft.com/en-us/library/dd183351(VS.85).aspx

    如果源设备上下文标识增强的元文件设备上下文,则会发生错误(函数返回FALSE)。

    但是,经过第二次调查,在元文件枚举样式中有一个专用的TEMRAlphaBlend记录类型。所以它应该如预期的那样工作。

    你用什么来显示你的元文件? 我们需要您用于在此处显示元文件的代码。

    我的建议是将元文件保存到emf文件中,然后使用emfexplorer检查其上下文。