使用VC如何按一定斜角输出字符串

    使用VC开发时,常常需要在窗口上画一些图表。有时要把一些文字竖着写,有时需要倾斜一定的角度。对于老手们,这当然算不上什么问题,而新手却常常找不到方法。
    新手们往往会在CDC的成员函数里四处寻觅,企图找到一个带斜角参数的TextOut之类的函数,当然是找不到的。输出角度虽然看起来应该是个“输出”行为,事实上却不在画图时决定,而是由字体决定的。
    VC的字体由一个结构体定义:

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就是输出方向和X轴的夹角,以0.1度为单位。例如:如果我们斜向上45度输出文字,那么字体的lfEscapement应为450。
    知道这一点后,就很容易了。先取出当前DC的字体,没置字体的输出角度后,再生成一种新的字体让DC选用,然后输出的文字就有一定的角度了。
    获取DC的字体用GetCurrentFont函数,获取字体的LOGFONT结构体用CFont的GetLogFont函数。
    我们现在做一个函数,来设置DC字体的输出角度,并作为示例:

/**
输入: pDC 当前的输出DC
  angle 输出角度,一周360度,可以用小数
*/

void  SetTextOutputAngle(CDC  *  pDC,  float  angle)
{
 ASSERT(pDC);

 CFont 
* pFont=NULL,
  NewFont;
 LOGFONT LogFont;

 
if (NULL == (pFont = pDC->GetCurrentFont()) // 获得原来字体
  return;
 
 
if (! pFont->GetLogFont(&LogFont))   // 获得字体描述结构体
  return;

 LogFont.lfEscapement 
= angle*10;   // 修改输出角度

 
if (NewFont.CreateFontIndirect(&LogFont)) // 生成新字体
  return;

 pDC
->SelectObject(NewFont);     // 应用新字体
}


    使用这个函数:
    正常输出:SetTextOutputAngle(pDC, 0);
    斜向上45度:SetTextOutputAngle(pDC, 45);
    从上往下:SetTextOutputAngle(pDC, -90);
    调用了函数之后,所有调用这个DC输出的文字都会按相应的角度输出,但重新设置了字体后,设置将失效。
    事实上,通过对LOGFONT结构体内变量的控制,我们可以实现很多有趣的功能,如让字体变胖、变瘦、变歪、变成粗体字、细体字等,有兴趣的朋友可以自己研究。
     作者:苏林

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值