Visual C++实现各种文字特殊效果
2007-03-15 21:48:48 来源:WEB开发网核心提示: 下面的代码演示了如何实现字体的空心效果// 应用程序主窗口的重绘函数void CMyWnd::OnPaint(){// 获得窗口的客户区设备上下文句柄CPaintDC dc(this); // 更改当前字体LOGFONT lf;dc.GetCurrentFont()->GetLogF
下面的代码演示了如何实现字体的空心效果
////////////////////////////////////// 应用程序主窗口的重绘函数
void CMyWnd::OnPaint()
{
// 获得窗口的客户区设备上下文句柄
CPaintDC dc(this); // 更改当前字体
LOGFONT lf;
dc.GetCurrentFont()->GetLogFont(&lf);
CFont font;
CFont *pOldFont; // 保存设备上下文最初使用的字体对象
lf.lfCharSet=134;
lf.lfHeight=-150;
lf.lfHeight=-150;
lf.lfWidth=0;
strcpy(lf.lfFaceName, "隶书");
font.CreateFontIndirect(&lf);
pOldFont=dc.SelectObject(&font);
dc.SetBkMode(TRANSPARENT); // 更改当前画笔
CPen pen(PS_SOLID, 1, RGB(255, 0, 0));
CPen *pOldPen;
pOldPen=dc.SelectObject(&pen); // 开始一个路径
dc.BeginPath();
dc.TextOut(10, 10, "空心字");
dc.EndPath(); // 绘制路径
dc.StrokePath();
//可以用dc.StrokeAndFillPath()函数来代替,不过该函数会使用当前刷子填充路径的内部。
dc.SelectObject(pOldFont);
dc.SelectObject(pOldPen);
}
二、编程步骤
1、启动Visual C++6.0,生成一个单文档视图结构的程序(对于旋转字体的程序:项目名为ViewFont;对于3D效果的程序:项目名为 3DText);
2、重载应用程序的OnDraw(CDC* pDC)函数;
3、添加代码,编译运行程序;
三、程序代码////////////////////////////////////旋转字体
void CViewFontView::OnDraw(CDC* pDC)
{
CViewFontDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CString str(_T("Visua C++6.0编程实例"));//定义要显示的字符串;
CRect rect;
GetClientRect(&rect);
pDC->SetBkMode(TRANSPARENT);//设置背景为透明效果;
pDC->SetTextColor(RGB(100,100,255));//设置显示的文本颜色;
CFont font;
LOGFONT stFont;//定义字体结构;
memset(&stFont,0,sizeof(stFont));//设置字体结构的属性;
stFont.lfHeight=30;
stFont.lfWeight=FW_NORMAL;
stFont.lfClipPrecision=CLIP_LH_ANGLES;
strcpy(stFont.lfFaceName,"Arial");
//下面的代码以视图中心为圆点,在半径100的圆周上每隔30度显示字符串;
for(double i=0;i<3600;i+=300)
{
stFont.lfEscapement=i;//设置字体的倾斜角度;
font.CreateFontIndirect(&stFont);//根据字体结构创建字体对象;
CFont *oldFont;
oldFont=pDC->SelectObject(&font);//将创建的字体选入设备上下文;
if(i<900)
pDC->TextOut(rect.left+rect.Width )/2+100*cos(i/1800*3.14),rect.top+rect.Height ()/2-100*sin(i/1800*3.14),str);
if(i>=900&&i<1800)
pDC->TextOut(rect.left+rect.Width ()/2+100*cos(i/1800*3.14),
rect.top+rect.Height ()/2-100*sin(i/1800*3.14),str);
if(i>=1800&&i<2700)
pDC->TextOut(rect.left+rect.Width ()/2+100*cos(i/1800*3.14),
rect.top+rect.Height ()/2-100*sin(i/1800*3.14),str);
if(i>=2700&&i<=3600)
pDC->TextOut(rect.left+rect.Width ()/2+100*cos(i/1800*3.14),
rect.top+rect.Height ()/2-100*sin(i/1800*3.14),str);
pDC->SelectObject(oldFont);//恢复设备上下文的字体;
font.DeleteObject ();//删除创建的字体;
}
}
//////////////////////////////////////////显示3D效果的程序
void CMy3DTextView::OnDraw(CDC* pDC)
{
CMy3DTextDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CString string;
string="Visual C++6.0编程实例";
CFont m_fontLogo;
m_fontLogo.CreateFont(144, 0, 0, 0, 155, FALSE, FALSE,0,0,0,0,0,0, "Arial");
//创建字体;
pDC->SetBkMode(TRANSPARENT);
CRect rectText;
GetClientRect(&rectText);
CFont * OldFont = pDC->SelectObject(&m_fontLogo);
COLORREF OldColor = pDC->SetTextColor( ::GetSysColor( COLOR_3DSHADOW));
//阴影状态显示文字;
pDC->DrawText( string, rectText+CPoint(2,2) , DT_SINGLELINE | DT_LEFT |DT_VCENTER|DT_CENTER);
pDC->SetTextColor(::GetSysColor( COLOR_3DHILIGHT) );
//高亮状态显示文字;
pDC->DrawText( string, rectText, DT_SINGLELINE | DT_LEFT |DT_VCENTER|DT_CENTER);
pDC->SetTextColor( OldColor);
pDC->SelectObject(OldFont);
m_fontLogo.DeleteObject();
}
四、小结
读者只要掌握了上面的内容,灵活运用Cfont和LOGFONT结构创建不同的字体,再结合显示颜色、位置、时间的设置,相信一定还可以实现更多的动态效果来。
更多精彩
赞助商链接