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.h和GUI_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文件相应的copyToClipboard和getTextFromClipboard两个函数体的代码也要做相应修改。
把相关字符串类型从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事件的响应,值得我们了解。