VC下实现3D文字显示

简介:
计算机屏幕是平面二维的,我们之所以能欣赏到真如实物般的三维图像,是因为显示在计算机屏幕上时色彩灰度的不同而使人眼产生视觉上的错觉,而将二维的计算机屏幕感知为三维图像。基于色彩学的有关知识,三维物体边缘的凸出部分一般显高亮度色,而凹下去的部分由于受光线的遮挡而显暗色。这一认识被广泛应用于网页或其他应用中对按钮、3D线条的绘制。对于本文所要绘制的3D文字同样也适用,即在原始位置显示高亮度颜色,而在左下或右上等位置用低亮度颜色勾勒出其轮廓,这样在视觉上便会产生3D文字的效果。具体实现时,可用完全一样的字体在不同的位置分别绘制两个不同颜色的2D文字,只要使两个文字的坐标合适,就完全可以在视觉上产生出不同效果的3D文字。 
      下面给出两种类似的实现方法并比较两者的效果:
 void CMyDrawView::OnDraw(CDC* pDC)
{
    CMyDrawDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    CRect rect1,rect2;
    this->GetClientRect(&rect1);
    rect2 = rect1+CPoint(80,80);
    this->Draw3DText("欢迎使用",&rect1,44,0,FW_BOLD,0,"楷体_GB2312",pDC);
    this->Draw3DText("欢迎使用",&rect2,pDC);
}

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


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


对比效果如图所示:
200771601.JPG


本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2007/07/16/820402.html,如需转载请自行联系原作者
目录
相关文章
|
移动开发 监控 小程序
mPaaS常见问题之音视频通话微信小程序通话界面录制为画中画模式如何解决
mPaaS(移动平台即服务,Mobile Platform as a Service)是阿里巴巴集团提供的一套移动开发解决方案,它包含了一系列移动开发、测试、监控和运营的工具和服务。以下是mPaaS常见问题的汇总,旨在帮助开发者和企业用户解决在使用mPaaS产品过程中遇到的各种挑战
269 0
在代码优化过程中,常见的错误和bug包括以下几点
在代码优化过程中,常见的错误和bug包括以下几点
小红书 - 只需一招带你解决笔记“换行”问题
小红书 - 只需一招带你解决笔记“换行”问题
3663 0
|
11月前
|
存储 边缘计算 人工智能
探索边缘计算:定义、优势、挑战及未来趋势
探索边缘计算:定义、优势、挑战及未来趋势
|
11月前
|
供应链 监控 搜索推荐
物联网技术在物流领域的应用会带来哪些影响?
物联网技术在物流领域的应用会带来哪些影响?
1009 58
|
9月前
|
人工智能 前端开发 算法
科技云报到:从大模型到云端,“AI+云计算”还能讲出什么新故事
科技云报到:从大模型到云端,“AI+云计算”还能讲出什么新故事
249 3
|
11月前
|
编译器
Zig 函数
Zig 函数
166 1
WK
|
11月前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
317 0
|
Android开发 Docker 容器
docker中编译android aosp源码,出现Build sandboxing disabled due to nsjail error
在使用Docker编译Android AOSP源码时,如果遇到"Build sandboxing disabled due to nsjail error"的错误,可以通过在docker run命令中添加`--privileged`参数来解决权限不足的问题。
2240 1
Java中的NIO编程详解
Java中的NIO编程详解