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++ 旋转文本 实例
悬赏分: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); } }