当我试图使用DirectWrite获取字体家族中的字体计数时,我得到了错误的结果。例如,当我查看系统字体文件夹时,Arial字体系列有9种字体,但是,GetFontCount返回14,剩余的5是什么?那是怎么发生的?这是一个bug,还是有什么我不知道,或者文档没有提到?下面是一个最小的复制示例。
#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;
}发布于 2021-12-11 11:06:00
DirectWrite 模拟“斜”字体 (不在物理文件中)。
斜角是通过对普通字体中的字符执行剪切转换来实现的。当计算机或打印机上没有真正的斜体字体时,可以从普通字体中生成斜体样式,并用来模拟斜体字体。
所以你会得到‘斜’,‘窄斜’,‘钝斜’,‘窄钝斜’,‘黑色斜’模拟字体总共14。
如果可用斜体,则不应使用斜体。
您可以使用IDWriteFontFace::GetSimulations方法对每种字体进行检查,这将为这些字体返回斜形。
https://stackoverflow.com/questions/70314268
复制相似问题