首页 > 编程知识 正文

wpf自定义控件,qt自定义控件

时间:2023-05-03 22:25:54 阅读:247259 作者:2542

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"而这将生成一个功能完整的控件。
win7电脑文件夹如何加密Java中cas实现原理是什么运行JSONEncode时是否可以排除已经为JSON的字段?

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。