游戏引擎设计一界面库(Crapell Game Engine Design - UI lib)

Crapell游戏引擎提供丰富的UI控件,包括按钮、列表、树形控件等,支持XML和GUI格式资源文件,具备动画、富文本编辑、3DUI等功能,可自定义外观和交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Crapell游戏引擎设计简介

1,ui控件列表: 

class GuiControl;          //基本控件
class GuiGroupCtrl;        //组控件
class GuiGroupTargetCtrl;  //目标组控件
class GuiButtonCtrl;       //按钮
class GuiRadioCtrl;        //单选
class GuiTabCtrl;          //活页
class GuiTableCtrl;        //表格
class GuiSpinCtrl;         //微调
class GuiProgressBarCtrl;  //进度条
class GuiComboxCtrl;       //下拉框
class GuiScrollBarCtrl;    //滚动盒
class GuiScrollBagCtrl;    //滚动条
class GuiListCtrl;         //列表
class GuiTreeCtrl;         //树
class GuiFastTreeCtrl;     //简易树
class GuiEditCtrl;         //文本编辑
class GuiEditRectCtrl;     //文本编辑多行
class GuiRichTextCtrl;     //富文本显示
class GuiRichEditCtrl;     //富文本编辑
class GuiCodeEditCtrl;     //代码编辑
class GuiMovieCtrl;        //3d
class GuiParticleCtrl;     //粒子
class GuiTextureNumCtrl;   //数字
class GuiDragIconCtrl;     //可拖动图标
class GuiTimeLineCtrl;     //时间轴
class GuiLineCtrl;         //线段
class GuiDiagramCtrl;      //流程图
class GuiHtmlCtrl;         //浏览器
 

自己写游戏引擎一UI(make game engine by self - UI lib) - twopointfive - twopointfive的博客

2,基本使用:

ui资源文件可以使用.gui和.xml两种格式,.gui类似于.xml也是嵌套格式,.gui格式实现了一些类似c++的预处理。控件组(group)可以嵌套子控件组和子控件,像文件夹可以嵌套子文件夹和子文件一样以便于管理(示例见附录)。可以配合notepad++或UI编辑器来编辑ui资源文件。

    template<typename T>
    void MAPCTRL(T& ctrl,const char* name)
    {
        GuiControl* temp = GetCtrl(name);
        ctrl = dynamic_cast<T> (GetCtrl(name));
    }
通过路径映射控件句柄,可以使用通配符 * 来匹配控件的路径: ../表示上一层相对路径,$表示绝对根路径:
    // "../../aa.bb.cc"           ../只能在开头且连续
    //"$.aa.bb.cc"              $表示root(guimgr)
    //"../*.aa.bb.cc"            也是可以的
    // "$.*.aa.*.cc"              也是可以的

提供一系列接口来设置控件的各个属性,同时提供了一个万能接口,该接口同时适用于简化脚本绑定
    //!万能接口 根据字符串解析设置属性
    LoadState FormatProperty(const char* data);

控件的基本属性:

enum AlignTypeW
{
	ATW_LEFT = 0,//左对齐
	ATW_RIGHT ,  //右对齐
	ATW_CENTER,  //居中对齐
	ATW_PERSENT  //百分比对齐
};

enum ExtendType
{
	ET_PIXCEL = 0,    //像素大小
	ET_PERSENT,       //百分比大小
	ET_ONEMINUSPIXEL, //实际大小=父窗口大小-配置大小
};

String	m_idName; //名字
String	m_tips;   //提示
//!声音
String  m_wakeSoundName;
bool    m_wakeSoundLoop;
String  m_clickSoundName;

//!res texture
String	      m_textureName[GCS_NUM];    //纹理
Color	      m_color      [GCS_NUM];    //颜色
RectF         m_uvwh       [GCS_NUM];    //uv
String	      m_frameHeaderName[GCS_NUM];//动画
int           m_opacityType;             //混合模式
eExpandTexType m_expandTexType;          //纹理扩充模式

String        m_luaScriptFun;          //脚本

//!相对父窗口,转换前,可能是百分比或右对齐等
RectF	    m_ctrlRectFlex;            //位置

AlignTypeH  m_alignTypeH;              //对齐方式
AlignTypeW  m_alignTypeW;

ExtendType  m_extendTypeH;             //大小方式
ExtendType  m_extendTypeW;

bool     m_canHit;  //是否可点击
bool     m_doClip;  //是否对自身和子控件执行遮罩
bool     m_beClip;  //是否接受父控件遮罩

float    m_rot;
bool     m_bCircle; //圆形

bool     m_bVisible;
bool     m_bEnable;

bool     m_dragable; //可被拖动
bool     m_sizeable; //可变大小

通过重载虚函数实现回调:
    virtual bool ProcButtonUp       (GuiButtonCtrl    *ctrl);
   ......
也可以使用Callback添加自定义回调:
    button->CallBack()->Add("MouseUp",this,&LoginGui::OnButton_Start,"start");

    template<class T>
    void AddCtrlCallBack(const char* name,const char* command,T*obj,int (T::*OnCBCommand)(const char* args, void* argp), const char* args,void* argp=NULL)
    {
        GuiControl* ctrl;
        MAPCTRL(ctrl,name);
        if (ctrl)
        {
            if(argp==NULL)argp = ctrl;
           ctrl->CallBack()->Add(command,obj,OnCBCommand, args, argp);
        }
    }

3,继承关系:

在配置文件中可以通过inherit关键字设置继承关系。比如如下设置inherit = "$Button.Text",则fire按钮控件继承$Button.Text控件的所有属性。fire控件与父控件(ButtonDefault)相同的属性即可省略配置,如果重新配置则覆盖继承的属性。$符号表示继承的是模板库中的控件,没有$则从当前文件中查找要继承的的控件。

GuiButtonCtrl "fire"
{
    inherit = "$Button.Text"
    textureNormal = "data/gui/MainMenu/exploide06.png"
    textureOver   = "data/gui/MainMenu/exploide06.png"
    colorOver     = 1.000000,1.000000,1.000000,1.000000
    x = 200
    y = 0
    width  = 600
    height = 300
    framesys = 2,2,
    {
        0,[0,0,0,][1,1,1,][0,0,0,][0,0.75,0.25,0.25,]1,
        2,[0,0,0,][1,1,1,][0,0,0,][0.25,0.75,0.25,0.25,]1,
    }
}end 

4,列表控件、树形控件:

可以将任意控件组用作列表或树控件的元素,可以完全的自定义外观(只需要在ui源文件中配置元素模板即可)。

树形控件的使用一般比较繁琐,多使用嵌套递归添加节点。下面是tree控件的两个主要接口:

//@brief:插入节点(Group)或末端节点(Item),并返回该节点以便递归插入。
	//        节点(Group)以m_groupTemplate为模板,末端节点(Item)以m_itemTemplate为模板。
	//        这两个模板可以由程序设置,也可以缺省为资源文件的ctrl lib中配置。
	//        因此每个节点可以是灵活的不同类型。
	//@pos:插入的位置,为-1时插到尾部,
	//@parentItem:插入到的父节点
	GuiControl*   InsertItem(int pos=-1,GuiGroupCtrl* parentItem = NULL);
	GuiGroupCtrl* InsertGroup(int pos=-1,GuiGroupCtrl* parentItem = NULL);

使用示例如下

/*
ui编辑器中使用tree控件浏览选中的待编辑控件(target)的结构
*/
void GuiEditorDialog::BrowserCtrl(GuiControl* target,GuiTreeCtrl* tree,GuiGroupCtrl* parentItem /*= NULL*/)
{
	GuiGroupCtrl* targetSubCtrlGroup;
	GuiGroupCtrl* targetCtrlGroup = dynamic_cast<GuiGroupCtrl*>(target);
	if (targetCtrlGroup==NULL)
	{
		return;
	}
	GuiControl* item;
	GuiGroupCtrl* group_;
	GuiButtonCtrl* itemText;
	GuiButtonCtrl* groupText;

	//自身
	if (parentItem == NULL)
	{
		parentItem = m_browser->InsertGroup(-1,NULL);
		parentItem->MAPCTRL(groupText,"GroupHeader.groupTxt");
		if(groupText)
		{
			groupText->SetText(target->GetIdName().c_str());
		}
	}

	//targetCtrlGroup->nu
	for(CtrlVec::iterator it=targetCtrlGroup->m_ctrls.begin(); it!=targetCtrlGroup->m_ctrls.end();it++)
	{
		targetSubCtrlGroup = dynamic_cast<GuiGroupCtrl*>(*it);
		if (targetSubCtrlGroup)
		{
			group_ = m_browser->InsertGroup(-1,parentItem);
			group_->MAPCTRL(groupText,"GroupHeader.groupTxt");
			if(groupText)
			{
				groupText->SetText(targetSubCtrlGroup->GetIdName().c_str());
			}
			//递归
			BrowserCtrl(targetSubCtrlGroup,tree,group_);
		}
		else
		{
			item = m_browser->InsertItem(-1,parentItem);
			((GuiGroupCtrl*)item)->MAPCTRL(itemText,"itemTxt");
			if(itemText)
			{
				itemText->SetText((*it)->GetIdName().c_str());
			}
		}
	}
}

5,提示工具tip,用于rpg游戏中各种icon悬浮提示:

只需继承TipRender,鼠标移动到icon等有提示内容的控件上时自动回调到virtul SetTip(GuiControl*fromCtrl)。在这个函数中根据被提示控件fromCtrl向GuiRichTextCtrl中写内容即可。GuiRichTextCtrl支持富文本显示、图片混排、自动换行等功能。同样也可以使用对话框界面来做提示功能。
父类TipRender会自动弹出提示框并调整到合理位置显示。

class SP_TipRender : public TipRender
{
public:
	SP_TipRender();
	virtual ~SP_TipRender();

	static const int TOOLTIPWIDTH = 270;

public:
	virtual void Render();
	virtual void SetTip(GuiControl*fromCtrl);
	virtual void SetTip(const char*txt);
	virtual bool OnWake();
	virtual void SetVisible(bool _visible);

private:
	void SetUsingTip       (void* fromDataInfo);
	void SetPropTip        (void* fromDataInfo);
	void SetWeaponTip      (void* fromDataInfo);
	void SetSkillTip       (void* fromDataInfo);
	void SetUsingStyleTip  (void* fromDataInfo);
	void SetPropStyleTip   (void* fromDataInfo);
	void SetWeaponStyleTip (void* fromDataInfo);
	void SetMapStyleTip    (void* fromDataInfo);
	void SetNpcStyleTip    (void* fromDataInfo);
	void SetMonsterStyleTip(void* fromDataInfo);
	void SetPlantStyleTip  (void* fromDataInfo);
	void SetBugStyleTip    (void* fromDataInfo);
public:
	GuiRichTextCtrl* m_htmlTipRender;
	int              m_fontSizeTitle;
	int              m_fontSizeNormal;
	int              m_fontStyleTitle;
	int              m_fontStylePropertyName;
};

6,可拖动、可设置cd和提示气泡的icon:

GuiDragIconCtrl控件,可以设置cd速度。可以拖动整理图标。

7,动画

在ui资源文件中可以配置framesys来设置控件动画。可以为控件的普通、点击、高亮等状态设置不同的动画。

在c++代码中也可以通过Tween来更简洁的设置控件动画。

{
	float duration = 0.5f;
	GuiTweenClip* tweenClip = new GuiTweenClip(-1,NULL);
	Sequence* sequence = new Sequence;
	sequence
		->AddTween(new TweenColor(tweenClip->m_color,Color(1,1,1,0),Color(1,1,1,0.0f),0.0f, TweenEase::Ease_Linear))
		->Delay(0.3f)
		->AddTween(new TweenColor(tweenClip->m_color,Color(1,1,1,0),Color(1,1,1,1.0f),0.5f, TweenEase::Ease_Linear))
		->Delay(RandRange(0.0f,1.0f))//相位参差
		->AddTween(new TweenColor(tweenClip->m_color,Color(1,1,1,1),Color(1,1,1,0.2f),duration, TweenEase::Ease_Linear))
		->AddTween(new TweenColor(tweenClip->m_color,Color(1,1,1,0.2f),Color(1,1,1,1),duration, TweenEase::Ease_Linear))
		->Delay(0.5f)
		->Repeat(-3,-1);
	tweenClip->AddSequence(sequence);
	gameIcon->SetTweenClip(tweenClip);
}

GuiMovieCtrl可以在界面上播放3d场景动画。可以借助max制作动画场景,整体导出到该控件中播放。

8,界面贴到3D动画模型表面:

任意ui控件可以显示3d movie,比如滚条按钮可以3d动画显示。窗体可以贴到动画模型表面且可以响应输入。3D UI 可以应用骨骼动画、morph动画等。可以贴在诸如橱柜里、石碑上、跑动的卡车上,增加游戏的代入感。

游戏引擎设计一界面库(Crapell Game Engine Design - UI lib) - twopointfive - twopointfive的博客

调用GuiGroupTargetCtrl的如下两个接口绑定纹理:

RenderTarget* GetRenderTarget(){return m_renderTarget;}
	void Bind();

该控件重载了如下两个函数,完成屏幕坐标的转换。
bool GuiGroupTargetCtrl::OnInputEvent(InputEvent& event_);
GuiControl* GuiGroupTargetCtrl::FindMouseCtrl(vec2 offset,vec2& pos);
在这两个函数中首先将屏幕坐标转换为鼠标点选射线,射线和贴到的宿主模型求交点,取出交点的纹理系坐标作为新的‘屏幕坐标’。

9,富文本编辑控件:

许多UI库对文本编辑控件(edit、richedit)的实现都是简化版的,文本编辑控件几乎是所有UI控件中最难实现的,它的功能是否完善可以作为检测一个ui库的参考指标。从qa的角度,文本编辑器应该具有的功能:英文、中文输入,插入符显示,框选显示等, 看似简单但细节很多,比如文本选择、超框滚动功能等。

    文字显示特效: 粗体 斜体 描边 阴影 镂空  闪动 下滑线 删除线 背景色 背景边框

    输入法相关,在windows系统中,使用系统ime。
                          在android系统中,使用自定义的T9输入法,软键盘。

    自定义的rtf格式可以拷贝粘贴到剪贴板

10,流程图控件、时间轴控件:

  

11,简单的使用示例:

 富文本编辑器,很简短的代码即可实现

class RTFEditorGui:public EditorDlgBase
{
public:
	RTFEditorGui();
	virtual bool OnWake();
	virtual bool OnSleep();
	virtual const char* GetTypeName();
	static  const char* DlgName();

	virtual bool OpenFile(const char* fileName,bool listFile=false);
	virtual bool SaveFile(const char* fileName);

private:
	virtual void        Update();
	virtual void        Render();
	virtual bool ProcButtonUp       (GuiButtonCtrl    *ctrl);
	virtual bool ProcButtonDown     (GuiButtonCtrl    *ctrl);
	virtual bool ProcDragIconUp     (GuiDragIconCtrl  *ctrl);
	virtual bool ProcEditUpdate     (GuiControl       *ctrl);
	virtual bool ProcComboxUp       (GuiComboxCtrl    *combox,GuiControl* item,GuiControl* ctrl);

	int  OnColorPickOkCancel(const char* args,void* argp);
	//void PropertyCtrl(GuiControl* ctrl,bool bSend);

private:
	GuiRichEditCtrl* m_viewRichEdit;
	GuiEditRectCtrl* m_sourceRichEdit;
	GuiButtonCtrl  * m_sourceLength;
};



#include "General/Pch.h"
#include "General/CallBack.h"
#include "Gui/GuiControlMisc.h"
#include "Gui/EditorGuis.h"
#include "Gui/GuiMgr.h"
#include "Render/RendDriver.h"
#include "General/StringUtil.h"
#include "General/Pce.h"

static int Size[] = {12,16,24,28,36,44,56,78};
RTFEditorGui::RTFEditorGui()
:m_viewRichEdit(NULL)
,m_sourceRichEdit(NULL)
{
	char buf[] = "Gui Files (*.rtf)\0*.rtf\0All (*.*)\0*.*\0";
	for (int i=0;i<sizeof(buf);i++)
	{
		m_fileFormat[i] = buf[i]; 
	}
	//m_fileDefaultDir = ".\\data\\gui";
}

bool RTFEditorGui::OnWake()
{
	EditorDlgBase::OnWake();
	MAPCTRL(m_viewRichEdit    ,"*.scrollBar_editView.*.richedit");
	MAPCTRL(m_sourceRichEdit  ,"*.scrollBar_editSource.*.editRect");

	MAPCTRL(m_sourceLength  ,"*.bytesNum");
 
	{
		GuiComboxCtrl* itemCombox;
		MAPCTRL(itemCombox  ,"*.combox_fontsize");
		GuiListCtrl* listCtrl = itemCombox->GetListCtrl();
		if (listCtrl)
		{
			listCtrl->ClearItem();
			for (int i=0;i<sizeof(Size)/4;i++)
		 {
			 GuiButtonCtrl* item = dynamic_cast<GuiButtonCtrl*>(listCtrl->InsertItem());
			 if (item)
				 item->SetText(StrFormat("%d",Size[i]));
		 }
		}
		itemCombox->SetCheckPos(0);
	}

	{
		GuiComboxCtrl* itemCombox;
		MAPCTRL(itemCombox  ,"*.combox_fontface");
		GuiListCtrl* listCtrl = itemCombox->GetListCtrl();
		if (listCtrl)
		{
			listCtrl->ClearItem();
			for (int i=0;i<4;i++)
			{
				GuiButtonCtrl* item = dynamic_cast<GuiButtonCtrl*>(listCtrl->InsertItem());
				if (item)
				{
					item->SetText(FontFaceToString(i));
				}
			}
		}
		itemCombox->SetCheckPos(0);
	}


	OpenFile("data/test/rtfeditor.rtf");

	//SubCtrlState("Menu.combox_view.*.menu_propertybox",GCS_CLICK);
	//SubCtrlState("Menu.combox_view.*.menu_listbox",GCS_CLICK);
	//SubCtrlState("Menu.combox_view.*.menu_treebox",GCS_CLICK);
	//SubCtrlState("Menu.combox_view.*.menu_richeditbox",GCS_NORMAL);
	//
	return true;
}

bool RTFEditorGui::OnSleep()
{
	return true;
}

void RTFEditorGui::Update()
{
	EditorDlgBase::Update();
}

void RTFEditorGui::Render()
{
	GuiGroupCtrl::Render();
}

const char* RTFEditorGui::GetTypeName()
{
	return "GuiGroupCtrl";
}
const char* RTFEditorGui::DlgName()
{
	return "RTFEditorGui";
}
bool RTFEditorGui::OpenFile(const char* fileName,bool listFile)
{
	if (fileName==NULL || strlen(fileName)>=MAX_PATH)
	{
		return false;
	}
	//if(!m_canvans) 
	//	return false;

	std::string fileext = GetFileExtension(fileName);

	if( fileext == "rtf")
	{
		m_fileName = fileName;

		//属性
		//PropertyCtrl(NULL,true);

		File file;
		file.Fopen(fileName,"rt");
		m_viewRichEdit->AddLabelText(file.GetData());
		m_sourceRichEdit->SetText(file.GetData());
	}

	return true;
}

bool RTFEditorGui::SaveFile(const char* fileName)
{
#ifdef WIN32APP
	char   szFile[MAX_PATH]   =   {0}; 
	strcpy(szFile,fileName);
	{

	}
#endif
	return true;
}

bool RTFEditorGui::ProcButtonUp(GuiButtonCtrl* ctrl)
{
	if (!ctrl)
	{
		return true;
	}
	EditorDlgBase::ProcButtonDown(ctrl);
	return true;
}

bool RTFEditorGui::ProcDragIconUp(GuiDragIconCtrl* ctrl)
{
	if (!ctrl)
	{
		return true;
	}
	EditorDlgBase::ProcDragIconUp(ctrl);
	String path = ctrl->GetPath();
	String name = ctrl->GetIdName();
	int select = 0;
	if (  strncmp(name.c_str(),"icon",4)==0
		&&name.length()>4
		)
	{
		select = atoi(name.c_str()+4);
	}

	if(strstr(path.c_str(),"toolbaricon0"))
	{
		GuiRichTextCtrl::Words words;
		m_viewRichEdit->GetSelCharFormat(words);
		unsigned int effect = 0;
		unsigned int backEffect = 0;
		switch(select)
		{
		case 0: effect = FS_BOLD; break;
		case 1: effect = FS_ITALIC; break;
		case 2: effect = FS_UNDERLINE; break;
		case 3: effect = FS_DELETELINE; break;
		case 4: effect = FS_SHADOW; break;
		case 5: effect = FS_OUTLINE; break;
		case 6: effect = FS_HOLLOW; break;
		case 7: effect = FS_LIGHT; break;
		case 8: m_viewRichEdit->SetSelCharFlash(!words.flash);break;
		case 9:  backEffect = FB_RECT; break;
		case 10: backEffect = FB_BORDERLINE; break;
		case 11:
			G_GuiMgr->PushGui("ColorPickerDialog",GL_DIALOG);
			G_GuiMgr->GetGui("ColorPickerDialog")->CallBack()->Add("onOk",this,&RTFEditorGui::OnColorPickOkCancel,"font");
			m_viewRichEdit->SetSelCharColor(Color(1,0,0,1));
			break;
		case 12:
			G_GuiMgr->PushGui("ColorPickerDialog",GL_DIALOG);
			G_GuiMgr->GetGui("ColorPickerDialog")->CallBack()->Add("onOk",this,&RTFEditorGui::OnColorPickOkCancel,"back");
			break;
		//case 13:
		//	m_viewRichEdit->SetSelCharSize(!words.flash);
		//	break;
		case 19:
			{
				char   buf[512]; 	
				char   szFile[MAX_PATH]   =   {0}; 	
				char   fileFormat[] = "pic Files (*.png)\0*.png\0All (*.*)\0*.*\0";
				GetOpenFileName_(szFile,fileFormat,m_fileDefaultDir.c_str()); 
				if( szFile[0])  
				{
					sprintf(buf,"<W><bmp=%s><picSize=030,030>",szFile);
					m_viewRichEdit->ReplaceSel(buf,vec2I(30,30));
				}
			}
			break;
		}

		if (effect!=0)
		{
			if(words.style&effect)
				m_viewRichEdit->RemoveSelCharEffect((FontStyle)effect);
			else 
				m_viewRichEdit->AddSelCharEffect((FontStyle)effect);
		}
		if (backEffect!=0)
		{
			if(words.bStyle&backEffect)
				m_viewRichEdit->RemoveSelBackEffect((FontBackStyle)backEffect);
			else 
				m_viewRichEdit->AddSelBackEffect((FontBackStyle)backEffect);
		}
	}
	else if (strstr(path.c_str(),"toolbaricon1"))
	{

	}
	return true;
}

bool RTFEditorGui::ProcComboxUp(GuiComboxCtrl* combox,GuiControl* item,GuiControl* ctrl)
{
	if (combox)
	{
		if (combox->GetIdName()=="combox_fontsize")
		{
			int sel = combox->GetCheckPos();
			m_viewRichEdit->SetSelCharSize(Size[sel]);
		}	
		if (combox->GetIdName()=="combox_fontface")
		{
			int sel = combox->GetCheckPos();
			m_viewRichEdit->SetSelCharFace(sel);
		}	
	}	
	return true;
}
bool RTFEditorGui::ProcEditUpdate(GuiControl* ctrl)
{
	//GuiEditCtrl GuiEditRectCtrl GuiRichEditCtrl
	if (!ctrl)
	{
		return true;
	}
	String name = ctrl->GetIdName();
	if (name == "edit_view")
	{
		m_sourceRichEdit->SetText(m_viewRichEdit->GetLabelText().c_str());
		int _min,_max;
		m_viewRichEdit->GetSel(_min,_max);
		m_sourceRichEdit->SetSel(_min,_max);
		m_sourceRichEdit->SetIMECaret(m_viewRichEdit->GetIMECaret());
		m_sourceLength->SetText(StrFormat("%d/%d  %d/%d",m_sourceRichEdit->GetLineNum(),m_sourceRichEdit->GetLimitLineNum(),(int)m_sourceRichEdit->GetText().length(),m_sourceRichEdit->GetLimitWordNum()));
	}
	else if (name == "edit_source")
	{
		//m_viewRichEdit->Clear();
		//m_viewRichEdit->AddLabelText(m_sourceRichEdit->GetText());
		//int _min,_max;
		//m_sourceRichEdit->GetSel(_min,_max);
		//m_viewRichEdit->SetSel(_min,_max);
		//m_viewRichEdit->SetIMECaret(m_sourceRichEdit->GetIMECaret());
	}
	return true;
}

int  RTFEditorGui::OnColorPickOkCancel(const char* args,void* argp)
{
	if (args && strcmp(args,"back")==0)
	{
		m_viewRichEdit->SetSelCharBackColor(G_GuiMgr->GetGui<ColorPickerDialog>()->GetPickedColor());
	}	
	else if (args && strcmp(args,"font")==0)
	{
		m_viewRichEdit->SetSelCharColor(G_GuiMgr->GetGui<ColorPickerDialog>()->GetPickedColor());
	}
	return 0;

}

bool RTFEditorGui::ProcButtonDown(GuiButtonCtrl* ctrl)
{
	if (!ctrl)
	{
		return true;
	}
	EditorDlgBase::ProcButtonDown(ctrl);
	//String path = ctrl->GetPath();
	String name = ctrl->GetIdName();
	if (name == "menu_new")
	{

	}
	else if (name == "menu_undo")
	{
		
	}
	else if (name == "menu_richeditbox")
	{
		bool visible = ctrl->GetState() == GCS_CLICK;
		SubCtrlVisible("sourceeditor",visible);
		//SubCtrlVisible("sourceeditor.codeEditCtrl",visible);

	}
	else if (name == ">>")
	{
		m_sourceRichEdit->SetText(m_viewRichEdit->GetLabelText().c_str());
		int _min,_max;
		m_viewRichEdit->GetSel(_min,_max);
		m_sourceRichEdit->SetSel(_min,_max);
		m_sourceRichEdit->SetIMECaret(_max/*m_viewRichEdit->GetIMECaret()*/);
	}
	else if (name == "<<")
	{
		m_viewRichEdit->Clear();
		m_viewRichEdit->AddLabelText(m_sourceRichEdit->GetText().c_str());
		int _min,_max;
		m_sourceRichEdit->GetSel(_min,_max);
		m_viewRichEdit->SetSel(_min,_max);
		m_viewRichEdit->SetIMECaret(m_sourceRichEdit->GetIMECaret());
	}
	return true;
}

附录:

ui资源文件格式示例:

//========================================================

/**
*  @file      PlayGui.gui
*  Brief:  PlayGui
*  Author:     LouLei
*  Email:  twopointfive@163.com
*/     
//========================================================
"PlayGui"
{
    x = 0
    y = 0
    width  = 1
    height = 1
    wakeSoundLoop = "1"
    extendTypeH = PERSENT
    extendTypeW = PERSENT
    GuiButtonCtrl "deadMask"
    {
        inherit = "$Button.Default"
        textureNormal  = "data/gui/PlayGui/deadmask.png"
        textureClick   = "data/gui/PlayGui/deadmask.png"
        textureOver    = "data/gui/PlayGui/deadmask.png"
        textureDisable = "data/gui/PlayGui/deadmask.png"
        x = 0
        y = 0
        width  = 1
        height = 1
        canhit  = 0
        visible = 0
        beclip = 0
        expandTex = 0
        extendTypeH = PERSENT
        extendTypeW = PERSENT
        frameline = "",loop1,tex1,3,
        {
            0, [0.00,0.00] [1.00,1.00] 0.00 [0.00,0.00,1.00,1.00] 1.00
            20,[0.00,0.00] [1.00,1.00] 0.00 [0.00,0.00,1.00,1.00] 0.50
            40,[0.00,0.00] [1.00,1.00] 0.00 [0.00,0.00,1.00,1.00] 1.00
        }
    }end 
    GuiButtonCtrl "hurtMask"
    {
        inherit = "$Button.Default"
        textureNormal  = "data/gui/PlayGui/hurtMask.png"
        textureClick   = "data/gui/PlayGui/hurtMask.png"
        textureOver    = "data/gui/PlayGui/hurtMask.png"
        textureDisable = "data/gui/PlayGui/hurtMask.png"
        x = 0
        y = 0
        width  = 1
        height = 1
        canhit  = 0
        visible = 0
        beclip = 0
        expandTex = 0
        extendTypeH = PERSENT
        extendTypeW = PERSENT
        frameline = "",loop1,tex1,3,
        {
            0, [0.00,0.00] [1.00,1.00] 0.00 [0.00,0.00,1.00,1.00] 1.00
            10,[0.00,0.00] [1.00,1.00] 0.00 [0.00,0.00,1.00,1.00] 0.70
            20,[0.00,0.00] [1.00,1.00] 0.00 [0.00,0.00,1.00,1.00] 1.00
        }
    }end 
    GuiMovieCtrl "chuanglian_icon"
    {
        colorNormal   = 1, 1, 1, 1
        colorOver     = 1, 1, 1, 1
        colorDisable  = 1, 1, 1, 1
        x = -200
        y = 0
        width  = 500
        height = 200
        canhit  = 0
        beclip = 0
        alignTypeW = CENTER
        movieName = "data/gui/PlayGui/iconMovie.movie"
        movieWidth = 800 
        movieHeight = 600 
    }end 
    GuiRadioCtrl "rpgSkillIcons"
    {
        x = -250
        y = 5
        width  = 500
        height = 200
        alignTypeW = CENTER
        GuiDragIconCtrl "icon0"
        {
            textureNormal  = "data/gui/playGui/skillframe_n.png"
            textureClick   = "data/gui/playGui/skillframe_h.png"
            textureOver    = "data/gui/playGui/skillframe_h.png"
            x = 0
            y = 0
            width  = 38
            height = 38
            bCheck = 1
            state  = 1
        }end 
        GuiDragIconCtrl "icon1"
        {
            inherit = "icon0"
            x = 40
        }end 
        GuiDragIconCtrl "icon2"
        {
            inherit = "icon0"
            x = 80
        }end 
        GuiDragIconCtrl "icon3"
        {
            inherit = "icon0"
            x = 120
        }end 
        GuiDragIconCtrl "icon4"
        {
            inherit = "icon0"
            x = 160
        }end 
        GuiDragIconCtrl "icon5"
        {
            inherit = "icon0"
            x = 200
        }end 
        GuiDragIconCtrl "icon6"
        {
            inherit = "icon0"
            x = 240
        }end 
        GuiDragIconCtrl "icon7"
        {
            inherit = "icon0"
            x = 280
        }end 
        GuiDragIconCtrl "icon8"
        {
            inherit = "icon0"
            x = 320
        }end 
        GuiDragIconCtrl "icon9"
        {
            inherit = "icon0"
            x = 360
        }end 
        GuiDragIconCtrl "icon10"
        {
            inherit = "icon0"
            x = 400
        }end 
        GuiDragIconCtrl "icon11"
        {
            inherit = "icon0"
            x = 440
        }end 
    }end 
    GuiGroupCtrl "pickedCharacter"
    {
        x = 5
        y = 65
        width  = 100
        height = 200
        GuiButtonCtrl "movieback"
        {
            textureNormal  = "data/gui/playGui/SkillBack_n.png"
            textureClick   = "data/gui/playGui/SkillBack_n.png"
            textureOver    = "data/gui/playGui/SkillBack_n.png"
            x = 0
            y = 0
            width  = 100
            height = 150
            visible = 0
        }end 
        GuiMovieCtrl "moviePick"
        {
            colorNormal   = 1, 1, 1, 1
            colorClick    = 1, 1, 1, 1
            colorOver     = 1, 1, 1, 1
            colorDisable  = 1, 1, 1, 1
            x = 0
            y = 0
            width  = 100
            height = 125
            movieWidth = 800 
            movieHeight = 600 
        }end 
        GuiRichTextCtrl "richtext"
        {
            textureNormal  = "data/gui/common/null.png"
            colorNormal   = 1, 1, 1, 1
            colorOver     = 1, 1, 1, 1
            colorDisable  = 1, 1, 1, 1
            x = 5
            y = 100
            width  = 190
            height = 90
            limitLineNum = "6"
        }end 
        GuiProgressBarCtrl "characterHelthBar"
        {
            textureNormal  = "data/gui/playGui/RoleBar.png"
            textureClick   = "data/gui/playGui/RoleBar.png"
            textureOver    = "data/gui/playGui/RoleBar.png"
            x = 5
            y = 135
            width  = 83
            height = 10
            text = "health"
            textureBar = "data/gui/playGui/RoleBar_red.png"
            textureBarBack = "data/gui/playGui/RoleBar_black.png"
        }end 
        GuiButtonCtrl "characterMask"
        {
            textureNormal  = "data/gui/playGui/characterMask.png"
            textureClick   = "data/gui/playGui/characterMask.png"
            textureOver    = "data/gui/playGui/characterMask.png"
            x = 0
            y = 0
            width  = 100
            height = 150
        }end 
    }end 
    GuiGroupCtrl "resourcebar"
    {
        textureNormal  = "data/gui/playGui/resourceBar.png"
        textureClick   = "data/gui/playGui/resourceBar.png"
        textureOver    = "data/gui/playGui/resourceBar.png"
        colorNormal   = 1, 1, 1, 1
        colorClick    = 1, 1, 1, 1
        colorOver     = 1, 1, 1, 1
        colorDisable  = 1, 1, 1, 1
        x = 255
        y = 0
        width  = 255
        height = 71
        alignTypeW = RIGHT
        GuiButtonCtrl "TimeIndicator"
        {
            textureNormal  = "data/gui/playGui/TimeIndicator.png"
            textureClick   = "data/gui/playGui/TimeIndicator.png"
            textureOver    = "data/gui/playGui/TimeIndicator.png"
            x = 0
            y = 0
            width  = 35
            height = 35
            frameline = "",loop1,tex1,2,
            {
                0, [180.00,30.00] [1.00,1.00] 0.00 [0.00,0.00,0.50,1.00] 1.00
                200,[180.00,30.00] [1.00,1.00] 0.00 [1.00,0.00,0.50,1.00] 1.00
            }
        }end 
        GuiButtonCtrl "background"
        {
            textureNormal  = "data/gui/playGui/resourceBar.png"
            textureClick   = "data/gui/playGui/resourceBar.png"
            textureOver    = "data/gui/playGui/resourceBar.png"
            x = 0
            y = 0
            width  = 255
            height = 71
        }end 
        GuiButtonCtrl "text0"
        {
            inherit = "$Button.Text"
            x = 26
            y = 3
            width  = 86
            height = 15
            tip = "金币,通过打怪获得。"
            text = "0"
        }end 
        GuiButtonCtrl "text1"
        {
            inherit = "$Button.Text"
            x = 112
            y = 3
            width  = 86
            height = 15
            tip = "人头,通过打怪获得。"
            text = "0"
        }end 
        GuiButtonCtrl "text2"
        {
            inherit = "$Button.Text"
            x = 198
            y = 3
            width  = 86
            height = 15
            tip = "晶石,通过采矿获得。"
            text = "0"
        }end 
    }end 
    GuiGroupCtrl "rolebar"
    {
        x = 5
        y = 5
        width  = 200
        height = 200
        GuiProgressBarCtrl "characterHelthBar"
        {
            textureNormal  = "data/gui/playGui/RoleBar.png"
            textureClick   = "data/gui/playGui/RoleBar.png"
            textureOver    = "data/gui/playGui/RoleBar.png"
            x = 0
            y = 0
            width  = 151
            height = 16
            text = "health"
            textureBar = "data/gui/playGui/RoleBar_red.png"
            textureBarBack = "data/gui/playGui/RoleBar_black.png"
        }end 
        GuiProgressBarCtrl "characterMagicBar"
        {
            textureNormal  = "data/gui/playGui/RoleBar.png"
            textureClick   = "data/gui/playGui/RoleBar.png"
            textureOver    = "data/gui/playGui/RoleBar.png"
            x = 0
            y = 20
            width  = 151
            height = 16
            text = "magic"
            textureBar = "data/gui/playGui/RoleBar_blue.png"
        }end 
        GuiProgressBarCtrl "characterExpBar"
        {
            textureNormal  = "data/gui/playGui/RoleBar.png"
            textureClick   = "data/gui/playGui/RoleBar.png"
            textureOver    = "data/gui/playGui/RoleBar.png"
            x = 0
            y = 40
            width  = 151
            height = 16
            text = "experience"
            textureBar = "data/gui/playGui/RoleBar_exp.png"
        }end 
    }end 
    GuiGroupCtrl "dialogmenu"
    {
        x = 5
        y = 250
        width  = 156
        height = 450
        GuiButtonCtrl "button_character"
        {
            textureNormal  = "data/gui/playGui/RoleButton_n.png"
            textureClick   = "data/gui/playGui/RoleButton_d.png"
            textureOver    = "data/gui/playGui/RoleButton_h.png"
            x = 0
            y = 0
            width  = 44
            height = 51
            tip = "角色"
        }end 
        GuiButtonCtrl "button_taskbag"
        {
            textureNormal  = "data/gui/playGui/QuestButton_n.png"
            textureClick   = "data/gui/playGui/QuestButton_d.png"
            textureOver    = "data/gui/playGui/QuestButton_h.png"
            x = 0
            y = 50
            width  = 44
            height = 49
            tip = "任务"
        }end 
        GuiButtonCtrl "button_itembag"
        {
            textureNormal  = "data/gui/playGui/ItemBagButton_n.png"
            textureClick   = "data/gui/playGui/ItemBagButton_d.png"
            textureOver    = "data/gui/playGui/ItemBagButton_h.png"
            x = 0
            y = 100
            width  = 44
            height = 49
            tip = "物品"
        }end 
        GuiButtonCtrl "button_skillbag"
        {
            textureNormal  = "data/gui/playGui/SkillBagButton_n.png"
            textureClick   = "data/gui/playGui/SkillBagButton_d.png"
            textureOver    = "data/gui/playGui/SkillBagButton_h.png"
            x = 0
            y = 150
            width  = 44
            height = 49
            tip = "技能"
        }end 
        GuiButtonCtrl "button_config"
        {
            textureNormal  = "data/gui/playGui/ConfigButton_n.png"
            textureClick   = "data/gui/playGui/ConfigButton_d.png"
            textureOver    = "data/gui/playGui/ConfigButton_h.png"
            x = 0
            y = 200
            width  = 44
            height = 49
            tip = "设置"
        }end 
        GuiButtonCtrl "button_backMain"
        {
            textureNormal  = "data/gui/playGui/exitButton_n.png"
            textureClick   = "data/gui/playGui/exitButton_d.png"
            textureOver    = "data/gui/playGui/exitButton_h.png"
            x = 0
            y = 250
            width  = 31
            height = 32
            text = "退出"
        }end 
        GuiButtonCtrl "button_exitMiniGame"
        {
            textureNormal  = "data/gui/PlayGui/miniStop.png"
            textureClick   = "data/gui/PlayGui/miniStop.png"
            textureOver    = "data/gui/PlayGui/miniStop.png"
            colorClick    = 1, 0, 0, 1
            colorOver     = 0, 1, 0, 1
            x = 0
            y = 300
            width  = 97
            height = 30
            tip = "退出当前小游戏"
            clickSound = "data/sound/ui_button.wav"
        }end 
        GuiButtonCtrl "button_singlegame"
        {
            textureNormal  = "data/gui/playGui/singlegamebutton_n.png"
            textureClick   = "data/gui/playGui/singlegamebutton_d.png"
            textureOver    = "data/gui/playGui/singlegamebutton_h.png"
            x = 50
            y = 100
            width  = 44
            height = 49
            tip = "mini大厅"
        }end 
        GuiButtonCtrl "button_lobby"
        {
            textureNormal  = "data/gui/playGui/matchbutton_n.png"
            textureClick   = "data/gui/playGui/matchbutton_d.png"
            textureOver    = "data/gui/playGui/matchbutton_h.png"
            x = 50
            y = 150
            width  = 44
            height = 49
            tip = "mini大厅"
        }end 
        GuiButtonCtrl "button_shop"
        {
            textureNormal  = "data/gui/playGui/shop_n.png"
            textureClick   = "data/gui/playGui/shop_d.png"
            textureOver    = "data/gui/playGui/shop_h.png"
            x = 50
            y = 200
            width  = 44
            height = 49
            tip = "商城"
        }end 
        GuiMovieCtrl "menuMovie"
        {
            colorNormal   = 1, 1, 1, 1
            colorOver     = 1, 1, 1, 1
            colorDisable  = 1, 1, 1, 1
            x = 0
            y = 0
            width  = 156
            height = 450
            canhit  = 0
            beclip = 0
            movieName = "data/gui/PlayGui/menuMovie.movie"
            movieWidth = 800 
            movieHeight = 600 
        }end 
    }end 
    GuiGroupCtrl "npcBubble"
    {
        textureNormal  = "data/gui/MissionDlg/npcBubble.png"
        textureClick   = "data/gui/MissionDlg/npcBubble.png"
        textureOver    = "data/gui/MissionDlg/npcBubble.png"
        colorNormal   = 1, 1, 1, 1
        colorClick    = 0, 1, 0, 1
        colorOver     = 1, 1, 0, 1
        x = 0
        y = 0
        width  = 300
        height = 100
        visible = 0
        frameline = "",loop1,tex1,7,
        {
            0, [0.00,0.00] [1.00,1.00] 0.00 [0.00,0.00,1.00,1.00] 1.00
            10,[0.00,-10.00] [1.10,1.10] 0.00 [0.00,0.00,1.00,1.00] 0.50
            20,[0.00,0.00] [1.00,1.00] 0.00 [0.00,0.00,1.00,1.00] 1.00
            30,[0.00,-10.00] [1.10,1.10] 0.00 [0.00,0.00,1.00,1.00] 0.50
            40,[0.00,0.00] [1.00,1.00] 0.00 [0.00,0.00,1.00,1.00] 1.00
            50,[0.00,-20.00] [1.20,1.20] 0.00 [0.00,0.00,1.00,1.00] 0.50
            60,[0.00,0.00] [1.00,1.00] 0.00 [0.00,0.00,1.00,1.00] 1.00
        }
        GuiRichTextCtrl "htmlNpcBubble"
        {
            textureNormal  = "data/gui/common/null.png"
            colorNormal   = 1, 1, 1, 1
            colorOver     = 1, 1, 1, 1
            colorDisable  = 1, 1, 1, 1
            x = 15
            y = 25
            width  = 250
            height = 100
            limitLineNum = "3"
        }end 
    }end 
    GuiGroupCtrl "playNotice"
    {
        textureNormal  = "data/gui/MissionDlg/npcBubble.png"
        textureClick   = "data/gui/MissionDlg/npcBubble.png"
        textureOver    = "data/gui/MissionDlg/npcBubble.png"
        colorNormal   = 1, 1, 1, 1
        colorClick    = 0, 1, 0, 1
        colorOver     = 1, 1, 0, 1
        x = 300
        y = 280
        width  = 300
        height = 150
        visible = 0
        alignTypeW = RIGHT
        alignTypeH = BOTTOM
        GuiRichTextCtrl "htmlPlayNotice"
        {
            textureNormal  = "data/gui/common/null.png"
            colorNormal   = 1, 1, 1, 1
            colorOver     = 1, 1, 1, 1
            colorDisable  = 1, 1, 1, 1
            x = 15
            y = 25
            width  = 250
            height = 150
            limitLineNum = "4"
        }end 
    }end 
    GuiButtonCtrl "minigameEnter"
    {
        inherit = "$Button.Default"
        textureNormal  = "data/gui/PlayGui/minigameEnter.png"
        textureClick   = "data/gui/PlayGui/minigameEnter.png"
        textureOver    = "data/gui/PlayGui/minigameEnter.png"
        textureDisable = "data/gui/PlayGui/minigameEnter.png"
        x = 0
        y = 0
        width  = 1
        height = 1
        beclip = 0
        expandTex = 0
        opacityType = Add
        frameline = "",loop1,tex1,3,
        {
            0, [0.00,0.00] [1.00,1.00] 0.00 [0.00,0.00,1.00,1.00] 1.00
            10,[0.00,0.00] [1.00,1.00] 0.00 [0.00,0.00,1.00,1.00] 0.70
            20,[0.00,0.00] [1.00,1.00] 0.00 [0.00,0.00,1.00,1.00] 1.00
        }
    }end 
    GuiGroupCtrl "getItems"
    {
        x = 300
        y = 150
        width  = 300
        height = 150
        GuiMovieCtrl "getItemsMovie"
        {
            colorNormal   = 1, 1, 1, 1
            colorOver     = 1, 1, 1, 1
            colorDisable  = 1, 1, 1, 1
            x = 0
            y = 0
            width  = 156
            height = 450
            canhit  = 0
            visible = 0
            beclip = 0
            movieName = "data/gui/BaoxiangUI/baoxiang.movie"
            movieWidth = 800 
            movieHeight = 600 
        }end 
    }end 
}end 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值