字体旋转的位置控制

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;
}
另外需要说明的是字体旋转角度是以以下的方式来定义的:
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值