旋转字符输出

代码如下:

 

 

LRESULT CRotatextView::OnPaint(UINT  /*uMsg*/ , WPARAM  /*wParam*/ , LPARAM  /*lParam*/ , BOOL &   /*bHandled*/ )
{
    CPaintDC dc(m_hWnd);

    CRect    rcClient;
    GetClientRect(
&rcClient);

    CPoint    ptCenter 
= rcClient.CenterPoint();

    
int        r = 100;        //园的半径

    CRect    rcEllipse(ptCenter.x 
- r,ptCenter.y-r,ptCenter.x+r,ptCenter.y+r);

    dc.Ellipse(
&rcEllipse);



    
double angle;    //角度
    double radian;    //弧度
    int n = 12;
#ifdef M_PI
    
double pi = M_PI;
#else
    
double pi = 3.14159265358979323846;
#endif

    
for(int i = 0 ; i < n; ++i)
    
{
        angle 
= 360 / n * i;
        radian 
= 2 * pi / n * i;

        CFont font;
        m_logfont.lfEscapement 
= static_cast<long>((360 - (angle+90))*10);
        font.CreateFontIndirect(
&m_logfont);
        CFontHandle    oldfont 
= dc.SelectFont(font);
        
        CString    str;
        CSize    szText;
        str.Format(_T(
"%d"),i);

        dc.GetTextExtent(str,str.GetLength(),
&szText);

        CPoint ptTextCenter;    
//输出的文本串的中心点
        ptTextCenter.x = ptCenter.x+static_cast<long>((r+szText.cy/2* cos(radian));
        ptTextCenter.y 
= ptCenter.y+static_cast<long>((r+szText.cy/2)*sin(radian));

        
//DrawRotatedText(dc,m_strview,&m_rcBound,m_angle);
        DrawRotatedText(dc,str,ptTextCenter,(360-(angle+90)));
        dc.SelectFont(oldfont);
    }

    
return 0;
}

上面是WM_PAINT 的处理,主要是窗口中心画圆,然后是按12等分的位置在圆周上写字。

两个要点:

  1. 字体。每个角度的字体要单独创建,就是修改 LOGFONT.lfEscapement .  llfEscapement的单位是1/10度,所以赋值时是要旋转的角度乘10。
  2. DrawRotatedText 的POINT参数是要输出的文本的中心点。

下面是 DrawRotatedText的代码。

 

 

void  CRotatextView::DrawRotatedText(HDC hdc,LPCTSTR str, const  CPoint  & ptcenter, double  angle,UINT nOption)
{
    
double radian = M_PI * angle / 180;

    CSize    TextSize;
    GetTextExtentPoint32(hdc,str,lstrlen(str),
&TextSize);

    CRect    rcBoundText(ptcenter.x
-TextSize.cx/2,ptcenter.y-TextSize.cy/2,ptcenter.x+TextSize.cx/2,ptcenter.y+TextSize.cy/2);
    
//Rectangle(hdc,rcBoundText.left,rcBoundText.top,rcBoundText.right,rcBoundText.bottom);

    CPoint    rcenter;
    rcenter.x 
= long(cos(radian) * (TextSize.cx/2- sin(radian) * (TextSize.cy/2));
    rcenter.y 
= long(sin(radian) * (TextSize.cx/2+ cos(radian) * (TextSize.cy/2));

    SetTextAlign(hdc, TA_BASELINE);
    SetBkMode(hdc, TRANSPARENT);

    ExtTextOut(hdc, rcBoundText.left 
+ (rcBoundText.right - rcBoundText.left) / 2 - rcenter.x,
                   rcBoundText.top 
+ rcBoundText.Height() / 2 + rcenter.y,
                   nOption, 
&rcBoundText, str, strlen(str), NULL);



}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值