Bri*_*ost 20 delphi fonts truetype smoothing
我有理由在Delphi表格上需要一个带有大字体的标签,并注意到它的曲线仍然略带锯齿状.我在MSWord中将它与相同的大小和字体进行了比较,这更加平滑.经过研究,我发现代码可以让我平滑我的字体,但它很乱,我想知道是否有更好的方法?看着VCL的来源,TFont似乎坚持NONANTIALIASED_QUALITY,这是相当令人沮丧的......
谢谢Bri
procedure TForm1.SetFontSmoothing(AFont: TFont);
var
tagLOGFONT: TLogFont;
begin
GetObject(
AFont.Handle,
SizeOf(TLogFont),
@tagLOGFONT);
tagLOGFONT.lfQuality := ANTIALIASED_QUALITY;
AFont.Handle := CreateFontIndirect(tagLOGFONT);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
I : integer;
begin
For I :=0 to ComponentCount-1 do
If Components[I] is TLabel then
SetFontSmoothing( TLabel( Components[I] ).Font );
end;
Run Code Online (Sandbox Code Playgroud)
mgh*_*hie 29
您可以欺骗VCL创建自己继承的类TLabel
.这是使用Delphi 4测试的概念验证代码,它可以帮助您入门.
为您自己的TLabel
班级创建一个新单元:
unit AntiAliasedLabel;
interface
uses
Windows, Messages, SysUtils, Controls, StdCtrls, Graphics;
type
TLabel = class(StdCtrls.TLabel)
private
fFontChanged: boolean;
public
procedure Paint; override;
end;
implementation
procedure TLabel.Paint;
var
LF: TLogFont;
begin
if not fFontChanged then begin
Win32Check(GetObject(Font.Handle, SizeOf(TLogFont), @LF) <> 0);
LF.lfQuality := ANTIALIASED_QUALITY;
Font.Handle := CreateFontIndirect(LF);
fFontChanged := TRUE;
end;
inherited;
end;
end.
Run Code Online (Sandbox Code Playgroud)
现在修改包含标签表单单元,添加AntiAliasedLabel
单元之后 StdCtrls
.这会导致您自己的类AntiAliasedLabel.TLabel
被创建通常StdCtrls.TLabel
会被创建.
恕我直言,VCL应检查系统默认字体平滑并在运行时将其应用为默认值.如果没有,至少它应默认为更合理的平滑.有人可能会争辩说,在这种情况下,ClearType将是一个更好的默认值,考虑到目前> 50%的显示器是LCD(并且超过50%的机器运行XP或更好).
这是一个公认的黑客攻击(正如Ken White提到的那样,如果有替代方案,那么这不是最好的方法),但是我需要一种方法来全局修复包含数百种第三方组件类型的表单(使组件继承变得不切实际).
我更改了Graphics.pas,TFont.GetHandle中的默认字体质量,如下所示:
// lfQuality:= DEFAULT_QUALITY;
lfQuality:= 5; // (HACK) CLEARTYPE_QUALITY,强制清除类型
小智 5
来自:http://objectmix.com/delphi/725245-tlabel-antialiasing-possibile-3.html
"简单地使用支持字体平滑的字体应该解决这个问题.德尔福使用(或至少习惯使用)MS Sans Serif作为默认值,它不支持平滑(ClearType或其他).如果你将字体设置为Tahoma(最适合XP)或Segoe UI(最适合Vista),您将根据Delphi应用程序中的系统设置自动获得字体平滑."
经过确认,使用Delphi XE和Win7可以很好地工作.忙着改变我现在所有的字体;-)
归档时间: |
|
查看次数: |
7534 次 |
最近记录: |