自定义控件及适配CEED编辑器"/>
CEGUI自定义控件及适配CEED编辑器
CEGUI自定义控件及适配CEED编辑器
<一>. 自定义控件
首先大致描述一下我理解的自定义控件。
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
#include "CEGUI/WindowFactoryManager.h"#include "widget_name.h"void mm_widget_factory_register()
{CEGUI::WindowFactoryManager& _WindowFactoryManager = CEGUI::WindowFactoryManager::getSingleton();_WindowFactoryManager.addWindowType<widget_name>();
}
void mm_widget_factory_unregister()
{CEGUI::WindowFactoryManager& _WindowFactoryManager = CEGUI::WindowFactoryManager::getSingleton();_WindowFactoryManager.removeFactory(widget_name::WidgetTypeName);
}
详细描述
派生这一步网上大多数资料都有说明, 有一下几点需要注意
(1) 派生自某控件, 最小通常是CEGUI::Window, 也能是如CEGUI::ScrollablePane
(2) static const CEGUI::String WidgetTypeName;// 这个是新控件的类型名称
(3) 如果有附加属性如float d_member_value;// 那么要想支持CEED编辑器需要加上形如add_widget_name_properties的属性注册流程。
(4) 控件窗口工厂注册。
属性的定义通常使用以下形式CEGUI/PropertySet.h
#define CEGUI_DEFINE_PROPERTY(class_type, property_native_type, name, help, setter, getter, default_value)\
内建属性可以方便的在datafiles/xml_schemas/Falagard.xsd看到
常用的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
<?xml version="1.0" ?>
<GUIScheme version="5" name="mm_widgets"><FalagardMapping windowType="mm_widgets/widget_name" targetType="mm/widget_name" renderer="Core/Button" lookNFeel="TaharezLook/Button" />
</GUIScheme>
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中展示一个形状相似的控件.
<...拷贝TaharezLook/Button的其余属性...>
并且能在编辑器中配置自定义属性就满足要求了.
<PropertyDefinition name="MemberValue" initialValue="1.0" redrawOnWrite="true" type="float" />
在我们的CEED中因为没有Falagard资源映射mm_widgets.scheme,注意这里的功能控件依然是CEGUI/Button。
<WindowAlias alias="mm/widget_name" target="CEGUI/Button" />
这样就能使用CEED生成我们需要的layout文件,有意思的是里面还携带了我们的自定义属性MemberValue
<Property name="MaxIndex" value="20.0" />
在我们的程序中因为没有别名映射mm_widgets_alias.scheme,注意这里的功能控件将是mm/widget_name。
<FalagardMapping windowType="mm_widgets/widget_name" targetType="mm/widget_name" renderer="Core/Button" lookNFeel="TaharezLook/Button" />
所以我们的程序将使用mm_widgets.scheme中的Falagard资源映射
targetType="mm/widget_name"而这将生成一个功能完整的控件。
更多推荐
CEGUI自定义控件及适配CEED编辑器
发布评论