代码如下:

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等分的位置在圆周上写字。
两个要点:
- 字体。每个角度的字体要单独创建,就是修改 LOGFONT.lfEscapement . llfEscapement的单位是1/10度,所以赋值时是要旋转的角度乘10。
- 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);


}
本文介绍了一种在Windows程序中实现旋转文本的技术。通过调整字体的lfEscapement属性并使用ExtTextOut函数来精确控制文本的旋转角度及位置,使得文本能够沿着圆形路径均匀分布。文章还提供了详细的代码示例。
3550

被折叠的 条评论
为什么被折叠?



