您的位置:首页 > 其它

让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>

#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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: