OpenGL中文字符的显示
浏览:2608次 出处信息
OpenGL的图像处理功能不可谓不强大,但是本身却不提供文字的显示和处理能力,所以我们只有借助于第三方的库来完成这个功能。这里介绍windows下如何在OpenGL里完成中文(当然也包括其他单字节字符了)的正常显示。
这里介绍windows的一个API函数:wglUseFontBitmapsW() ,函数的声明如下:
WINGDIAPI BOOL WINAPI wglUseFontBitmapsW(HDC, DWORD, DWORD, DWORD);
网上很多人都说wglUseFontBitmaps()函数无法显示中文,其实我们只要用wglUseFontBitmapsW()就好了,这个函数即宽字节版本,这样就可以对双字节字符进行正确处理。不过在调用函数前需要将字符串转成宽字节字符,这里调用MultiByteToWideChar()即可。函数的参数说明如下:
第一个参数是HDC,只要知道调用wglGetCurrentDC函数,就可以得到一个HDC了,这是一个windows的显示设备号。
第二个参数表示第一个要产生的字符。
第三个参数表示要产生字符的总个数。
第四个参数表示第一个字符所对应显示列表的编号。假如这里填1000,则第一个字符的绘制命令将被装到第1000号显示列表,第二个字符的绘制命令将被装到第1001号显示列表,依次类推。
下面是显示中文字符的函数:
void drawCNString(const char* str)
{
int len, i;
wchar_t* wstring;
HDC hDC = wglGetCurrentDC(); //获取显示设备
GLuint list = glGenLists(1); //申请1个显示列表
//计算字符的个数
//如果是双字节字符的(比如中文字符),两个字节才算一个字符
//否则一个字节算一个字符
len = 0;
for(i=0; str[i]!=''; ++i)
{
if( IsDBCSLeadByte(str[i]) )
++i;
++len;
}
// 将混合字符转化为宽字符
wstring = (wchar_t*)malloc((len+1) * sizeof(wchar_t));
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1, wstring, len);
wstring[len] = L'';// 只是转义符,它本身的类型是wchar_t
// 逐个输出字符
for(i=0; i<len; ++i)
{
wglUseFontBitmapsW(hDC, wstring[i], 1, list);
glCallList(list);
}
// 回收所有临时资源
free(wstring);
glDeleteLists(list, 1);
}
{
int len, i;
wchar_t* wstring;
HDC hDC = wglGetCurrentDC(); //获取显示设备
GLuint list = glGenLists(1); //申请1个显示列表
//计算字符的个数
//如果是双字节字符的(比如中文字符),两个字节才算一个字符
//否则一个字节算一个字符
len = 0;
for(i=0; str[i]!=''; ++i)
{
if( IsDBCSLeadByte(str[i]) )
++i;
++len;
}
// 将混合字符转化为宽字符
wstring = (wchar_t*)malloc((len+1) * sizeof(wchar_t));
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1, wstring, len);
wstring[len] = L'';// 只是转义符,它本身的类型是wchar_t
// 逐个输出字符
for(i=0; i<len; ++i)
{
wglUseFontBitmapsW(hDC, wstring[i], 1, list);
glCallList(list);
}
// 回收所有临时资源
free(wstring);
glDeleteLists(list, 1);
}
这个函数的用法比较简单,只要了解了wglUseFontBitmapsW()函数就很容易明白了。调用方法如下:
glColor3f(1.0f, 1.0f, 0.0f); // 颜色
glRasterPos2f(-0.7f, -0.1f); // 位置
drawCNString("中国汉字");
glRasterPos2f(-0.7f, -0.1f); // 位置
drawCNString("中国汉字");
当然了,我们还可以通过CreateFontA()来创建自己需要的字体,使我们的显示具有各种各样的效果,这里就不再详细讨论了。
建议继续学习:
- 比较完美地解决了 vim 编辑中文的问题 (阅读:6247)
- smarty的date_format中不能有中文的解决方案 (阅读:3205)
- C#网络通信中中文字符的传送以及SQL数据库存取中文的解决方法 (阅读:2841)
- 如何让 PHP json_encode 函数不转义中文? (阅读:1713)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:hadoop使用过程中的一些小技巧
后一篇:windows 快捷键 总结 >>
文章信息
- 作者:ian 来源: Vimer
- 标签: OpenGL 中文
- 发布时间:2010-04-15 09:52:42
建议继续学习
近3天十大热文
-
[928] WordPress插件开发 -- 在插件使用 -
[134] 解决 nginx 反向代理网页首尾出现神秘字 -
[52] 整理了一份招PHP高级工程师的面试题 -
[52] 如何保证一个程序在单台服务器上只有唯一实例( -
[51] 用 Jquery 模拟 select -
[50] 海量小文件存储 -
[50] Innodb分表太多或者表分区太多,会导致内 -
[50] 全站换域名时利用nginx和javascri -
[49] CloudSMS:免费匿名的云短信 -
[47] jQuery性能优化指南
