当我打开Windows公共字体对话框时,它会为每种字体列出一堆大小。对于所有OpenType / TrueType字体,它具有相同的列表 - 9,10,11,12,14,16,18 ...对于位图字体,列表根据可用位图而变化。 “小字体”有2,3,4,5,6,7,而普通的Courier有10,12,15。我不知道,但我从以前的阅读中领先,相信即使对于TrueType字体,某些尺寸将被暗示并且看起来比所有其他尺寸更好,所以我可能还会看到一个尺寸更为有限的TrueType字体。
我正在我的应用程序中实现一项功能,Ctrl + Mousewheel将在浏览器中上下调整字体大小。我想确定一个字体的可用大小列表,这样如果我目前的大小为12,我的应用程序知道对于Courier New,下一个合适的较大尺寸是14,而对于普通的Courier,它是15。
我该怎么做?
答案 0 :(得分:5)
有关如何枚举特定字体的字体/字体大小的说明,请参阅here。请注意,TrueType字体可以以任何大小显示(而不仅仅是预定的字体),因为它们是基于矢量的。
int EnumFontSizes(char *fontname)
{
LOGFONT logfont;
ZeroMemory(&logfont, sizeof logfont);
logfont.lfHeight = 0;
logfont.lfCharSet = DEFAULT_CHARSET;
logfont.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE;
lstrcpy(logfont.lfFaceName, fontname);
EnumFontFamiliesEx(hdc, &logfont, (FONTENUMPROC)FontSizesProc, 0, 0);
return 0;
}
int CALLBACK FontSizesProc(
LOGFONT *plf, /* pointer to logical-font data */
TEXTMETRIC *ptm, /* pointer to physical-font data */
DWORD FontType, /* font type */
LPARAM lParam /* pointer to application-defined data */
)
{
static int truetypesize[] = { 8, 9, 10, 11, 12, 14, 16, 18, 20,
22, 24, 26, 28, 36, 48, 72 };
int i;
if(FontType != TRUETYPE_FONTTYPE)
{
int logsize = ptm->tmHeight - ptm->tmInternalLeading;
long pointsize = MulDiv(logsize, 72, GetDeviceCaps(hdc, LOGPIXELSY));
for(i = 0; i < cursize; i++)
if(currentsizes[i] == pointsize)
return 1;
printf("%d ", pointsize);
currentsizes[cursize] = pointsize;
if(++cursize == 200) return 0;
return 1;
}
else
{
for(i = 0; i < (sizeof(truetypesize) / sizeof(truetypesize[0])); i++)
{
printf("%d ", truetypesize[i]);
}
return 0;
}
}