Chinaunix首页 | 论坛 | 博客
  • 博客访问: 379010
  • 博文数量: 35
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 797
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-02 08:51
文章分类

全部博文(35)

文章存档

2011年(1)

2010年(3)

2009年(3)

2008年(28)

我的朋友

分类: WINDOWS

2010-06-28 14:43:41

   如果希望取得TrueType字体的轮廓数据,例如显示空心字,可以使用GetGlyphOutline,然后对返回的数据解码得到,下面是显示一个字符 的代码,大家可以很容易把它包装成一个自己需要的类。我已经把这段代码应用到我的三维建模程序中了,这样我可以在三维空间显示文字了。以上是一张屏幕截 图。

CClientDC dc(this);
   LOGFONT logfont;
   memset(&logfont, 0, sizeof(LOGFONT));
   logfont.lfHeight = 72;
   logfont.lfCharSet = GB2312_CHARSET;
   _tcscpy(logfont.lfFaceName, _T("宋体"));
   CFont font;
   font.CreateFontIndirect(&logfont);
   CFont* pOldFont = dc.SelectObject(&font);

   MAT2 mat2 = {{0,1}, {0,0}, {0,0}, {0,1}};
   POINT buffer[1024];
   GLYPHMETRICS gm;
   wchar_t thisChar = L'哈';
   DWORD returnBytes = GetGlyphOutlineW(dc.GetSafeHdc(), thisChar, GGO_BEZIER, &gm, sizeof(buffer), buffer, &mat2);
   if(returnBytes != GDI_ERROR)
   {
    TTPOLYGONHEADER* pTTPH = (TTPOLYGONHEADER*)buffer;
    _ASSERTE(pTTPH->dwType == TT_POLYGON_TYPE);
    //对闭合路径进行循环
    while(returnBytes > 0)
    {
     dc.MoveTo(pTTPH->pfxStart.x.value, pTTPH->pfxStart.y.value);
     TTPOLYCURVE* pCurrentCurve = (TTPOLYCURVE*)(pTTPH+1);
     int remainBytes = pTTPH->cb - sizeof(TTPOLYGONHEADER);
     while(remainBytes > 0)
     {
      switch(pCurrentCurve->wType)
      {
      case TT_PRIM_LINE:
      case TT_PRIM_QSPLINE:
      case TT_PRIM_CSPLINE:
       {
        for(int i=0; icpfx; ++i)
        {
         dc.LineTo(pCurrentCurve->apfx[i].x.value, pCurrentCurve->apfx[i].y.value);
        }
       }
       break;
      }
      int count = sizeof(TTPOLYCURVE) + (pCurrentCurve->cpfx-1)*sizeof(POINTFX);
      pCurrentCurve = (TTPOLYCURVE*)((char*)pCurrentCurve + count);
      remainBytes -= count;
     }
     dc.LineTo(pTTPH->pfxStart.x.value, pTTPH->pfxStart.y.value);

     returnBytes -= pTTPH->cb;
     pTTPH = (TTPOLYGONHEADER*)((char*)pTTPH + pTTPH->cb);
    }
   }

   dc.SelectObject(pOldFont);

阅读(8392) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~