金桥科普  
设为首页 关于我们 邮箱登录
科普聚焦时代科技科普生活科学技术自然科学航空航天科技博览历史考古电脑IT
您现在的位置: 首页 >> 科普频道 >> 电脑游戏 >> 文章详情
SDL系列教程:SDL和IME

akinggw 金桥信息 2006-08-14

SDL系列教程:SDLIME

 

作者:Daniel Vogel

翻译:akinggw

 

前言

 

最近这段时间一直在为SDL不能输入中文而烦心。于是到处找这方面的文章,找是找到了,有一个台湾的朋友搞了一个SDLIM,但是没有提供相关的设计原理,只知道要在WIN32环境下要输入中文必须使用一个叫IMEInput method editor)的东西。于是又找了一下关于IME的文章,有关于DX的,但就是没有关于SDL的。

好不容易,终于在SDL的邮件列表中发现了一个关于SDLIME 使用的帖子,但还是不太明白,特此翻译过来与大家分享交流。

 

SDLIME

 

当我试图让我的输入代码支持亚洲语言时,我便到处去搜集文章,可惜的是这方面的文章实在是太少了。为此,我将我自己在这方面的研究成果承上来,也许对你有所帮助。

 

下面的代码可以很好的工作在日语,中文和韩文窗口上。

 

首先,让我们定义一些全局的。

 

Int SupportsIME, CurrentIMESize;

 

然后建立IME窗口。

 

HIMC hImc=ImmGetContext(Window->hWnd);

If(!hImc)

{

debugf(TEXT(“Creating IME context.”));

hImc=ImmCreaeContext();

if(hImc)

ImmAssociateContext(Window->hWnd,hImc);

Else

Debugf(TEXT(“OS doesn’t support IME.”));

}

else

ImmReleaseContext(Window->hWnd,hImc);

 

 

SupportsIME=hImc !=NULL;

If(SupportsIME)

{

HIMC hImc=ImmGetContext(Window->hWnd);

If(!hImc)

{

debugf(TEXT(“Creating IME context.”));

hImc=ImmCreateContext();

if(hImc)

ImmAssociateContext(Window->hWnd,hImc);

Else

SupportsIME=0;

CurrentIMESize=0;

}

else

ImmReleaseContext(Window->hWnd,hImc);

}

 

下面的代码是用来处理IME窗口消息的。

 

Case WM_IME_COMPOSITION:

{

//Final composition string.

If( lParam & GCS_RESULTSTR)

{

HIMC hImc = ImmGetContext(Window->hWnd);

 

If(!hImc)

AppErrorf(“TEXT(“No IME context”));

 

//Get the size of the result string.

Int Size=ImmGetCompositionString(hImc,GCS_RESULTSTR,NULL,0);

 

TCHAR* String=new TCHAR[Size+1];

AppMemzero(String,sizeof(TCHAR)* (Size+1));

 

//Get the result strings that is generated by IME.

Size=ImmGetCompositionString(hImc,GCS_RESULTSTR,String,Size);

Size/=sizeof(TCHAR);

 

//Send backspaces.

For(int I=0;I<CurrentIMESize;I++)

{

CauseInputEvent(IK_Backspace,IST_Press);

CauseInputEvent(IK_Backspace,IST_Release);

}

 

// Snd key to input system.

For(int I=0;I<Size;I++)

{

int Key=String[I];

if(Key)

Client->Engine->Key(this,IK_Unicode,String[I]);

}

 

delete[] String;

 

ImmReleaseContext(Window->hWnd,hImc);

CurrentIMESize=0;

}

 

// Compsition in progress.

 

Else if(lParam &GCS_COMPSTR)

{

HIMC Himc=ImmGetContext(Window->hWnd);

 

If(!hImc)

AppErrorf(TEXT(“No IME context”));

 

//Get the size of the result string.

Int Size=ImmGetCompositionString(hImc,GCS_COMPSTR,NULL,0);

 

TCHAR* String=new TCHAR[Size+1];

AppMemzero(String,sizeof(TCHAR)*(Size+1));

 

//Get the result strings that is generated by IME.

Size=ImmGetCompositionString(hImc,GCS_COMPSTR,String,Size);

Size/=sizeof(TCHAR);

 

//Send backspaces

for(int I=0;I<CurrentIMESize;I++)

{

CauseInputEvent(IK_Backspace,IST_Press);

CauseInputEvent(IK_Backspace,IST_Release);

}

 

//Send key to input system

for(int I=0;I<Size;I++)

{

int key=String[I];

if(Key)

Client->Engine->Key(this,IK_Unicode,String[I]);

}

 

delete[] String;

 

ImmReleaseContext(Window->hWnd,hImc);

CurrentIMESize=Size;

}

else

return DefWindowProcX(Window->hWnd,iMessage,wParam,lParam);

 

return 0;

}

 

如果你只是希望IME缓冲用于聊天,那么你可以象下面这样写。

 

Bool Enable;

 

If(SupportsIME)

{

if(!Enable)

{

ImmAssociateContext(Window->hWnd,NULL);

CurrentIMESize=0;

}

else

{

HIMC hImc=ImmGetContext(Window->hWnd);

If(!hImc)

{

debugf(TEXT(“Creating IME context.”));

hImc=ImmCreateContext();

if(hImc)

ImmAssociateContext(Window->hWnd,hImc);

Else

SupportsIME=0;

 

CurrentIMESize=0;

}

else

{

ImmAssociateContext(Window->hWnd,hImc);

ImmReleaseContext(Window->hWnd,hImc);

}

}

}

 


  发表评论 写信给编辑 关闭窗口
同栏目内容
· 瑞典在网游中开设虚拟大使馆 2007-06-06
· 魔兽争霸3秘籍(魔兽无敌秘籍) 2007-03-28
· DirectDraw之旅(1) 2006-08-11
· 2D游戏中人物被遮挡的透明效果 2006-08-11
· 如何实现游戏截屏功能 2006-08-11
· 从头学习DirectDraw 2006-08-11
相关内容
近期主推
西藏发现青藏高原最大冰川群
·西藏发现青藏高原最大冰川群
·中日: "月亮女神"携手"嫦娥"
·行星大碰撞砸死恐龙催生人类
·美研制会飞汽车定价9万美元
·美国教授设计出自适应机器人
·银河系可能有20多个黑洞
近期热门
英海域惊现大龙虾为普通龙虾5倍
·英海域惊现大龙虾为普通龙虾5倍
·新物种金蛙体表有剧毒
·我国嫦娥工程计划测量月球
·精神病药物可治多种癌症
·视觉震撼:来自海底的精灵
·能删除不良记忆的药物诞生
近期焦点
广西发现罕见溶洞钟乳石有30万年
·广西发现罕见溶洞钟乳石有30万年
·澳大利亚惊现“卡布基诺”海滩
·美国"彩色"瀑布夜幕下震撼游人
·地球上究竟有多少个物种
·英国探险家北极游泳破纪录
·世界之最 世上最小的动物
金桥科普是一个公益性栏目,内容由作者提供或摘自互联网,其目的是向广大网民普及科学技术知识。如果您发现本网站转载或摘编了您拥有著作权的作品,请通知我们(电话:023-63659911),我们立即删除。
关于我们 | 网站地图 | 用户注册 | 广告客户 | 招聘信息 | 业务信息
Copyright@2006-2009 JQInfo.com,WONDER. All Rights Reserved
重庆科技咨询中心.重庆网得信息技术有限公司.版权所有
Email:webmaster@jqinfo.com
重庆数据通信局提供网络带宽. 渝ICP备05002327号