首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DirectWrite: IDWriteFontFamily家族::GetFontCount

DirectWrite: IDWriteFontFamily家族::GetFontCount
EN

Stack Overflow用户
提问于 2021-12-11 10:12:22
回答 1查看 105关注 0票数 1

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

代码语言:javascript
复制
 #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;
 }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-11 11:06:00

DirectWrite 模拟“斜”字体 (不在物理文件中)。

斜角是通过对普通字体中的字符执行剪切转换来实现的。当计算机或打印机上没有真正的斜体字体时,可以从普通字体中生成斜体样式,并用来模拟斜体字体。

所以你会得到‘斜’,‘窄斜’,‘钝斜’,‘窄钝斜’,‘黑色斜’模拟字体总共14。

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

您可以使用IDWriteFontFace::GetSimulations方法对每种字体进行检查,这将为这些字体返回斜形

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70314268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档