如何在Delphi中检测等宽字体?

时间:2017-05-09 04:29:21

标签: delphi winapi delphi-xe4

如何在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返回,但我总是得到DEFAULT_PITCH所有字体(也适用于Arial)。

1 个答案:

答案 0 :(得分:5)

是的,GetObject确实会返回DEFAULT_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;