CSDN博客

img complayer

VB OpenGL 汉字显示

发表于2004/7/17 1:09:00  4313人阅读

这两天公司有个项目要用ESRI 的ArcScene做三维,但是中文道路名要用扩展模块才能写不上去。

ESRI在方便用户和开发人员角度和微软很象,跟新技术也跟得很紧,提供了大量的示例程序,找了一个写文字的程序看了一下,它通过OpenGL写上去的。我听说过OpenGL只有C接口,没想到VB也能写OpenGL得东东。原来是有人做了一个OpenGL的类型库vbogl.tlb,本机上没有到网上一搜找到了这个网站http://home.pacific.net.hk/%7Eedx/

   原本以为万事大吉了,没想到麻烦事才刚刚开始。外国人提供的源程序当然是写西文的,没想到把它改写成能显示中文费了如此大的劲。我对OpenGL不熟悉,看了好几个例子才写TrueType文字是怎么回事。先用wglUseFontOutlines函数创建glyph也叫显示列表(Display list),相当于一个小的矢量图形,然后调用glCallLists把它画出来。每个glyph创建时都有一个编号,以后通过这个编号来引用它。该编号与文字的编码如ASCII或汉字内码没有任何必然的联系,因为西文字符集小,所以很多例子都是先生成所有可显示西文字符的glyph,然后直接用字符串来引用这些glyph。这样做给我理解上制造了不少麻烦,汉字字符集太大不可能所有汉字都生成对应的glyph。

  后来在网上找到一个VC写的能显示3D中文字符的代码片断,它是一个一个字符处理的,当初觉得很奇怪,因为西文字符串都是成批处理的,中西文或纯中文必须一个一个处理。后来终于明白了,原来是这么这么回事,给字符串中每个字符生成一个独立的glyph。VC中可以了,转到VB中来,原本以为问题不是很大,没想到折腾了一天。

VB内部对字符串表示用BSTR,编码是Unicode的。OpenGL没有Unicode版只有ANSI版,麻烦事来了。想了各种办法就是不出来汉字,后来发现是编码不对。VC中没有定义UNICODE默认是DBCS,中文环境下是GBK编码。比如“中国”Unicode是“0x4E2D56FD”,而GBK编码是“0xD6D0B9FA”。必须把VB中的Unicode转换成GBK吗才能正确显示。有两种办法一种是调用API函数WideCharToMultiByte来转,但在VB中还有一个更简单的办法就是调用全局函数StrConv(s, vbFromUnicode)返回一个GBK编码的字节数组。这样就可以了。

0 0

相关博文

我的热门文章

img
取 消
img