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

ki0zmccv  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(161)

如何在 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。它应该返回lfPitchAndFamilyFIXED_PITCH,但我总是得到DEFAULT_PITCH的所有字体(也为Arial)。

rhfm7lfc

rhfm7lfc1#

是的,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;

**编辑:**在较新的 Delphi 版本中,EnumFontFamilies函数被描述为返回Integer结果(与MSDN一致),正如Andreas Rejbrand在注解中注意到的,因此结果应被视为:

if EnumFontFamilies(Canvas.Handle,
                     PChar('Courier New'),
                     @EnumFontsProc,0)  <> 0  then

相关问题