函数GetTextMetrics可以获取一个字体文本度量并将它放入一个类型为TEXTMETRIC的数据结构中,该结构如下所示:
typedef struct tagTEXTMETRIC { // tmLONG tmHeight; //字符高度
LONG tmAscent; //字符上部高度(基线以上)
LONG tmDescent; //字符下部高度(基线以下)
LONG tmInternalLeading; //由tmHeight定义的字符高度的顶部空间数目
LONG tmExternalLeading; //加在两行之间的空间数目
LONG tmAveCharWidth; //平均字符宽度
LONG tmMaxCharWidth; //最宽字符的宽度
LONG tmWeight; //字体的粗细轻重程度
LONG tmOverhang; //加入某些拼接字体上的附加高度
LONG tmDigitizedAspectX; //字体设计所针对的设备水平方向分辨率96dpi
LONG tmDigitizedAspectY; //字体设计所针对的设备垂直方向分辨率96dpi
BCHAR tmFirstChar; //为字体定义的第一个字符
BCHAR tmLastChar; //为字体定义的最后一个字符
BCHAR tmDefaultChar; //字体中所没有字符的替代字符
BCHAR tmBreakChar; //用于拆字的字符
BYTE tmItalic; //字体为斜体时非零
BYTE tmUnderlined; //字体为下划线时非零
BYTE tmStruckOut; //字体被删去时非零
BYTE tmPitchAndFamily; //字体间距(低4位)和族(高4位)
BYTE tmCharSet; //字体的字符集
} TEXTMETRIC;
计算CRicheditctrl控件中的字符实际所占区域方法:
1. 计算每一行的单倍行高:行高lineHeight
2. 计算每一行的最大字号的字符高度;charHeight=字号*96/72px 字符格式字号=yHeight/20; 对于MM_TEXT映射方式,可以用下面的公式为一种指定了点大小的字体确定高度: nHeight=-MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY),72)
4. 计算每一行的基线位置;baseLine =charHeight*( tmDescent)/( tmHeight)+( lineHeight- charHeight)/2。 基线位置由该行字体高度最大字体来确定。
5. 计算每一行的字符所占区域的左上角坐标getCharPos(char); 字符的位置为基线处于处于该字符字体高度的( tmDescent)/( tmHeight)的位置处。至此,可以精确确定字符的高度了。
具体计算,就相当容易了,在此不再赘述。
浙公网安备 33010602011771号