Domanda

I'm trying to create a function to create a TBitmap. This bitmap will be a Glyph with Transparent background, and it will be only a character of the Wingdings font.

After this, I will use this glyph to assign to a TBitBtn (button).

This is my current code:

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;

Usage:

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

The problem:

The resulting bitmap isn't transparent, the background becomes black!

Can someone tell me what I need to do to "fill" the background as transparent?

È stato utile?

Soluzione

According to what I understood , you want the background of bitmap to be transparent ? If so , you need to use alpha channel bitmap .. By default the background color is black so you only need to set the property AlphaFormat of your bitmap to afDefined :

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

And this is the result :

enter image description here

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top