如果我运行下面的代码,我会使用“cambria Math”字体获得tm和gm结构的以下值:
tm.tmHeight = 161
tm.tmAscent = 90
tm.tmDescent = 71
和
gm.gmBlackBoxY = 14
tm
中的值明显错误! gmBlackBoxY
似乎是正确的。
现在,如果我用
运行代码lfFaceName = "Arial"
我得到tm
和gm
以下值,这是正确的:
tm.tmHeight = 33
tm.tmAscent = 27
tm.tmDescent = 6
和
gm.gmBlackBoxY = 15
代码:
int iLogPixelsY;
iLogPixelsY = GetDeviceCaps(hdc,LOGPIXELSY);
LOGFONT lf;
int iPts;
iPts = 22;
memset(&lf, 0, sizeof(LOGFONT));
lf.lfHeight = -iPts * iLogPixelsY / 72;
lf.lfWeight = FW_NORMAL;
lf.lfItalic = 0;
lf.lfCharSet = 0;
lf.lfOutPrecision = OUT_TT_ONLY_PRECIS;
wcscpy(lf.lfFaceName, L"Cambria Math");
HFONT hFont;
hFont = CreateFontIndirect(&lf);
hFont = (HFONT)SelectObject(hdc, hFont);
TCHAR tx;
tx = 'a';
TEXTMETRIC tm;
GetTextMetrics(hdc, &tm);
GLYPHMETRICS gm;
GetGlyphOutline(hdc, tx, GGO_METRICS, &gm, 0, NULL, &gmat);
有人能解释为获得“Cambria Math”字体的TEXTMETRIC
结构明显不正确吗?
答案 0 :(得分:1)
代码中的不正确不适用于获取TEXTMETRIC结构(不包括在同一代码中使用TCHAR,CHAR和WCHAR函数和变量)。
tm.tmHeight == 161;
tm.tmAscent == 90;
tm.tmDescent == 71;
tm.tmInternalLeading == 132;
以上行没有任何错误!
tm.tmHeight == tm.tmAscent + tm.tmDescent;
tm.tmHeight == tm.tmInternalLeading + MulDiv(22,GetDeviceCaps(hdc,LOGPIXELSY),72);
“Cambria Math”设计有这些参数!
转到链接http://www.ascenderfonts.com/font/cambria-regular.aspx将字体大小更改为22pt(或其他)并查看字体“Cambria”和字体“Cambria Math”的顶部和底部边距之间的差异。