我想创建一个浮动(顶层)窗口,只显示反锯齿文本(没有其他窗口元素)。我试图使用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+。
1条答案
按热度按时间7cjasjjr1#
你想使用反锯齿渲染,因此,改变当前的
第一个月
到
g.SetTextRenderingHint(TextRenderingHintAntiAliasGridFit);
个