OgreSupportCHN3.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
OgreSupportCHN3

让OGRE支持中文3 ——中文输入 -1.前言 中文输入终于实现了,这并不是一个轻松的过程,足足用了几个月时间才搞定,真正负责中文输入处理的就是一个简单的类,不过为了实现这个类需要的接口对OGRE进行了大量的改动,在此期间读了相当多的OGRE源码,改写尽量保持OGRE自身的风格,零零碎碎改写的地方相当多,这篇文章难免有疏漏的地方,如果各位真的希望了解真正的改写,还是看看源码比较好,这篇文章能做一个源码导读。我相信大多数OGRE的使用者还是希望直接使用这个输入的,所以我给大家提供了一个例子和相应的代码,大家可以直接拿去用。 0.还是检讨 之前已经写了两篇关于OGRE引擎支持中文的文章,第一篇是位图字体,第二篇是TFF字体,关于位图字体,在字体管理器的管理下,同一字体之产生了一个实例,所以不会产生我在第二篇文章说的用过多字体实例导致内存被占用。在第二篇TFF字体的程序中,有几个严重错误。第一个是释放文字,在写的时候我曾认为每个实例维护一个贴图,事实上却是相同字体实例共同使用一个贴图,而且在正常使用的过程中,这个字体类型的实例也只能有一个,但是调用这个字体类的实例进行渲染的TextAreaGuiElement却有很多,把记录字体是否使用的代码改成引用记数才能正常工作,之前的代码会导致错误的释放。第二个问题是向 贴图画字的时机,如果在申请贴图时候才画字,在某些情况下会无法显示,改成在判断是否使用该字也就是调用引用记数时进行画字便解决了这个问题。第三个问题是在之前代码的顺序下,首先申请绘字空间然后判断是否在字库中有这个字,这样导致申请空间却没有画字的情况出现。在修改了顺序之后解决了这个问题。大体思路没有改变,只是进行了一些修改和优化,有兴趣的朋友可以直接看源码中的OgreFont.h、OgreFont.cpp、OgreTextAreaGuiElement.h,、OgreTextAreaGuiElement.cpp,这四个文件,并和之前的文件对比一下就能发现区别了。 1.捕捉Windows消息 在Windows环境下,如果要进行中文输入,捕捉Windows的祖字消息是必需的,但是OGRE为了其支持多平台的特性,从而拒绝将Windows消息交给用户处理,封装在相应的窗口渲染类中。 上图是处理窗口选的相关类的继承图,其中D3D7RenderWindow(DirectX7.0)、D3D9RenderWindow(DirectX9.0)、Win32Window(OpenGL)三个类是在Windows环境下处理窗口的相应类,Windows消息便封装在这三个类中,在我们所使用的抽象层RenderWindow类中已经无法得知具体的Windows消息,我们要做的就是在RenderWindow中建立一个可以监听Windows消息的接口,并且在D3D7RenderWindow(DirectX7.0)、D3D9RenderWindow(DirectX9.0)、Win32Window(OpenGL)三个类向上传递Windows消息,在Linux和Max环境中没有消息传递(这样的处理破坏了OGRE的多平台性,但是我所知道的中文输入处理只是针对Windows平台的,如果要保持多平台性应该做更多的处理,或者实现自己的输入法,不过这就是一个更大更大的工程了)。 参照OGRE的编码风格,我使用监听者模式,一个向要得知Windows消息的对象,需要具备(继承)Windows消息监听者的接口(RenderWindowListener),然后向RenderWindow实例注册自身,当有Windows消息出现时候RenderWindow实例得到windows消息,并向所有注册的实例发送消息。 我们首先实现两个基础结构和类。 struct RenderWindowEvent //这个结构用来封装windows消息 { HWND hWnd; UINT uMsg; WPARAM wParam; LPARAM lParam; }; class _OgreExport RenderWindowListener //消息监听者的接口 { public: virtual bool RWUpdate(const RenderWindowEvent evt) { return true;} }; 然后在RenderWindow增加 virtual void? addRWListener (RenderWindowListener* liste

文档评论(0)

sb9185sb + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档