WEB开发网
开发学院软件开发VC Visual C++实现各种文字特殊效果 阅读

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结构创建不同的字体,再结合显示颜色、位置、时间的设置,相信一定还可以实现更多的动态效果来。

上一页  1 2 3 4 5 

Tags:Visual 实现 各种

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接