如何检测 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;