刚刚搞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
 }
}

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

posted on 2007-02-28 10:25 清源游民 阅读(4100) 评论(8)  编辑 收藏 引用 所属分类: OGRE

FeedBack:
# re: (转)CEGUI 中文输入
2007-03-02 16:53 | pathbreaker
如果是这样,那又何必改CEGUI的代码呢。  回复  更多评论
  
# re: (转)CEGUI 中文输入
2007-07-04 16:19 | 包子
那请问
Font::xmlHandler::startElement - The unknown Font:Type attribute value 'FreeType' was encountered while processing the Font file.
是什么原因么/  回复  更多评论
  
# re: (转)CEGUI 中文输入
2007-07-28 17:25 | 李锦俊
@包子

又见包子。。。
哈哈
你这个问题,估计是用了0.4版的cegui吧?或者没有开启FreeType系统  回复  更多评论
  
# re: (转)CEGUI 中文输入
2007-10-26 15:48 | showlong
又不是转载我的... - -#  回复  更多评论
  
# re: (转)CEGUI 中文输入
2007-10-26 15:49 | showlong
又是转载我的,转载可否注明出处... - -#  回复  更多评论
  
# re: (转)CEGUI 中文输入
2007-10-26 16:16 | i清源游民
@showlong
因为不是从你的blog里直接转的,当初看到这篇文章时不知出处,所以只能说报歉。不过可以肯定的是,如果以后转文章时,肯定会先看看是不是你写的,如果是,那绝不会转过来。建议你在文章前加上版权声明,那样效果好些。  回复  更多评论
  
# re: (转)CEGUI 中文输入
2007-10-26 21:30 | Minidx全文检索
……  回复  更多评论
  
# re: (转)CEGUI 中文输入
2009-07-27 10:27 | 游客
纠正你一个错误,程序中是可以更改字体的大小  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2007年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

留言簿(35)

随笔分类(78)

随笔档案(74)

文章档案(5)

搜索

  •  

最新评论

阅读排行榜

评论排行榜