如何检测 Delphi 中的等宽字体?
How can I detect monospace fonts in Delphi?
如何在 Delphi 中检测等宽字体?
我认为 TFont.Pitch
应该是 fpFixed
,但它不适用于 Delphi XE4:
var
Font: TFont;
begin
Font := TFont.Create;
Font.Name := 'Courier New';
if Font.Pitch = fpFixed then
ShowMessage('Monospace Font!');
...
Font.Pitch
基于 WinAPI 的 GetObject
。它应该 lfPitchAndFamily
FIXED_PITCH
中的 return,但我总是得到 DEFAULT_PITCH
所有字体(也适用于 Arial)。
是的,GetObject
真的returnsDEFAULT_PITCH
。但是你可以通过枚举所需名称的字体来获得真正的价值:
function EnumFontsProc(var elf: TEnumLogFont;
var tm: TNewTextMetric;
FontType: Integer;
Data: LPARAM): Integer; stdcall;
begin;
Result := Integer(FIXED_PITCH = (elf.elfLogFont.lfPitchAndFamily and FIXED_PITCH));
end;
procedure TForm1.Button13Click(Sender: TObject);
begin;
if EnumFontFamilies(Canvas.Handle,
PChar('Courier New'),
@EnumFontsProc,0) then
Caption := 'Fixed'
else
Caption := 'Variable';
end;
如何在 Delphi 中检测等宽字体?
我认为TFont.Pitch
应该是 fpFixed
,但它不适用于 Delphi XE4:
var
Font: TFont;
begin
Font := TFont.Create;
Font.Name := 'Courier New';
if Font.Pitch = fpFixed then
ShowMessage('Monospace Font!');
...
Font.Pitch
基于 WinAPI 的 GetObject
。它应该 lfPitchAndFamily
FIXED_PITCH
中的 return,但我总是得到 DEFAULT_PITCH
所有字体(也适用于 Arial)。
是的,GetObject
真的returnsDEFAULT_PITCH
。但是你可以通过枚举所需名称的字体来获得真正的价值:
function EnumFontsProc(var elf: TEnumLogFont;
var tm: TNewTextMetric;
FontType: Integer;
Data: LPARAM): Integer; stdcall;
begin;
Result := Integer(FIXED_PITCH = (elf.elfLogFont.lfPitchAndFamily and FIXED_PITCH));
end;
procedure TForm1.Button13Click(Sender: TObject);
begin;
if EnumFontFamilies(Canvas.Handle,
PChar('Courier New'),
@EnumFontsProc,0) then
Caption := 'Fixed'
else
Caption := 'Variable';
end;