+++++++请问,如何用opengl显示中文字体+++++++++ 显示英文和数字是可以的,如何用opengl显示中文字体。谢谢。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 具我所知...OpenGL 不管中文显示,位图字体函数肯定是不能用了,需要使用装载字模的轮廓字体函数,或自己完成显示例程,简单的做法是使用 glBitmap 画汉字' Windows平台下OpenGL汉字处理方法 出 处:品雪其寒[ 2001-12-22 ] 作 者:品雪 目 录 1 基本思想 2 具体说明 3 示意代码 1、基本思想 1)用wglUseFontOutlines或wglUseFontBitmaps为每个字生成一个List。 2)为每个字调用glCallList()或为一个字串调用glCallLists()。2、具体说明 OpenGL设计时考虑了非ASCII字符集文字的需求,在OpenGL中使用汉字是没有问题的。由于Windows95/NT所提供的wgl环境只在单缓冲时可以使用GDI函数,所以即使只是想写一些提示文字也要用这种方法。为此,Microsoft提供了wglUseFont??()函数,它的原型在wingdi.h中可以看到。如果只使用英文字符,那你可以使用类似下面的代码。· 在OpenGL初始化的末尾建立字体:#define LISTBASE 1000wglUseFontBitmaps(hDC,0,255,LSITBASE);· 在需要输出文字的地方调用:char pMyString="OpenGL Text Info";glListBase(LISTBASE);glCallLists(strlen(pMyString),GL_UNSIGNED_BYTE,pMyString); 按我们已经习惯的思维逻辑,只要指定一个中文字体,用同样的方法就应该可以显示中文。但实际上并非如此,这样做会有两个问题:· 问题一一个中文字体至少有6~7千个字,需要占用很多的内存来保存这些List数据,严重影响程序性能。其解决的办法是只生成所用到字的List。简单的方法是在字串显示函数中对每个字做一次wglUseFont??(),再call对应的List,用完再删除这个List。显然这个法子性能也不会很好。改进的法子很多,举两个我想到了的例子:1)在程序中建立一个清单,每个字处理之前先到清单里找,如果有就直接CallList,否则生成List并加到清单里。2)对要大量使用文字的程序可以建立一个小字库,甚至可以是以编译(compiled)List形式存在的小字库。正如当年我们在DOS下处理汉字一样。· 问题二更重要的是由于wglUseFont??()函数的Microsoft特色,这样做根本就不能显示汉字。其解决的办法是自己处理双字节代码。将一个汉字的两个字节组合成一个DWORD传给wglUseFont??()。备注:wglUseFont系列函数其实都有asc和widechar两个版本,正如其实的字符串函数一样,这是Windows系统为简化制作国际化程序而设计的,可是,不幸的是,wglUseFont??W()工作并不正常,我真不明白,为什么?在试完这个问题之后,终于明白其中的原因,正如MSDN屏保程序(MultiMedia Opengl gl3dtext)作者所说的,一个臭虫。3、示意代码 // 注意,以下代码必须选用中文字体才能工作, // 但可以处理中英文混合字串,Win95/WinNT4下BCB测试通过 void glDrawString(unsigned char *str) { GLYPHMETRICSFLOAT pgmf[1]; HDC hDC=wglGetCurrentDC(); DWORD dwChar; int ListNum; for(size_t i=0;i< strlen((char *)str);i++) { if(IsDBCSLeadByte(str[i])) { dwChar=(DWORD)((str[i]><8)|str[i+1]);i++; } else dwChar=str[i]; ListNum=glGenLists(1); bool ret=false; ret=wglUseFontOutlines(hDC,dwChar,1,ListNum,0.0,0.1,WGL_FONT_LINES,pgmf); glCallList(ListNum); glDeleteLists(ListNum,1); } } 提示:在BCB中用Form作OpenGL绘制时,可以利用Form的字体设置信息,在Form初始化或更改字体时显式建立该字体并将它指定给DC,就象这样: void CreateFont(void) { HFONT HFont,HOldFont=0; LOGFON LogFont; // 取字体信息 GetObject(Form1->Font->Handle,sizeof(LOGFONT),&LogFont); // 建立字体 HFont = CreateFontIndirect(&LogFont); // 选用字体 HOldFont=SelectObject (Form1->hDC, HFont); // 清除已经不用的字体 DeleteObject(HOldFont); } http://borland.mblogger.cn/cker/posts/7848.aspx inno setup5.2.3 跳过指定页面的问题 如何截取浏览器弹出的Java脚本的窗口? 驱动器映射 请教一个关于ntdll.dll超难的问题 c++中结构体转换到delphi中怎么做! 这样在DBGrid的第一行第五列输入一个数9? 带参数的EXE在命令行下如何启动? 我做的电脑通过模块给手机发短信,连接串口的本级能够正常发送,想了解客户端怎么操纵服务器的串口? 为什么一执行这条语句就会死??? 制作共享软件英文版的问题 ADO 能填充用lineto画出来的框吗?
OpenGL 不管中文显示,位图字体函数肯定是不能用了,需要使用装载字模
的轮廓字体函数,或自己完成显示例程,简单的做法是使用 glBitmap 画汉字'
[ 2001-12-22 ] 作 者:品雪
目 录
1 基本思想
2 具体说明
3 示意代码
1、基本思想
1)用wglUseFontOutlines或wglUseFontBitmaps为每个字生成一个List。
2)为每个字调用glCallList()或为一个字串调用glCallLists()。2、具体说明
OpenGL设计时考虑了非ASCII字符集文字的需求,在OpenGL中使用汉字是没有问题的。由于Windows95/NT所提供的wgl环境只在单缓冲时可以使用GDI函数,所以即使只是想写一些提示文字也要用这种方法。为此,Microsoft提供了wglUseFont??()函数,它的原型在wingdi.h中可以看到。如果只使用英文字符,那你可以使用类似下面的代码。
· 在OpenGL初始化的末尾建立字体:#define LISTBASE 1000
wglUseFontBitmaps(hDC,0,255,LSITBASE);
· 在需要输出文字的地方调用:char pMyString="OpenGL Text Info";
glListBase(LISTBASE);
glCallLists(strlen(pMyString),GL_UNSIGNED_BYTE,pMyString);
按我们已经习惯的思维逻辑,只要指定一个中文字体,用同样的方法就应该可以显示中文。但实际上并非如此,这样做会有两个问题:
· 问题一
一个中文字体至少有6~7千个字,需要占用很多的内存来保存这些List数据,严重影响程序性能。其解决的办法是只生成所用到字的List。简单的方法是在字串显示函数中对每个字做一次wglUseFont??(),再call对应的List,用完再删除这个List。显然这个法子性能也不会很好。
改进的法子很多,举两个我想到了的例子:1)在程序中建立一个清单,每个字处理之前先到清单里找,如果有就直接CallList,否则生成List并加到清单里。2)对要大量使用文字的程序可以建立一个小字库,甚至可以是以编译(compiled)List形式存在的小字库。正如当年我们在DOS下处理汉字一样。
· 问题二
更重要的是由于wglUseFont??()函数的Microsoft特色,这样做根本就不能显示汉字。其解决的办法是自己处理双字节代码。将一个汉字的两个字节组合成一个DWORD传给wglUseFont??()。
备注:wglUseFont系列函数其实都有asc和widechar两个版本,正如其实的字符串函数一样,这是Windows系统为简化制作国际化程序而设计的,可是,不幸的是,wglUseFont??W()工作并不正常,我真不明白,为什么?在试完这个问题之后,终于明白其中的原因,正如MSDN屏保程序(MultiMedia Opengl gl3dtext)作者所说的,一个臭虫。
3、示意代码 // 注意,以下代码必须选用中文字体才能工作,
// 但可以处理中英文混合字串,Win95/WinNT4下BCB测试通过
void glDrawString(unsigned char *str)
{
GLYPHMETRICSFLOAT pgmf[1];
HDC hDC=wglGetCurrentDC();
DWORD dwChar;
int ListNum; for(size_t i=0;i< strlen((char *)str);i++)
{
if(IsDBCSLeadByte(str[i]))
{
dwChar=(DWORD)((str[i]><8)|str[i+1]);i++;
}
else
dwChar=str[i];
ListNum=glGenLists(1);
bool ret=false;
ret=wglUseFontOutlines(hDC,dwChar,1,ListNum,0.0,0.1,WGL_FONT_LINES,pgmf);
glCallList(ListNum);
glDeleteLists(ListNum,1);
}
} 提示:在BCB中用Form作OpenGL绘制时,可以利用Form的字体设置信息,在Form初始化或更改字体时显式建立该字体并将它指定给DC,就象这样: void CreateFont(void)
{
HFONT HFont,HOldFont=0;
LOGFON LogFont; // 取字体信息
GetObject(Form1->Font->Handle,sizeof(LOGFONT),&LogFont); // 建立字体
HFont = CreateFontIndirect(&LogFont); // 选用字体
HOldFont=SelectObject (Form1->hDC, HFont); // 清除已经不用的字体
DeleteObject(HOldFont);
}