VC下实现3D文字显示

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

     计算机屏幕是平面二维的,我们之所以能欣赏到真如实物般的三维图像,是因为显示在计算机屏幕上时色彩灰度的不同而使人眼产生视觉上的错觉,而将二维的计算机屏幕感知为三维图像。基于色彩学的有关知识,三维物体边缘的凸出部分一般显高亮度色,而凹下去的部分由于受光线的遮挡而显暗色。这一认识被广泛应用于网页或其他应用中对按钮、3D线条的绘制。对于本文所要绘制的3D文字同样也适用,即在原始位置显示高亮度颜色,而在左下或右上等位置用低亮度颜色勾勒出其轮廓,这样在视觉上便会产生3D文字的效果。具体实现时,可用完全一样的字体在不同的位置分别绘制两个不同颜色的2D文字,只要使两个文字的坐标合适,就完全可以在视觉上产生出不同效果的3D文字。
     
下面给出两种类似的实现方法并比较两者的效果:

None.gif void  CMyDrawView::OnDraw(CDC *  pDC)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    CMyDrawDoc
* pDoc = GetDocument();
InBlock.gif    ASSERT_VALID(pDoc);
InBlock.gif    
// TODO: add draw code for native data here
InBlock.gif
    CRect rect1,rect2;
InBlock.gif    
this->GetClientRect(&rect1);
InBlock.gif    rect2 
= rect1+CPoint(80,80);
InBlock.gif    
this->Draw3DText("欢迎使用",&rect1,44,0,FW_BOLD,0,"楷体_GB2312",pDC);
InBlock.gif    
this->Draw3DText("欢迎使用",&rect2,pDC);
ExpandedBlockEnd.gif}

None.gif void  CMyDrawView::Draw3DText(CString str,CRect rectText, int  nHeight, int  nWidth, int  nWeight,BYTE bItalic,LPCTSTR lpszFacename,CDC  * pDC)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {//画3D文字
InBlock.gif
    CFont newFont,*oldFont;
InBlock.gif    COLORREF oldcolor;
InBlock.gif    newFont.CreateFont(nHeight,nWidth,
0,0,nWeight,bItalic,FALSE,FALSE,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
InBlock.gif            FIXED_PITCH 
| FF_ROMAN,lpszFacename);//创建新字体
InBlock.gif
    pDC->SetBkMode(TRANSPARENT);
InBlock.gif    oldFont 
= pDC->SelectObject(&newFont);//选进DC中
InBlock.gif
    oldcolor = pDC->SetTextColor(RGB(0,0,0));
InBlock.gif    pDC
->DrawText(str,rectText+CPoint(1,1),DT_SINGLELINE | DT_LEFT | DT_VCENTER|DT_CENTER);
InBlock.gif    pDC
->SetTextColor(::GetSysColor(COLOR_BTNFACE));
InBlock.gif    pDC
->DrawText(str,rectText,DT_SINGLELINE | DT_LEFT | DT_VCENTER|DT_CENTER);
InBlock.gif    pDC
->SetTextColor(oldcolor);
InBlock.gif    pDC
->SelectObject(oldFont);
ExpandedBlockEnd.gif}

None.gif

None.gif void  CMyDrawView::Draw3DText(CString str,CRect rect,CDC  * pDC)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    CFont newFont,
*oldFont;
InBlock.gif    COLORREF oldColor;
InBlock.gif    LOGFONT f;
InBlock.gif    f.lfCharSet 
= DEFAULT_CHARSET;
InBlock.gif    f.lfClipPrecision 
= CLIP_DEFAULT_PRECIS;
InBlock.gif    f.lfEscapement 
= 0;
InBlock.gif    f.lfHeight 
= 44;
InBlock.gif    f.lfItalic 
= 0;
InBlock.gif    f.lfOrientation 
= 0;
InBlock.gif    f.lfOutPrecision 
= OUT_DEFAULT_PRECIS;
InBlock.gif    f.lfPitchAndFamily 
= FIXED_PITCH | FF_ROMAN;
InBlock.gif    f.lfQuality 
= DEFAULT_QUALITY;
InBlock.gif    f.lfStrikeOut 
= FALSE;
InBlock.gif    f.lfUnderline 
= FALSE;
InBlock.gif    f.lfWeight 
= FW_BOLD;
InBlock.gif    f.lfWidth 
= 0;
InBlock.gif    strcpy(f.lfFaceName,
"楷体_GB2312");
InBlock.gif    newFont.CreateFontIndirect(
&f);
InBlock.gif    oldColor 
= pDC->SetTextColor(RGB(0,0,0));
InBlock.gif    oldFont 
= (CFont*)pDC->SelectObject(&newFont);
InBlock.gif    pDC
->SetBkMode(TRANSPARENT);
InBlock.gif    pDC
->SetTextColor(::GetSysColor(COLOR_3DDKSHADOW)); 
InBlock.gif    pDC
->DrawText(str,rect,DT_SINGLELINE | DT_LEFT | DT_VCENTER|DT_CENTER);
InBlock.gif    pDC
->SetTextColor(::GetSysColor(COLOR_3DHILIGHT)); 
InBlock.gif    pDC
->DrawText(str,rect+CPoint(1,1),DT_SINGLELINE | DT_LEFT | DT_VCENTER|DT_CENTER);
InBlock.gif    pDC
->SelectObject(oldFont);
InBlock.gif    pDC
->SetTextColor(oldColor);
ExpandedBlockEnd.gif}

None.gif


对比效果如图所示:

200771601.JPG

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值