Irrlicht实现中文输入

来源:互联网 发布:明天教室网络课好吗 编辑:程序博客网 时间:2024/05/16 19:02

Irrlicht实现中文输入

2010-1-28

作者:Kagula

内容概要

以源代码的形式示例,让Irrlicht支持中文输入

读者对象:

熟悉C语言开发工具的程序员

环境

[1]Irrlicht 1.6.1

下载地址:http://irrlicht.sourceforge.net/downloads.html 

[2]Free type 2.3.11

下载地址:http://freetype.sourceforge.net/index2.html 

MT方式生成freetype2311MT.lib文件

[3] irrKlang-1.1.3

  下载地址:http://www.ambiera.com/irrklang/

[4]VisualStudio2008+SP1

正文

下载Irrlicht 1.6.1 SDK包,解开后里面examples里有0.5UserInterface这个例子,通过修改它,来说明修改步骤。

本文用到了

Irrlicht输出中文字符串》

 

Gui_freetype_font.hGUI_freetype_font.cpp文件。请确保这两个文件在当前项目中。

第一步:修改IOSOperator.h COSOperator.h这两个文件,copyToClipboard getTextFromClipboard  函数的数据类型声明,由c8改为wchar_t

例如IOSOperator.h文件关于这两个函数声明修改后的代码如下:

     virtual void copyToClipboard(const wchar_t* text) const = 0;

     virtual const wchar_t* getTextFromClipboard() const = 0;

第二步COSOperator.cpp文件相应的copyToClipboardgetTextFromClipboard两个函数体的代码也要做相应修改。

把相关字符串类型从c8*改为wchar_t*wcslen代替strlen函数调用,wcscpy代替strcpy函数调用。

第三步:修改CGUIEditBox.cpp文件的processKey函数体

case KEY_KEY_C:// copy to clipboard

     。。。

core::stringw s;  //core::stringc s;

。。。

case KEY_KEY_X:// cut to the clipboard

     。。。

     core::stringw sc;//core::stringc sc;

     。。。

case KEY_KEY_V:

     。。。

const wchar_t* p = Operator->getTextFromClipboard();

 

参考上面的代码段,修改字符串类型。

第四步:修改CIrrDeviceWin32.cpp文件,找到WndProc函数在case(message)体中插入下面的代码:

     case WM_IME_CHAR:

         event.EventType = irr::EET_KEY_INPUT_EVENT;

         event.KeyInput.PressedDown = true;

         event.KeyInput.Key = irr::KEY_OEM_CLEAR ;

         event.KeyInput.Shift = 0;

         event.KeyInput.Control = 0;

        

         char p1[2];

         p1[0]=(char)((wParam&0xff00)>>8);

         p1[1]=(char)(wParam&0xff);

 

         if(p1[0]==0)

         {

              event.KeyInput.Char=(short)wParam;

         }

         else

              //多字节代码转unicode    

              MultiByteToWideChar(CP_OEMCP,MB_COMPOSITE,p1,2,&(event.KeyInput.Char),1);

         dev = getDeviceFromHWnd(hWnd);

 

         if (dev)

              dev->postEventFromUser(event);

     break;

  最后一步:修改UserInterface例子中的main.cpp文件

Step1:在包含头文件的地方插入下面的代码

#define COMPILE_WITH_FREETYPE

#include "gui_freetype_font.h"

Step2:IGUISkin* skin = env->getSkin();前插入下面代码

     CGUITTFace myFace;

     myFace.load("simhei.ttf");

 

     CGUIFreetypeFont myFont(driver);

     myFont.attach(&myFace,12);

Step3:修改IGUISkin* skin = env->getSkin();下面的代码段,修改后的代码如下:

     //IGUIFont* font = env->getFont("../../media/fonthaettenschweiler.bmp");

     //if (font)

  skin->setFont(&myFont);

总结

    如正文所示,修改Irrlicht源文件支持中文输入还是很简单的,上面最关键的代码段应该是WM_IME_CHAR事件的响应,值得我们了解。