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

标签 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)。

最佳答案

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

关于delphi - 如何在 Delphi 中检测等宽字体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43861156/

相关文章:

delphi - Application.CreateForm() 形成可见性/状态

c++ - 关于c++命名约定的问题

delphi - 如何更改ListView OnDrag图像?

delphi - VCL.位图到 FMX.位图

delphi - 无效的指针操作

delphi - D2010的更新真的有意义吗

c++ - 拆分没有拆分条的窗口

delphi - TChart 中的热图

delphi - 如何使用 OLE 绕过 MS Word 搜索替换中的 255 个字符限制

c - 初始化常用控件以使用 StatusBar(ICC_WIN95_CLASSES 与 ICC_BAR_CLASSES)