【问题标题】:DirectWrite: IDWriteFontFamily::GetFontCountDirectWrite: IDWriteFontFamily::GetFontCount
【发布时间】:2022-01-15 17:19:35
【问题描述】:

当我尝试使用 DirectWrite 获取字体系列中的字体计数时,我得到了错误的结果。例如,当我查看系统字体文件夹时,Arial 字体系列有 9 种字体,但 GetFontCount 返回 14。那剩余的数字 5 是什么?这是怎么发生的?这是一个错误还是我不知道或文档没有提到的东西?这是一个最小的复制示例。

 #include <stdio.h>
 #include <stdlib.h>
 #include <wchar.h>
    
 #include <dwrite.h>
    
 #pragma comment(lib, "dwrite")
    
 IDWriteFactory* pDWriteFactory = NULL;
 IDWriteFontCollection* pFontCollection = NULL;
 IDWriteFontFamily* pFontFamily = NULL;
 IDWriteFont* pFont = NULL;
 IDWriteFontFace* pFontFace = NULL;
    
 int main()
 {
  HRESULT hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, &IID_IDWriteFactory, &pDWriteFactory);
  if (FAILED(hr))
  return -1;
    
  hr = pDWriteFactory->GetSystemFontCollection(&pFontCollection, FALSE);
    
  if (FAILED(hr))
  return -2;
    
  UINT index = 0;
  BOOL exists;
  hr = pFontCollection->FindFamilyName(L"Arial", &index, &exists);
  if (FAILED(hr))
  return -3;
  hr = pFontCollection->GetFontFamily(index, &pFontFamily);
  if (FAILED(hr))
  return -4;
  UINT count;
    
  count = pFontFamily->GetFontCount();
  if (FAILED(hr))
  return -5;
  DWRITE_FONT_METRICS metrics;
  for (int i = 0; i < count; i++)
  {
  hr = pFontFamily->GetFont(i, &pFont);
  pFont->GetMetrics(&metrics);
    
  printf("%d %d %d %d\n", metrics.designUnitsPerEm, metrics.ascent, metrics.descent, metrics.lineGap);
  }
  return 0;
 }

【问题讨论】:

    标签: c++ windows winapi directwrite


    【解决方案1】:

    DirectWrite simulates "oblique" fonts(不在物理文件中)。

    对于 Oblique,倾斜是通过执行剪切来实现的 从普通字体对字符进行转换。当一个真 斜体字体在计算机或打印机上不可用,斜体 样式可以从普通字体生成并用于模拟 斜体。

    因此,您将获得 'Oblique'、'Narrow Oblique'、'Bold Oblique'、'Narrow Bold Oblique'、'Black Oblique' 总共 14 种模拟字体。

    如果斜体可用,则不应使用斜体。

    您可以在每种字体上使用IDWriteFontFace::GetSimulations method 进行检查,这将使您返回 DWRITE_FONT_SIMULATIONS_OBLIQUE 以获取这些字体。

    【讨论】:

    • 使用较新的 API(IDWriteFactory6::GetSystemFontCollection 方法),您可以选择家族模型,控制字体在家族中的分组方式。与示例代码相比,这也会影响返回的字体数量。
    • 在使用可变字体时,特别推荐使用印刷系列的 IDWriteFactory6::GetSystemFontCollection 方法。可变字体可能具有不是粗细、拉伸或样式(即斜体或倾斜)的变化轴,并且使用较旧的 WSS 系列模型,一些命名实例可能会作为单独的系列出现在 WSS 模型中,这可能不会没有意义。
    猜你喜欢
    • 2014-03-04
    • 2013-02-26
    • 2015-01-11
    • 1970-01-01
    • 2015-04-11
    • 2015-09-04
    • 2012-06-13
    • 2020-10-27
    • 2019-08-07
    相关资源
    最近更新 更多