使用带GDI +的DrawText创建透明字形

时间:2014-01-16 11:44:34

标签: delphi transparency gdi+

我正在尝试创建一个创建TBitmap的函数。 此位图将是具有透明背景的字形,并且它将只是Wingdings字体的字符。

在此之后,我将使用此字形分配给TBitBtn(按钮)。

这是我目前的代码:

function CreateTransparent(aChar: Char; aFontSize, aWidth, aHeight: Integer; aColor: TColor): TBitmap;

  function _GPColor(Col: TColor): TGPColor;
  begin
    Result := ColorRefToARGB(ColorToRGB(Col));
  end;

var
  f: TGPFont;
  r, rTx: TGPRectF;
  b: TGPSolidBrush;
  c: TGPGraphics;
  tx: TGPStringFormat;
  bt: TGPBitmap;
  h: HBITMAP;
  bk, fg: Cardinal;
  s: string;
  attr: TGPImageAttributes;
begin
  s := aChar;
  fg := _GPColor(aColor);

  bt := TGPBitmap.Create(abs(aWidth), aHeight, PixelFormat32bppARGB);
  try
    c := TGPGraphics.Create(bt);

    f := TGPFont.Create('Wingdings', aFontSize, FontStyleRegular, UnitPixel);
    b := TGPSolidBrush.Create( MakeColor(0, 0, 0, 0) );
    tx := TGPStringFormat.Create;
    try
      // configura o device
      tx.SetLineAlignment(StringAlignmentCenter);

      r.X := 0;
      r.Y := 0;
      r.Width := 2000;
      r.Height := aHeight;

      c.MeasureString(WideString(s), -1, f, r, rTx);
      if (aWidth < 0) and (rTx.Width > Abs(aWidth)) then
      begin
        c.Free;
        bt.Free;

        aWidth := Ceil(rTx.Width);

        bt := TGPBitmap.Create(aWidth, aHeight, PixelFormat32bppARGB);
        c := TGPGraphics.Create(bt);
      end;

      c.SetTextRenderingHint(TextRenderingHintAntiAlias);

      // inicializa as variáveis
      r.X := 0;
      r.Y := 0;
      r.Width := bt.GetWidth;
      r.Height := bt.GetHeight;

      // escreve o texto
      b.SetColor(fg);

      c.DrawString(WideString(s), -1, f, r, tx, b);
    finally
      f.Free;
      b.Free;
      tx.Free;
      c.Free;
    end;

    Result := TBitmap.Create;
    if bt.GetHBITMAP(0, h)= ok then
      TBitmap(Result).Handle := h;
  finally
    bt.Free;
  end;
end;

用法:

myGlyph := CreateTransparent('N', 14, 16, 16, clGray);

问题:

生成的位图不透明,背景变黑!

有人能告诉我我需要做些什么来“填充”背景透明吗?

1 个答案:

答案 0 :(得分:1)

根据我的理解,您希望位图的背景是透明的吗? 如果是这样,你需要使用alpha通道位图.. 默认情况下,背景颜色为黑色,因此您只需将位图的属性AlphaFormat设置为afDefined

...
Result := TBitmap.Create;
Result.AlphaFormat := afDefined;
if bt.GetHBITMAP(0, h) = ok then
  TBitmap(Result).Handle := h;
...

这就是结果:

enter image description here