Irrlicht实现中文输入

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事件的响应,值得我们了解。

你可能感兴趣的:(中文)