Visual C++实现各种文字特殊效果
2007-03-15 21:48:48 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閹冣挃闁硅櫕鎹囬垾鏃堝礃椤忎礁浜鹃柨婵嗙凹缁ㄧ粯銇勯幒瀣仾闁靛洤瀚伴獮鍥敍濮f寧鎹囬弻鐔哥瑹閸喖顬堝銈庡亝缁挸鐣烽崡鐐嶆棃鍩€椤掑嫮宓佸┑鐘插绾句粙鏌涚仦鎹愬闁逞屽墰閹虫捇锝炲┑瀣╅柍杞拌兌閻ゅ懐绱撴担鍓插剱妞ゆ垶鐟╁畷銉р偓锝庡枟閻撴洘銇勯幇闈涗簼缂佽埖姘ㄧ槐鎾诲礃閳哄倻顦板┑顔硷工椤嘲鐣烽幒鎴旀瀻闁规惌鍘借ⅵ濠电姷鏁告慨顓㈠磻閹剧粯鈷戞い鎺嗗亾缂佸鏁婚獮鍡涙倷閸濆嫮顔愬┑鐑囩秵閸撴瑦淇婇懖鈺冪<闁归偊鍙庡▓婊堟煛鐏炵硶鍋撻幇浣告倯闁硅偐琛ラ埀顒冨皺閺佹牕鈹戦悙鏉戠仸闁圭ǹ鎽滅划鏃堟偨缁嬭锕傛煕閺囥劌鐏犻柛鎰ㄥ亾婵$偑鍊栭崝锕€顭块埀顒佺箾瀹€濠侀偗婵﹨娅g槐鎺懳熺拠鑼舵暱闂備胶枪濞寸兘寮拠宸殨濠电姵纰嶉弲鎻掝熆鐠虹尨宸ョ€规挸妫濆铏圭磼濡搫顫嶇紓浣风劍閹稿啿鐣烽幋锕€绠婚悹鍥у级瀹撳秴顪冮妶鍡樺鞍缂佸鍨剁粋宥夋倷椤掍礁寮垮┑鈽嗗灣閸樠勭妤e啯鍊垫慨妯煎亾鐎氾拷

核心提示: 下面的代码演示了如何实现字体的空心效果// 应用程序主窗口的重绘函数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结构创建不同的字体,再结合显示颜色、位置、时间的设置,相信一定还可以实现更多的动态效果来。
更多精彩
赞助商链接