• [转]使用CEGUI的Editbox进行中文输入


    刚刚搞CEGUI的时候大体看了一下CEGUI。原以为其不支持中文。

    而且网上很多人都说不支持。。我也就没有细细看了。

    当用到Editbox的时候。又不得不用中文。 这时候问题就来了。

    先是用utf8方式转换达到中文显示的目的。可是中文输入却不行。网上有一种说法是将两个字节链接起来即可。

    我看了一下编译器设置,当前使用的是多字节模式。就不得不这样做了。

    不过估计我对C++还不算深。搞了一会,还是失败了。

    不过后来在网上有一个朋友说CEGUI本来就支持中文的。但又看到其它人说的,不解其言啊。

    再后来有一个叫老妖精的网友给了我一份代码。结果真的成功了。可显示可输入中文。

    对于中文的字表由一个font文件创建。方法如下:

    1:找一个中文字体文件(.ttf)

    2:创建一个文本文件,将其存为.font文件.

    3:在.font文件里写如下代码(我个假设一个chinese.ttf文件):

    <?xml version="1.0" ?>
    <Font Name="chinese" Filename="chinese.TTF" Type="FreeType" Size="10" NativeHorzRes="1024" NativeVertRes="768" AutoScaled="true"/>

    // 说明:Name就是在程序中要用到的名字, Filename就是文件名,FreeType可以是自定义的,具体到官方网有说明.Size就是字体的大小.程序中是不能调大小的.因为字体生成纹理后就是固定的.

    4:在你写的程序的键盘和事件上处理上面正常情况下是这样子的:CEGUI::System->injectChar((CEGUI::utf32)Key); // Key值就是你程序捉到的按键值

    我们需要将其改为:

        if (ImmIsIME(GetKeyboardLayout(0)))
        {
         CEGUI::DbcsSupport::injectChar(Key);
        }
        else
        {
         CEGUI::System->injectChar((CEGUI::utf32)Key);
        }

        ImmIsIME(GetKeyboardLayout(0))目的是用于检则现在的输入法是否打开的。如果是在输英文状态我想你不会画蛇添足的。使用这个需要imm32.lib的支持。MSDN上面也有说明。

    5:最后就是添加一份代码到你的CEGUI使用项目里,如下:

    namespace CEGUI{
    bool DbcsSupport::injectChar(utf32 code_point )
     {
    #ifndef UNICODE
      static char     s_tempChar[3]  = "";
      static wchar_t  s_tempWchar[2] = L"";
      static bool s_flag = false;
      unsigned char  uch  = (unsigned char)code_point;
      if( uch >= 0xA1 )
      {
       if( !s_flag )
       {
        s_tempChar[0] = (char)uch; //第一个字节
        s_flag = true;
        return true;
       }
       else if( uch >= 0xA1 )
       {
        s_tempChar[1] = (char)uch; //第二个字节
        s_flag = false;
        MultiByteToWideChar( 0, 0, s_tempChar, 2, s_tempWchar, 1); //转成宽字节
        s_tempWchar[1] = L'\0';
        utf32 code = (utf32)s_tempWchar[0];
        //Font* fnt = System::getSingleton().getDefaultFont();
        return CEGUI::System::getSingleton().injectChar( code );
       }
       else
       {
        return CEGUI::System::getSingleton().injectChar(code_point);
       }
      }
      else
      {
       s_flag = false;
       return CEGUI::System::getSingleton().injectChar(code_point);
      }
    #else
      return CEGUI::System::getSingleton().injectChar(code_point );
    #endif
     }
    }

    6:我想理论也就这样子的。如果不懂的地方QQ联系我。QQ首页上面有。

    还要感谢网友老妖精给我的提示。和有一个网友给我的一个话:CEGUI本身就可以支持中文的。



    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1509217

  • 相关阅读:
    Android导入自定义的jar包时出现 E/AndroidRuntime(486): java.lang.NoClassDefFoundError错误
    cocos2d-x认识之旅
    ASP.Net MVC Filter验证用户登录
    RHEL6安装调试过程中遇到的问题集
    java8新增特性(二)----函数式接口(Functional)
    京东云、新浪微博等专家畅谈Docker未来格局:开放与竞争(上)
    Activity启动模式的深入分析
    ShopEx 中规格属性添加时,自己主动计算其相应的销售价格,同一时候注意模板中的变量间的计算
    【天气APP】之桌面时钟witget组件
    xcode6.3 模版位置
  • 原文地址:https://www.cnblogs.com/yoran/p/1069388.html
Copyright © 2020-2023  润新知