冰箱门  
记录和粘贴一些有用的东东
日历
<2025年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789
统计
  • 随笔 - 1
  • 文章 - 9
  • 评论 - 3
  • 引用 - 0

导航

常用链接

留言簿(1)

随笔档案

文章分类

文章档案

搜索

  •  

最新评论

 

2008.5.5


CEGUI使用utf8编码格式。这就意味着我们可以很简单的就显示中文。

1、弄个包含中文的字体,在这里我借用大多数例子里的 “C:/windows/Font/simhei.ttf”文件。把这个文件拷贝到Datafiles文件夹的Font文件夹里。

2、随便照着一个 .Font文件,自己写一个simhei.font文件。可以用TXT写,然后保存,有的朋友说需要保存为utf8编码格式,实际上是不需要的。

3、同时注意修改你加载到程序里的scheme文件,将里面的字体文件设置成simhei.ttf。你也可以继续使用FirstWindow这个例子,这样的话直接修改源代码里的字体为simhei.tff。

4、现在在程序里进行字符编码转换,我拿代码说明问题:

std::wstring aa = L"123中文abcあいうえお";
char buff[128= "";
WideCharToMultiByte( CP_UTF8, 
0, aa.c_str(), aa.size(), buff, sizeof(buff), 00);
button1
->setText ( CEGUI::String ( CEGUI::utf8* )buff );

原理是这样的,对于utf8来说,英文字符和ansi编码 在内存布局上没什么区别,都是一个UCHAR。但是对于非英文字符,则是UCHAR+UCHAR+UCHAR。如果我们手工进行编码格式转换,会比较烦琐。

比较偷懒的方法就是,我们先用WCHAR(unicode内存布局,UCHAR+UCHAR+UCHAR+UCHAR)来储存需要显示的字符串,然后调用Win32API来帮我们把宽字符转换成char(多字节字符集内存布局)。

这就是基本方法了,然后我们可以根据这个转换方针,利用Win32API随意的转换字符编码格式,从而满足程序中的各种需求。



这不是正统的输入法解决方案,只是通过挂载Windows的输入法处理模块来快速实现中文输入法的支持。

主要步骤我在这里摘出来了:

1、在例子工程里全解决方案搜索 “CEGUI::System::getSingleton().injectChar”,你可能会在如下的地方找到:
CEGuiOpenGLBaseApplication.cpp(379)
Win32AppHelper.cpp(100行左右吧,我已经修改了....)
如果你还包含了别的BaseApplication,可能会在别的地方找到,但是这些代码都长的很象这个样子:

// inject Character code
   CEGUI::System::getSingleton().injectChar(.....);

并且一般都会是在一个switch结构里。

2、在使用这句话的函数外面添加下面这个函数:

 


namespace CEGUI{
bool _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( 
00, 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
 }

}

 

该函数进行了国标码的转换,如果不想了解规则,当工具函数用就可以了。

3、将原来的事件插入语句CEGUI::System::getSingleton().injectChar(.....); 改成:

if (ImmIsIME(GetKeyboardLayout(0)))
    
{
     CEGUI::_injectChar(Key);
    }

    
else
    
{
     CEGUI::System
::getSingleton().injectChar((CEGUI::utf32)Key);
    }

4、在该CPP文件头加入

#include <imm.h>
#pragma comment(lib,"imm32.lib")

5、这样的话,CEGUI就可以挂载Windows的输入法处理模块了。如果你看过我上一个笔记,一定知道如何去修改scheme文件以支持显示中文。另外上述代码如果编译不通过的话,一定是命名之类的问题,耐心点修改吧,一般来说,C来的代码都需要修改才能用的。

6、编译一个有输入框的例子,比如FalagarDemo1,注意修改FalagarDemo1所使用的scheme文件。

输入看看?

7、还有一个问题就是关于BackSpace的:如果你在输入框里有字,这个时候输入法输入框里输入错了一个字符,当你按backspace的时候,CEGUI里的输入框上的字也被删了一个。这不是我们期望的行为,解决这个问题有很多途径,你可以在中间渲染层进行这些输入事件插入之前进行判断,也可以注册监听事件进行处理,但是我认为最正确的方法是在需要进行输入法输入的地方,比如EditBox的事件处理函数里特别处理backspace,当然,这需要修改CEGUIEditbox的源代码,不过这件事并不困难。

8、最近在看window 、WindowManager、system等一些CEGUI整体框架上的代码,建议和我一样刚接触CEGUI的朋友们一定要看一看源代码,这样才能了解 什么对象 具有哪些变量,分别对应了什么属性,又有什么操作。刚刚开始看的时候必然十分痛苦,但是相信我,等你从它的事件机制绕出来的时候,你的编程水平一定会发生一些改变:)

原文地址http://thatax.blog.163.com/blog/static/20892680200882711440/

posted on 2009-10-01 20:48 阅读(448) 评论(0)  编辑 收藏 引用 所属分类: CEGUI
 
Copyright © 征 Powered by: 博客园 模板提供:沪江博客