读书人

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

发布时间: 2012-04-14 17:14:21 作者: rapoo

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);    }} 

读书人网 >C++

热点推荐