让HGE支持中文(4) - 编辑框的实现
2008-06-27 11:51
148 查看
阅读此文章前请先确认你已经阅读以下文章:
让HGE支持中文(1)-HGE中文显示(必需)
让HGE支持中文(2)-HGE中文输入(必需)
让HGE支持中文(3)-HGE字符串处理(可选)
制作要点:遵循hgeGUI和hgeGUIObject类原则,即所有控件需从hgeGUIObject派生。
步骤:
1.重载hgeGUIObject的相关函数,具体文件尾代码。
2.在每一帧结束时通过hge->Input_GetIMEEvent(&imeEvent)进行中文和英文输入获取。
3.取得中文和英文后添加到字符串列表中。
4.绘制字符串列表。
5.重复2-5步骤。以此循环。
代码:
1.头文件<hgeedit.h>
如果还有什么问题可以来问我,我QQ:29774874。
制作要点:遵循hgeGUI和hgeGUIObject类原则,即所有控件需从hgeGUIObject派生。
步骤:
1.重载hgeGUIObject的相关函数,具体文件尾代码。
2.在每一帧结束时通过hge->Input_GetIMEEvent(&imeEvent)进行中文和英文输入获取。
3.取得中文和英文后添加到字符串列表中。
4.绘制字符串列表。
5.重复2-5步骤。以此循环。
代码:
1.头文件<hgeedit.h>
#pragmaonce #include"helpers/hgegui.h" #include"helpers/hgevector.h" #include"helpers/hgerect.h" #include"helpers/hgefontcn.h" #include<atlstr.h> //------------------------------------------------------------- //描述: //------------------------------------------------------------- classtEditBox:publichgeGUIObject { public: tEditBox(HTEXTUREtex,intid, floattx,floatty,floattw,floatth, hgeFontCN*font,intlen=0x10,floatdstX=0,floatdstY=0); virtualvoidUpdate(floatdt); virtualvoidRender(); virtualvoidLeave(); virtualvoidMouseOver(boolbOver); virtualvoidFocus(boolbFocused){tudb_focus=bFocused,tudb_cursor=bFocused;} virtualboolKeyClick(intkey,intchr); virtualboolMouseMove(floatx,floaty){returntrue;} CStringGetString(){returntudb_str;} voidSetString(CStringstr){tudb_str=str;tudb_pos=tudb_str.GetLength();reflength();} voidClear(){SetString("");} voidSetExpt(floatx,floaty){tudb_ex=x,tudb_ey=y;} private: boolAddChar(charchr[3],boolisIME); boolDelChar(boolfront); voidreflength(); protected: DWORDtudb_color; booltudb_focus,tudb_cursor; inttudb_pos,tudb_maxlen; floattudb_ex,tudb_ey,tudb_plen; hgeFontCN*tudb_font; hgeSprite*tudb_spr; CStringtudb_str; };
2.源文件<hgeedit.cpp>
#include"hgeedit.h"
#include<assert.h>
//-------------------------------------------------------------
//描述:
//-------------------------------------------------------------
tEditBox::tEditBox(HTEXTUREtex,intid,floattx,floatty,floattw,floatth,hgeFontCN*font,intlen,floatdstX,floatdstY)
:hgeGUIObject(id)
{
tudb_color=0xFFFFFFFF;
tudb_focus=false;
tudb_cursor=false;
tudb_ex=tudb_ey=2;
tudb_pos=0;
tudb_spr=0;
tudb_maxlen=len;
tudb_plen=tudb_ex+1;
tudb_font=font;
tudb_spr=newhgeSprite(tex,tx,ty,tw,th);
tguo_rect.Set(dstX,dstY,tw+dstX,th+dstY);
}
//-------------------------------------------------------------
//描述:
//-------------------------------------------------------------
voidtEditBox::Update(floatdt)
{
if(!tudb_focus)
return;
staticfloatlstdt=0;
lstdt+=dt;
if(lstdt>0.4f)
{
tudb_cursor=!tudb_cursor;
lstdt=0;
}
}
//-------------------------------------------------------------
//描述:
//-------------------------------------------------------------
voidtEditBox::Render()
{
tudb_spr->Render(tguo_rect.x1,tguo_rect.y1);
tudb_font->SetColor(tudb_color);
tudb_font->Render(tguo_rect.x1+tudb_ex,tguo_rect.y1+tudb_ey,tudb_str);
if(!tudb_focus)
return;
if(tudb_cursor)
hge->Gfx_RenderLine(tguo_rect.x1+tudb_plen,
tguo_rect.y1+2,
tguo_rect.x1+tudb_plen,
tguo_rect.y2-2,
tudb_color);
hgeIMEEventimeEvent;
while(hge->Input_GetIMEEvent(&imeEvent))
AddChar(imeEvent.value,imeEvent.isIME);
}
//-------------------------------------------------------------
//描述:
//-------------------------------------------------------------
voidtEditBox::Leave()
{
SAFE_DELETE(tudb_spr);
}
//-------------------------------------------------------------
//描述:
//-------------------------------------------------------------
voidtEditBox::MouseOver(boolbOver)
{
//hge->OnMouseOver(bOver,tguo_id);
}
//-------------------------------------------------------------
//描述:
//-------------------------------------------------------------
booltEditBox::KeyClick(intkey,intchr)
{
if(!tudb_focus)
returnfalse;
switch(key)
{
caseHGEK_LEFT:
tudb_cursor=true;
if(tudb_pos>1)
tudb_pos-=(tudb_str[tudb_pos-1]<0)?2:1;
else
tudb_pos=0;
reflength();
break;
caseHGEK_RIGHT:
tudb_cursor=true;
if(tudb_pos<tudb_str.GetLength())
tudb_pos+=(tudb_str[tudb_pos]<0)?2:1;
else
tudb_pos=tudb_str.GetLength();
reflength();
break;
caseHGEK_BACKSPACE:
DelChar(true);
break;
caseHGEK_DELETE:
DelChar(false);
break;
caseHGEK_HOME:
tudb_pos=0;
reflength();
break;
caseHGEK_END:
tudb_pos=tudb_str.GetLength();
reflength();
break;
};
//hge->OnKey(key,chr,tguo_id);
returntrue;
}
//-------------------------------------------------------------
//描述:
//-------------------------------------------------------------
booltEditBox::AddChar(charchr[3],boolisIME)
{
if(tudb_str.GetLength()>=tudb_maxlen)
returnfalse;
CString_str=tudb_str;
if(tudb_pos==0)
{
tudb_str=chr+_str;
}
elseif(tudb_pos==_str.GetLength())
{
tudb_str+=chr;
}
else
{
tudb_str=_str.Mid(0,tudb_pos);
tudb_str+=chr+_str.Mid(tudb_pos,_str.GetLength()-tudb_pos);
}
tudb_pos+=isIME?2:1;
reflength();
returntrue;
}
//-------------------------------------------------------------
//描述:
//-------------------------------------------------------------
booltEditBox::DelChar(boolfront)
{
if(tudb_str.GetLength()<=0)
returnfalse;
CString_str=tudb_str;
int_len=tudb_str.GetLength();
if(front)
{
if(tudb_pos<=0)
returnfalse;
intexp=_str[tudb_pos-1]<0?2:1;
if(tudb_pos==exp)
{
tudb_str.Delete(0,exp);
}
elseif(tudb_pos==_len)
{
tudb_str.Delete(_len-exp);
}
else
{
tudb_str=_str.Mid(0,tudb_pos-exp);
tudb_str+=_str.Mid(tudb_pos,_len-tudb_pos);
}
tudb_pos-=exp;
if(tudb_pos<0)
tudb_pos=0;
reflength();
}
else
{
if(tudb_pos>=_len)
returnfalse;
intexp=_str[tudb_pos]<0?2:1;
if(tudb_pos==0)
{
tudb_str.Delete(0,exp);
}
elseif(tudb_pos==_len-exp)
{
tudb_str.Delete(_len-exp);
}
else
{
tudb_str=_str.Mid(0,tudb_pos);
tudb_str+=_str.Mid(tudb_pos+exp,_len-tudb_pos-exp);
}
}
returntrue;
}
//-------------------------------------------------------------
//描述:
//-------------------------------------------------------------
voidtEditBox::reflength()
{
tudb_plen=tudb_ex+1;
if(!tudb_str.IsEmpty())
{
CString_str=tudb_str.Mid(0,tudb_pos);
tudb_plen+=tudb_font->GetStringWidth(_str);
}
}
此时可能你也会编不过。那是因为我已经将hgeGUI的文件中hgeGUIObject成员变量的名字改变过。
这里我也将hgeGUI的变量名发上来:
classhgeGUIObject
{
public:
hgeGUIObject(intid)
:tguo_id(id)
{
hge=hgeCreate(HGE_VERSION);
tguo_static=false;
tguo_enable=true;
tguo_visible=true;
}
virtual~tGUIObject(){hge->Release();}
virtualvoidRender()=0;
virtualvoidUpdate(floatdt){}
virtualvoidEnter(){}
virtualvoidLeave(){}
virtualvoidReset(){}
virtualboolIsDone(){returntrue;}
virtualvoidFocus(boolbFocused){}
virtualvoidMouseOver(boolbOver){}
virtualboolMouseMove(floatx,floaty){returnfalse;}
virtualboolMouseLButton(boolbDown){returnfalse;}
virtualboolMouseRButton(boolbDown){returnfalse;}
virtualboolMouseWheel(intnNotches){returnfalse;}
virtualboolKeyClick(intkey,intchr){returnfalse;}
constinttguo_id;
booltguo_static;
booltguo_enable;
booltguo_visible;
hgeRecttguo_rect;
hgeGUI*tguo_gui;
hgeGUIObject*tguo_next;
hgeGUIObject*tguo_prev;
protected:
HGE*hge;
};
如果还有什么问题可以来问我,我QQ:29774874。
相关文章推荐
- Extjs Gird 支持中文拼音排序实现代码
- android AutoCompleteTextView 实现输入提示,类似百度支持输入拼音提示中文(gray)
- Android 利用Java实现压缩与解压缩(zip、gzip)支持中文路径
- Mybatis Generator的model生成中文注释,支持oracle和mysql(通过实现CommentGenerator接口的方法来实现)
- Lua For Windows 环境配置及使sciTE支持中文,使用editplus作为编辑工具
- flying-saucer + iText + Freemarker实现pdf的导出, 支持中文、css以及图片
- flying-saucer + iText + Freemarker实现pdf的导出, 支持中文、css以及图片
- Mybatis Generator的model生成中文注释,支持oracle和mysql(通过修改源码的方式来实现)
- 浅析cocos2d-x实现中文支持
- 实现动态搜索结果集,支持中文输入的中间状态
- android AutoCompleteTextView 实现输入提示,类似百度支持输入拼音提示中文(gray)
- python实现支持unicode中文的AC自动机
- VC下实现fopen支持中文的方法
- struts2使用action方式实现文件下载(支持中文文件名)
- Base64 js实现demo,支持中文
- 基于itext7导出pdf实现,支持水印、中文等
- jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】
- MonoDevelop 实现中文支持
- 使用org.apache.commons.net.ftp包开发FTP客户端,实现进度汇报,实现断点续传,中文支持