CEGUI说明文档



《CEGUI说明文档》由会员分享,可在线阅读,更多相关《CEGUI说明文档(8页珍藏版)》请在装配图网上搜索。
1、一. CEGUI sdk概述
主要功能:
提供一些用户界面的组件,如按钮,列表框,文本框,滚动条等。
组件的创建:
所有的组件都是由名字空间CEGUI中WindowManager类的一个实例通过成员函数creatWindow(const CEGUI::String &type,const CEGUI::String &name=” “)来创建。
格式如下:
Slider* slider = static_cast
2、inMgr为WindowManager类的实例。字符串"TaharezLook/Slider"是创建组件的风格,"my slider"是组件的名字,名字不能重复。组件通过自己的成员函数设置自己的属性以及事件响应等。 组件的组合方式: 各种组件是以树形结构组合在一起的。组件通过各自的成员函数addChildWindow()来添加自己的子组件。例如 主窗口 子窗口 按钮 滚动条 文本筐 滑块 子组件可以设置在父组件中的位置,大小等。 组件的显示: 1.通过CEGuiRendererSelector* d_rendererSelector选择使用gui渲染类型,
3、如D8、D9之类。 2.根据选择的渲染类型,创建CEGuiBaseApplication* d_sampleApp的应用实例,实例会在初始化的时候进行D3D初始化、D3Dinput初始化、窗口初始化等操作。 3.进入组件渲染,处理windows消息和输入消息的循环。 二. CEGUI对xml文档的解析过程 CEGUI中负责对xml文档解析并加载的类是CEGUI::XMLParser,他是一个基类,主要的成员函数都需要由子类来实现。这个类的所有成员如下: XMLParser(void) ~XMLParser(void
4、) [virtual] cleanup(void) 在使用之后清除XMLParser模型,调用虚函数cleanupImpl(void)=0。 cleanupImpl(void)=0 [protected, pure virtual] 由继承的子类来实现,在TinyXMLParser类的实现中并未进行任何操作,没用。 d_identifierString [protected] Xml解析模型的标识字符串,在实现CEGUI::XMLParser的类中对他进行赋值,例如在TinyXMLParser类中就是这样一个字符串"CEGUI::TinyXMLParser
5、- Official tinyXML based parser module for CEGUI" getIdentifierString() const 公有接口,获得当前使用的xml解析模型的标识,可以知道现在用的是哪个解析模型。返回一个String类的字符串。 initialise(void) 公有接口,返回一个bool值来确定解析模型是否已经初始化,可用。 initialiseImpl(void)=0 [protected, pure virtual] Initialise()的实现,返回true,这个函数被实现即说明有解析模型可以使用了。 pars
6、eXMLFile(XMLHandler &handler, const String &filename, const String &schemaName, const String &resourceGroup)=0 [pure virtual] 公有接口,对xml文档进行解析,要由继承的子类来实现。 接着将对parseXmlFile函数的一个重要参数handler进行解释。 XMLHandler这个类和XMLParser有些类似,他的成员函数也是需要他的子类来实现的。他的作用就是持有一些类的实例的指针,在解析过程中,把解析得到的结果保存在实例的容器中。 下面具体解释一下X
7、MLHandler这个类 除了构造函数和析构函数,还有两个 virtual void elementStart(const String& element, const XMLAttributes& attributes); virtual void elementEnd(const String& element); 这两个函数会在parseXmlFile函数中被调用,element是解析器分析得到的元素名,attributes是解析器的属性控制,用来得到相应元素的属性值。 XMLHandler类本身有四个函数的定义,但是都为空,需要他的子类来实现重载。 保存结果所用实例
8、的指针也是在子类中定义的,使用XMLHandler声明一个对象的时候作为构造的参数传递给他。这个实例的指针在解析之后将会被保存直到整个程序结束,实例中就是解析得到的结果。 用CEGUI中读取scheme的例子来说明xml文档的读取过程(scheme就是xml结构的文档)。下面这一语句完成了TaharezLook.scheme的解析和结果保存,在CEGUI名字空间中,可以直接使用。 SchemeManager::getSingleton().loadScheme("../datafiles/schemes/TaharezLook.scheme"); 其中SchemeManage
9、r类从Singleton类继承,我们有
class CEGUIEXPORT SchemeManager : public Singleton
10、chemeManager的某个成员容器中,并且之后还能随时访问。 以下是loadScheme的执行过程(其中写日志的操作将被省去) l 使用用new Scheme (scheme_filename, resourceGroup);来创建Scheme对象。 n 创建一个Scheme_xmlHandler handler(this)持有当前Scheme对象 n 调用parseXMLFile来解析文档。 u 使用TinyXMLParser解析得到元素 u 使用handler的成员函数对解析到的元素进行识别保存等。 l 根据元素的类型,把元素的属性保存在Scheme对象对应的容器
11、中。
n 调用loadResources(void)来分配解析得到资源。
u 逐个扫描Scheme的各个容器。容器中元素分配到各种组件的Manager中分别保存。
u Scheme中的元素的属性值其实是其余文件的路径。在分配的时候会由各种组件的Manager类进行再次读取解析。详细请看CEGUIScheme.cpp文件中的loadResources函数。
l 把创建的Scheme对象保存在map
12、anager WidgetLookManager WindowManager 这些类与SchemeManager有类似的对xml文档进行读写的操作。他们读取的文档针对不同的类型。如图片,字体,窗口等。 其中WindowManager是读取CELayout的类,他有一个成员函数loadWindowLayout用来读取界面,返回一个指向window的指针。 关于layout的xml文档数据结构,请勿必看一下GUILayout.xsd和demolayout.xml,可以知道界面是如何用xml文档来表示的。(两个文档在CELayoutEditor这个软件的安装文件夹中) 用Wind
13、owManager装入layout文档之后。即可创建文档中定义的界面窗口。界面的数据保存在WindowManager中。有关layout文档解析,参看CEGUIGUILayout_xmlHandler.cpp文件中的函数实现。 三. 界面装载 前面说的都是程序的运行过程。实际上使用界面的装载非常简单,用前面提到loadWindowLayout函数即可返回一个window的指针,把这个window加到现有的框架window上面即可。 四.中文字符使用 std::wstring szWstring(L"你好,世界!" ); char *szUtf8String = NULL;
14、 int iLengthAnsiString = 0; iLengthAnsiString = WideCharToMultiByte(CP_UTF8, 0,szWstring.c_str(), szWstring.capacity(), NULL, 0, NULL, NULL); szUtf8String = new char[ iLengthAnsiString]; memset(szUtf8String, 0, sizeof(char)*(iLengthAnsiString)); WideCharToMultiByte(CP_UTF8, 0,szWstring.c_s
15、tr(), szWstring.length(), szUtf8String, iLengthAnsiString, NULL, NULL); textwnd->setText((CEGUI::utf8*)szUtf8String); delete [] szUtf8String; szUtf8String = NULL; 中文输入的使用。 SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)"../datafiles/schemes/123.scheme"); System::getSinglet
16、on().setDefaultMouseCursor((CEGUI::utf8*)"TaharezLook", (CEGUI::utf8*)"MouseArrow"); // FontManager::getSingleton().createFont("../datafiles/fonts/Commonwealth-10.font"); System::getSingleton().setDefaultFont((CEGUI::utf8*)"songti" ); CEGUI::Font* font = CEGUI::FontManager::getSingleton()
17、.getFont((CEGUI::utf8*)"songti" ); font->setAutoScalingEnabled(true); font->setNativeResolution(Size(800, 600)); font->defineFontGlyphs(font->getAvailableGlyphs()); 具体设置请看123.scheme,songti.font文件。 Listbox可以显示中文。 关于demo8中listbox无法显示中文的问题,问题在demo8.lua文件。重写按钮push事件的响应可以解决。同时注销demo8.lua中的事件
18、注册函数。 (最新更新,问题在于,在lua实现gettext函数的时候,把得到的字符串从CEGUI::string转化成了char* 类型,导致了中文格式的不符。在后面创建item以及additem后无法显示) /////////////////////////////Sample_Demo8.cpp///////////////////////////// bool Demo8Sample::initialiseSample() {////…… new System(renderer, scriptmod, (utf8*)"../datafiles/configs/demo8.co
19、nfig");
PushButton* btn=static_cast
20、x=static_cast
21、eturn true; } 从CEGUI::string的c_str()函数得到的const char*字符串英文可以直接给std::string使用。中文只能用(utf8*)转换后给CEGUI::string使用。 使用下面的方法将CEGUI中的中文字符串转换为STD的宽字符串 str为CEGUI中的中文字符串 (更新,std宽字符串和CEGUI的中文字符串编码一样,采用[]直接拷贝) std::wstring szWstring; const char *szUtf8String = str.c_str(); int iLengthAnsiString = Mu
22、ltiByteToWideChar( CP_UTF8, 0,szUtf8String,strlen(szUtf8String), NULL, 0); wchar_t* wszUnicode=new wchar_t[iLengthAnsiString+1]; MultiByteToWideChar(CP_UTF8, 0, szUtf8String, iLengthAnsiString,wszUnicode, iLengthAnsiString); wszUnicode[iLengthAnsiString]=0; szWstring=wszUnicode; 使用下面方法将char *字
23、符串转换为CEGUI可用的字符串 int iLengthUniString = MultiByteToWideChar(CP_THREAD_ACP, 0,g_szCompStr, strlen(g_szCompStr), NULL, 0); wchar_t* wszUnicode=new wchar_t[iLengthUniString+1]; MultiByteToWideChar(CP_THREAD_ACP, 0, g_szCompStr,strlen(g_szCompStr),wszUnicode, iLengthUniString); wszUnicode[iLengt
24、hUniString]=0; int iLengthAnsiString = WideCharToMultiByte(CP_UTF8, 0,wszUnicode,iLengthUniString+1, NULL, 0, NULL, NULL); char * szUtf8String = new char[ iLengthAnsiString]; memset(szUtf8String, 0, sizeof(char)*(iLengthAnsiString)); WideCharToMultiByte(CP_UTF8, 0,wszUnicode, iLengthUniSt
25、ring+1, szUtf8String, iLengthAnsiString, NULL, NULL); imereading->setText((CEGUI::utf8*)szUtf8String); delete [] szUtf8String; szUtf8String = NULL; CEGUI控件按键消息的响应解决 case WM_KEYDOWN: i=lParam&0xff0000; i=i>>16; if(lParam&0x1000000) i|=0x80; CEGUI::System::getSingleton().i
26、njectKeyDown(i);break; case WM_KEYUP: i=lParam&0xff0000; i=i>>16; if(lParam&0x1000000) i|=0x80; CEGUI::System::getSingleton().injectKeyUp(i);break; CEGUI控件消息处理 在CEGUI中,可以对文本框,按钮等等的控件添加消息响应的函数。比如鼠标点击,鼠标移入,文本框获得输入焦点,失去焦点等。这些事件在各个控件的类中被定义。如:PushButton::EventClicked 事件是一个string类的字符串
27、。一个控件所有的事件请参考CEGUI文档。 对事件做出的响应函数必须和事件相挂钩。这需要使用控件类的 subscribeEvent(PushButton::EventClicked,&pushButtonHandler);函数 subscribeEvent函数有两个参数,前一个是事件,后一个是相应函数地址。 响应函数的格式如下 bool pushButtonHandler(const CEGUI::EventArgs& e) { return true; } 在函数中可以添加处理事件的语句,具体可以参考各demo的处理函数。 Demo8的处理函数和事件注册都是放在demo
28、8.lua中实现的。 一般在使用控件之前要确保处理函数和事件相关联。比如可以放在界面初始化函数里面。但是最好的办法还是象demo8那样放在lua文件中。在加载ui的congfig文件时所有工作就可以完成了。可以看demo8.config中文件的关联。 一个问题: 有时候需要在事件发生的时候让自定义类的成员做出相应。一般以为只要在自定义类初始化的时候把事件和成员函数关联即可。而在demo7中也正是这样做的。可是我自己做的时候确一个出现错误。没法解决。这里还要注意把事件和成员函数关联的时候,函数格式有所区别,看下面: subscribeEvent(RadioButton::EventSelectStateChanged,Event::Subscriber(&Demo7Sample::handleRadio, this)); 具体可看demo7的cpp文件。
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。