Opengl:显示中文改进版
2010年07月09日
由于对这方面不是特别了解,基本上结合别人的代码,再加些自己认为更好点的改进。
#define MAX_CHAR 255
#define TEXT_CENTER 0
#define TEXT_LEFT 1
#define TEXT_RIGHT 2
HFONT CreateFont(char *facename, int height, int weight, bool italic,bool underline,bool strikeout)
{
LOGFONT lf;
lf.lfHeight = height;
lf.lfWidth = 100;
lf.lfEscapement = 0;
lf.lfOrientation = 0;
lf.lfWeight = weight;
lf.lfItalic = italic;
lf.lfUnderline = underline;
lf.lfStrikeOut = strikeout;
lf.lfCharSet = DEFAULT_CHARSET;
lf.lfOutPrecision = OUT_TT_PRECIS;
lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
lf.lfQuality = PROOF_QUALITY;
lf.lfPitchAndFamily = VARIABLE_PITCH | TMPF_TRUETYPE | FF_MODERN;
strcpy(lf.lfFaceName,facename);
// 创建字体
return CreateFont( -24, // 字体的高度
0, // 字体的宽度
0, // 旋转的角度
0, // 定位角度
FW_BOLD, // 字体的粗细
TRUE, // 斜体?
FALSE, // 下划线?
FALSE, // 删除线?
GB2312_CHARSET, // 字符集
OUT_TT_PRECIS, // 输出精度
CLIP_DEFAULT_PRECIS, // 裁减精度
ANTIALIASED_QUALITY, // 输出质量
FF_DONTCARE|DEFAULT_PITCH, // 间距和字体族
"宋体"); // 字体名称
}
struct FONTS // 保存轮廓字体
{
FONTS()
{
val = 0;
}
DWORD val; // 保存显示表的值(用来比较)
GLuint listName; // 保存显示表的名称
GLYPHMETRICSFLOAT gmf; // 保存字体的详细信息
};
void Show2DText(const char *str,SCoor coor,SColor color,int flag,double scale)
{
glDisable(GL_TEXTURE_2D);
DWORD FTextList[MAX_CHAR];
int m_iCount=strlen(str);
static HFONT hFont=0;
static map listmap;
HDC hDC=wglGetCurrentDC();
if(hFont==0)
{
hFont=CreateFont("隶书",800,800,0,0,0);
SelectObject(hDC,hFont);
}
int i=0;
int j=0,k=0;
int ich;
double width =0;
glColor3d(color.r,color.g,color.b);
while(i显示列表的第一个字符
1,//要转换为显示列表的字符数
font.listName,//显示列表的基数
0.0f,//指定与实际轮廓的最大偏移量
0.0,//0.15f,//在Z轴负方向的值
WGL_FONT_POLYGONS, //指定显示列表线段或多边形
&font.gmf);
}
width += listmap[ich].gmf.gmfCellIncX;
}
width*=scale;
switch(flag)
{
case TEXT_CENTER:
width = -width/2;
break;
case TEXT_LEFT:
width = 0;
break;
case TEXT_RIGHT:
width = -width;
break;
default :
width=0;
break;
}
glPushMatrix();
glTranslated(coor.x,coor.y,0);
glPushAttrib(GL_LIST_BIT);
{
glTranslated(width,0,0);
glScaled(scale,scale,1);
for(k=0;k字符
}
}
glPopAttrib();
glPopMatrix();
glEnable(GL_TEXTURE_2D);
}
2010年07月09日
由于对这方面不是特别了解,基本上结合别人的代码,再加些自己认为更好点的改进。
#define MAX_CHAR 255
#define TEXT_CENTER 0
#define TEXT_LEFT 1
#define TEXT_RIGHT 2
HFONT CreateFont(char *facename, int height, int weight, bool italic,bool underline,bool strikeout)
{
LOGFONT lf;
lf.lfHeight = height;
lf.lfWidth = 100;
lf.lfEscapement = 0;
lf.lfOrientation = 0;
lf.lfWeight = weight;
lf.lfItalic = italic;
lf.lfUnderline = underline;
lf.lfStrikeOut = strikeout;
lf.lfCharSet = DEFAULT_CHARSET;
lf.lfOutPrecision = OUT_TT_PRECIS;
lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
lf.lfQuality = PROOF_QUALITY;
lf.lfPitchAndFamily = VARIABLE_PITCH | TMPF_TRUETYPE | FF_MODERN;
strcpy(lf.lfFaceName,facename);
// 创建字体
return CreateFont( -24, // 字体的高度
0, // 字体的宽度
0, // 旋转的角度
0, // 定位角度
FW_BOLD, // 字体的粗细
TRUE, // 斜体?
FALSE, // 下划线?
FALSE, // 删除线?
GB2312_CHARSET, // 字符集
OUT_TT_PRECIS, // 输出精度
CLIP_DEFAULT_PRECIS, // 裁减精度
ANTIALIASED_QUALITY, // 输出质量
FF_DONTCARE|DEFAULT_PITCH, // 间距和字体族
"宋体"); // 字体名称
}
struct FONTS // 保存轮廓字体
{
FONTS()
{
val = 0;
}
DWORD val; // 保存显示表的值(用来比较)
GLuint listName; // 保存显示表的名称
GLYPHMETRICSFLOAT gmf; // 保存字体的详细信息
};
void Show2DText(const char *str,SCoor coor,SColor color,int flag,double scale)
{
glDisable(GL_TEXTURE_2D);
DWORD FTextList[MAX_CHAR];
int m_iCount=strlen(str);
static HFONT hFont=0;
static map listmap;
HDC hDC=wglGetCurrentDC();
if(hFont==0)
{
hFont=CreateFont("隶书",800,800,0,0,0);
SelectObject(hDC,hFont);
}
int i=0;
int j=0,k=0;
int ich;
double width =0;
glColor3d(color.r,color.g,color.b);
while(i显示列表的第一个字符
1,//要转换为显示列表的字符数
font.listName,//显示列表的基数
0.0f,//指定与实际轮廓的最大偏移量
0.0,//0.15f,//在Z轴负方向的值
WGL_FONT_POLYGONS, //指定显示列表线段或多边形
&font.gmf);
}
width += listmap[ich].gmf.gmfCellIncX;
}
width*=scale;
switch(flag)
{
case TEXT_CENTER:
width = -width/2;
break;
case TEXT_LEFT:
width = 0;
break;
case TEXT_RIGHT:
width = -width;
break;
default :
width=0;
break;
}
glPushMatrix();
glTranslated(coor.x,coor.y,0);
glPushAttrib(GL_LIST_BIT);
{
glTranslated(width,0,0);
glScaled(scale,scale,1);
for(k=0;k字符
}
}
glPopAttrib();
glPopMatrix();
glEnable(GL_TEXTURE_2D);
}