c++ 旋转文本的有关问题

c++ 旋转文本的问题
c++ 旋转文本 实例
 悬赏分:20 - 提问时间2009-8-8 21:20 问题为何被关闭 
我查到 MSDN 上有C# 和 VB 的旋转文本的实例。
http://msdn.microsoft.com/zh-cn/vstudio/ms404359.aspx
但是我现在想在C++ 上实现。在网上只是找到了函数。没有具体的实例。
我希望有人能够给我个实例!就是 从有到尾的源码。
能够将文本 实现 旋转角度的 效果。 
问题补充:我真的很想要个代码,也就是说这个函数怎么用?
#include <cmath>
 
// pDC : pointer to your device-context
// str : the text
// rect: the rectangle
// nOptions: 可以是ETO_CLIPPED 与ETO_OPAQUE的联合
// (更多详细信息看ExtTextOut的文档)
void DrawRotatedText(CDC* pDC, const CString str, CRect rect, 
  double angle, UINT nOptions = 0)
{
  // 角度转换到弧度
  double pi = 3.141592654;
  double radian = pi * 2 / 360 * angle;
 
  // 获取未转换前文本的中心
  CSize TextSize = pDC->GetTextExtent(str);
  CPoint center;
  center.x = TextSize.cx / 2;
  center.y = TextSize.cy / 2;
 
  // 计算新中心
  CPoint rcenter;
  rcenter.x = long(cos(radian) * center.x - sin(radian) * center.y);
  rcenter.y = long(sin(radian) * center.x + cos(radian) * center.y);
 
  // 最后绘制并移动它到矩形的中心
  pDC->SetTextAlign(TA_BASELINE);
  pDC->SetBkMode(TRANSPARENT);
  pDC->ExtTextOut(rect.left + rect.Width() / 2 - rcenter.x,


------解决方案--------------------
CDC 是设备内容对象,只有用这个才能显示出东西,在屏幕上
CString 是要打印的字符串
CRect 是屏幕上的显示区域,也就是你打印东西的范围
angle是水平线与你字体倾斜的角度
Options用不上就算了,我也不知道是啥
前三个参数是MFC的基本类型,要不明白的,从头再学一次。

其实可以用LOGFONT结构来实现
它有两个数据项:lfEscapement和lfOrientation,将两个都设成你希望旋转的角度(逆时针)*10就可以。
当然,还有字体大小和字体宽度、字体类型之类的需要设置
最后用CFont对象的成员函数CreatePointFontIndirect(LOGFONT *)来创建字体,最后通过CDC对象使用便好了。
------解决方案--------------------
C/C++ code

CPaintDC dc(this);
LOGFPNT lf;
::ZeroMemory(&lf, sizeof(LOGFONT));
lf.lfHeight = 160;//字体高度
lf.lfWeight = FW_BOLD;//字体为粗体
lf.lfEscapement = 500;
lf.lfOrientation = 500;//表示将字体逆时针旋转50度
::lstrcpy(lf.lfFaceName, strFontName);//复制字体名称,比如楷体、新魏之类的
CFont font;//字体对象
font.CreatePointFontIndirect(&lf);//创建设定好的字体
CFont *pOldFont = dc.SelectObject(&font);//将创建字体选进设备描述表
dc.TextOut(5, 5, strContents);//在屏幕左上角显示内容,距离(0, 0)5个点处
dc,SelectObject(pOldFont);//恢复设备描述表的字体设置,以便CFont的析构函数释放font对象,选进设备描述表的资源是不能释放的。

------解决方案--------------------

这最主要的是要创建一个旋转角度的字体。

我写了一个简单的测试,显示一个旋转一周的字符串,复杂的函数你可以自己改一下。


C/C++ code


void CAboutDlg::DrawRotatedText()
{
    LOGFONTA m_logfont;
    HGDIOBJ hfont;
    CString str = "Test string!";
    HDC DC = ::GetDC(this->m_hWnd);
    ZeroMemory(&m_logfont, sizeof(m_logfont));
    m_logfont.lfWeight = 1000;
    SetBkMode(DC, TRANSPARENT);
    
    for(int i=0; i<360; i+=30)
    {
        m_logfont.lfEscapement = i*10;
        hfont = CreateFontIndirect(&m_logfont);
        SelectObject(DC, hfont);
        TextOut(DC, 100, 100, str, str.GetLength());
        DeleteObject(hfont);
    }
}