在 Delphi 中创建浮动的反锯齿文本窗口

kiayqfof  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(83)

我想创建一个浮动(顶层)窗口,只显示反锯齿文本(没有其他窗口元素)。我试图使用GDI+绘制文本,以保持文本渲染位图上的alpha通道,但我有有限的成功。
我可以创建一个透明的位图,但它看起来好像文本绘制功能认为背景是黑色的,而不是透明的,导致不良的锯齿文物。
我已经附上了完整的代码,我错过了什么?:

uses GDIPAPI ,GDIPOBJ;

var
  GDIPToken: ULONG;
  GDIStartupInput: TGDIPlusStartupInput;

procedure TOSDInfoForm.FormCreate(Sender: TObject);
var
  bmp: TBitmap;
  blend: TBLENDFUNCTION;
  pointSrc, pointForm: TPoint;
  bmpsize: TSize;
  g: TGPGraphics;
  fontFamily: TGPFontFamily;
  font: TGPFont;
  brush: TGPSolidBrush;
  status: TStatus;
begin
  BorderStyle := bsNone;
  FormStyle := fsStayOnTop;

  SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);

  GDIStartupInput.SuppressBackgroundThread := False;
  GDIStartupInput.SuppressExternalCodecs := False;
  GDIStartupInput.GdiplusVersion := 1;
  GdiplusStartup(GDIPToken, @GDIStartupInput, nil);

  bmp := TBitmap.Create;
  try
    bmp.PixelFormat := pf32bit;
    bmp.Width  := Width;
    bmp.Height := Height;

    g := TGPGraphics.Create(bmp.Canvas.Handle);
    try
      //g.SetTextRenderingHint(TextRenderingHintClearTypeGridFit);
      g.SetTextRenderingHint(TextRenderingHintAntiAliasGridFit);
      g.Clear(MakeColor(0, 0, 0, 0));  // Clear with full transparent

      fontFamily := TGPFontFamily.Create('Arial');
      font := TGPFont.Create(fontFamily, 32, FontStyleRegular, UnitPixel);
      brush := TGPSolidBrush.Create(MakeColor(255, 255, 0, 0)); // Red text

      g.DrawString('Hello, World!', -1, font, MakePoint(10.0, 10.0), brush);

      brush.Free;
      font.Free;
      fontFamily.Free;
    finally
      g.Free;
    end;

    pointSrc := Point(0, 0);
    pointForm := Point(Left, Top);

    bmpsize.cx := bmp.Width;
    bmpsize.cy := bmp.Height;

    blend.BlendOp := AC_SRC_OVER;
    blend.BlendFlags := 0;
    blend.SourceConstantAlpha := 255; // Opaque
    blend.AlphaFormat := AC_SRC_ALPHA;

    UpdateLayeredWindow(Handle, 0, @pointForm, @bmpsize, bmp.Canvas.Handle, @pointSrc, 0, @blend, ULW_ALPHA);
  finally
    bmp.Free;
  end;
end;

procedure TOSDInfoForm.FormDestroy(Sender: TObject);
begin
  GdiplusShutdown(GDIPToken);
end;

字符串

**编辑:**上面的代码是功能感谢汤姆的提示,随意使用它在自己的代码,考虑到它使用GDI+,这需要至少Windows 7工作,而不必手动安装GDI+。

7cjasjjr

7cjasjjr1#

你想使用反锯齿渲染,因此,改变当前的
第一个月

g.SetTextRenderingHint(TextRenderingHintAntiAliasGridFit);

相关问题