MFC中对字体的描述是通过LOGFONT结构来实现的:
typedef struct tagLOGFONT { LONG lfHeight; LONG lfWidth; LONG lfEscapement; LONG lfOrientation; LONG lfWeight; BYTE lfItalic; BYTE lfUnderline; BYTE lfStrikeOut; BYTE lfCharSet; BYTE lfOutPrecision; BYTE lfClipPrecision; BYTE lfQuality; BYTE lfPitchAndFamily; TCHAR lfFaceName[LF_FACESIZE]; } LOGFONT, *PLOGFONT;
其中字体的角度是通过lfEscapement参数来定义的,它定义的是单位为“度”*10的角度,如一个字需要以30度的角度显示,则lfEscapement要设置为300。
不过另一个问题是字体的显示都是以字体外接矩形的左上角为起始点来进行显示的,如TextOut()中的point参数。但一旦字符旋转后,它并不是以左上角起始点作为圆心来进行旋转的,而是有一个偏移量,如下图所示:
如上图所示,字符在进行逆时针45度旋转后,原来的起始点红A,现在却是以绿A作为新的起始点,这样在显示上,就会有一些偏差,我们仍然希望字符以红A的位置做为起始点来显示。
这样需要根据角度来进行一个三角变换,以求出这个偏移量,如以下函数所示:
/************************参数说明******************************
x 点x
y 点y
nw 当前font extent width
nh 当前font extent height
dAngle 要画的角度,弧度
dm 字体的中心点占extent垂直方向的长度比例,20%表示为0.2
dt 字体中心点占extent 水平方向的长度比例,同上
nx 返回的点x
ny 返回的点y
***************************************************************/
void CGeoUtils::getFontCenterOnRotate(int x,int y,int nw,int nh,double dAngle,double dm,double dt,int& nx,int& ny)
{
double m = nh * dm;
double t = nw * dt;
float fCeta = dAngle + atan(t/(nh - m));
//计算对角线
float dL =sqrt(pow(nh - m,2)+pow(t,2));
//计算出最后偏移量
int x1,y1;
x1 = sin(fCeta) * dL; y1 = cos(fCeta) * dL;
nx = x - x1; ny = y - y1;
}
另外需要说明的是字体旋转角度是以以下的方式来定义的: