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

  显示原文与译文双语对照的内容

我正在尝试创建一个函数来创建一个 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);

问题

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

有人能告诉我我需要做什么才能将背景作为透明的"填充"?

时间: 作者:

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


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

这就是结果:

enter image description here

...