<一>. 自定义控件
首先大致描述一下我理解的自定义控件。
a. CEGUI自带的控件不能满足自己需求
b. 我们通常从CEGUI::Window派生
这个是伪代码(cxx范本, 本文尽量只列出关键部分, 讲诉原理,可能存在部分错误)
我们这里使用CEGUI::Button做派生例子,CEGUI::Window因为无需Falagard资源映射,没有代表性.
widget_name.h
#include "CEGUI/Window.h"class widget_name : public CEGUI::Button{public: static const CEGUI::String WidgetTypeName; //! MemberValue PropertyName. static const CEGUI::String MemberValuePropertyName;private: float d_member_value;public: widget_name(const CEGUI::String& type, const CEGUI::String& name);public: void set_member_value(float _v); float get_member_value() const;private: void add_widget_name_properties();};widget_name.cpp
const CEGUI::String widget_name::WidgetTypeName("mm/widget_name");const CEGUI::String widget_name::MemberValuePropertyName("MemberValue");widget_name::widget_name(const CEGUI::String& type, const CEGUI::String& name) : CEGUI::Window(type, name) , d_member_value(1.0f){ this->add_widget_name_properties();}void widget_name::set_member_value(float _v){ this->d_member_value = _v;}float widget_name::get_member_value() const{ return this->d_member_value;}void widget_name::add_widget_name_properties(){ const CEGUI::String propertyOrigin("widget_name"); CEGUI_DEFINE_PROPERTY ( widget_name, float, MemberValuePropertyName, "Property to get/set the window member_value. Value is a float.", &widget_name::set_member_value, &widget_name::get_member_value, 1.0f );}
factory_register.cpp
详细描述
派生这一步网上大多数资料都有说明, 有一下几点需要注意
(1) 派生自某控件, 最小通常是CEGUI::Window, 也能是如CEGUI::ScrollablePane
(2) static const CEGUI::String WidgetTypeName;// 这个是新控件的类型名称
(3) 如果有附加属性如float d_member_value;// 那么要想支持CEED编辑器需要加上形如add_widget_name_properties的属性注册流程。
(4) 控件窗口工厂注册。
常用的USize, float, double, CEGUI::String都有定义.
如果要加自定义属性的串化, 可以仿照CEGUI/PropertyHelper.h<二>. 自定义控件适配界面编辑器
1. 主题文件datafiles/schemes/mm_widgets.scheme
这份文件这里主要是要添加Falagard资源映射
我们将
"mm_widgets/widget_name" 映射名字,也能对应CEGUI::WindowManager创建控件的名字
"mm/widget_name" 对应CEGUI::WindowManager创建控件的名字
"Core/Button" 渲染组件, 这里对应CEGUI/WindowRendererSets/Core/Button.h
"TaharezLook/Button" lookNFeel名字, 这里对应TaharezLook.looknfeel中的TaharezLook/Button
2. 主题别名文件datafiles/scheme/mm_widgets_alias.scheme
请注意FalagardMapping中的最后一项是lookNFeel="mm_widgets/Button"而不是lookNFeel="TaharezLook/Button"
<?xml version="1.0" ?><GUIScheme version="5" name="mm_widgets_alias"> <LookNFeel filename="mm_widgets.looknfeel" /> <WindowAlias alias="mm/widget_name" target="CEGUI/Button" /> <FalagardMapping windowType="mm_widgets/widget_name" targetType="mm/widget_name" renderer="Core/Button" lookNFeel="mm_widgets/Button" /></GUIScheme>3. 样式文件datafiles/looknfeel/mm_widgets.looknfeel <?xml version="1.0" ?><Falagard version="7"> <!-- *************************************************** mm_widgets/Button *************************************************** --> <WidgetLook name="mm_widgets/Button"> <PropertyDefinition name="MemberValue" initialValue="1.0" redrawOnWrite="true" type="float" /> <...拷贝TaharezLook/Button的其余属性...></Falagard>
<三>.如何使用
1. 在自己的程序中
这里注意没有加载mm_widgets_alias.scheme CEGUI::SchemeManager::getSingleton().createFromFile("TaharezLook.scheme"); CEGUI::SchemeManager::getSingleton().createFromFile("mm_widgets.scheme");
2. 在CEED工程中添加的scheme只包括 这里注意没有包含mm_widgets.scheme "TaharezLook.scheme""mm_widgets_alias.scheme"
<四>.为什么这样能工作
其实主要是在CEED中并不需要完整的模拟控件的所有行为
我们一般模拟和配置的是
1. 布局
2. 默认属性的赋值
3. 自定义属性的赋值
所以我们只要在CEED中展示一个形状相似的控件.
并且能在编辑器中配置自定义属性就满足要求了.
这样就能使用CEED生成我们需要的layout文件,有意思的是里面还携带了我们的自定义属性MemberValue
所以我们的程序将使用mm_widgets.scheme中的Falagard资源映射
targetType="mm/widget_name"而这将生成一个功能完整的控件。