不算地道原创,他山之玉,我再来磨磨。在http://bbs.ogre3d.cn/forums/bbs/viewthread.php?tid=1138&extra= 也发了一下
首先找到了这两篇参考文章:
(1)http://www.cnblogs.com/gogoplayer/archive/2008/05/09/1189874.html
(2)http://hghhe.blog.163.com/blog/static/3237756820097192512944/
这两个都是在1.7之前版本上试验的。
与文章(1)中步骤形成对照,按下面的顺序实行:
1、现在Media/packs/下没有OgreCore.zip这个文件了,要修改SdkTrays界面的中文显示,须修改SdkTrays.zip下的内容。
2、我向SdkTrays.zip里添加了微软雅黑的字体msyh___0.ttf
3、打开SdkTrays.zip中的SdkTrays.fontdef,里面有SdkTrays/Caption和SdkTrays/Value两个定义块,一个主要为控件标题用(如按钮上显示的文字),一个主要为控件含有的内容用(如文本框里的说明)。我直接把两者里的source字段后内容换成msyh___0.ttf了。当然还要加上code_points字段和后面的值(常用汉字以及英文字母字符等)。
4、因为我没有像文章(1)中的第3步那样追加字体定义,所以这步SdkTrays.overlay就不用修改了。
5、这一步有区别了。
在sample.h中有这个成员变量Ogre::NameValuePairList mInfo;专门记录加载例子的信息,追溯NameValuePairList 的定义,在ogrecommon.h文件中:
typedef map<String, String>::type NameValuePairList;
这里需要改成:typedef map<String, UTFString>::type NameValuePairList;
同时应该还要在ogrecommon.h里包含一下头文件文件OgreUTFSring.h
6、上面完成后,到Terrain.h中Sample_Terrain构造函数内,将
mInfo["Title"] = "Terrain";
改成
mInfo["Title"] = L"地形";
7、最后编译生成:结果如图:
问题
正如文章(2)提到,这里有个效率和灵活性的问题:如果希望能显示很多汉字,那么字体定义的code_points字段后面就要加上很多值,从而生成文字纹理会占用一定时间;但如果只添加你需要的汉字,那么每次想更改汉字显示内容,就要手工添加一些值,比较麻烦。
不知道有没有一劳永逸的方法?
在论坛里搜了一下,发现这位朋友提的文字
http://bbs.ogre3d.cn/forums/bbs/ ... =%E4%B8%AD%E6%96%87
为什么
RenderWindow* initialise(bool autoCreateWindow, const String& windowTitle = "模拟训练系统", const String& customCapabilitiesConfig = StringUtil::BLANK);
这个代码就能使窗口标题显示汉字呢?
我也不明白,源码里,追到OgreRenderSystem.cpp里的
RenderWindow* RenderSystem::_initialise(bool autoCreateWindow, const String& windowTitle)
似乎就没头绪了
========================== 2010年7月5日 补充 ============================
中文显示时,SelectMenu在addItem时加不进去两个以上汉字的原因:
SelectMenu继承Widget,Widget::fitCaptionToArea()函数用来将文字合适地填充进控件标题。其中
会不恰当地引起截断,所以造成错误。这个函数可整个简化成:
area->setCaption(caption);