分类: 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; 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);