CEGUI自定义控件及适配CEED编辑器

编程入门 行业动态 更新时间:2024-10-26 00:26:15

CEGUI<a href=https://www.elefans.com/category/jswz/34/1771438.html style=自定义控件及适配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编辑器

本文发布于:2024-02-11 15:12:50,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1681657.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:自定义   编辑器   控件   CEGUI   CEED

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!