void CGLFont::c3dtext(CString strText,HFONT hFont)// 3D文字显示,支持汉字。
{
UCHAR * pChar=(UCHAR*)strText.GetBuffer(strText.GetLength());//定义字符串长度
int nListNum; //显示列表
DWORD dwChar; //字符指针
GLYPHMETRICSFLOAT pgmf[1]; //轮廓字体字符集的信息
glPushMatrix(); //压入堆栈
for(int i = 0; i < strText.GetLength(); i++)
{ if(IsDBCSLeadByte((BYTE)pChar[i])) //是否双字节(汉字)
{ dwChar=(DWORD)((pChar[i]<<8)|pChar[i+1]); //取当前字符,双字节转换
i++;
}
else dwChar = pChar[i]; //取当前字符
nListNum = glGenLists(1); //创建列表
wglUseFontOutlines( hdc, //拥有字体的HDC
dwChar, //转化为显示列表的第一个字符
1, //转化为显示列表的字符数
nListNum, //显示列表的开始
0.0f,
0.25f, //Z轴负方向的厚度
WGL_FONT_POLYGONS, //绘制字体方式
pgmf //指向存放信息的数组,为count个
);
glCallList(nListNum); //绘制显示列表
glDeleteLists(nListNum, 1); //删除列表
}
glPopMatrix(); //弹出堆栈
strText.ReleaseBuffer(); //清除字符串
//::SelectObject(hdc,hOldFont); //恢复字体
}
{
UCHAR * pChar=(UCHAR*)strText.GetBuffer(strText.GetLength());//定义字符串长度
int nListNum; //显示列表
DWORD dwChar; //字符指针
GLYPHMETRICSFLOAT pgmf[1]; //轮廓字体字符集的信息
glPushMatrix(); //压入堆栈
for(int i = 0; i < strText.GetLength(); i++)
{ if(IsDBCSLeadByte((BYTE)pChar[i])) //是否双字节(汉字)
{ dwChar=(DWORD)((pChar[i]<<8)|pChar[i+1]); //取当前字符,双字节转换
i++;
}
else dwChar = pChar[i]; //取当前字符
nListNum = glGenLists(1); //创建列表
wglUseFontOutlines( hdc, //拥有字体的HDC
dwChar, //转化为显示列表的第一个字符
1, //转化为显示列表的字符数
nListNum, //显示列表的开始
0.0f,
0.25f, //Z轴负方向的厚度
WGL_FONT_POLYGONS, //绘制字体方式
pgmf //指向存放信息的数组,为count个
);
glCallList(nListNum); //绘制显示列表
glDeleteLists(nListNum, 1); //删除列表
}
glPopMatrix(); //弹出堆栈
strText.ReleaseBuffer(); //清除字符串
//::SelectObject(hdc,hOldFont); //恢复字体
}