Widget 的创建

Widget 不是由手工创建的,是由三个工厂类类创建,组织,管理的。

这三个类分别为

抽象模板类工厂:

用来创建类实例


GenericFacotory

	template <typename Type>
	class GenericFactory
	{
	public:
		typedef delegates::CDelegate1<IObject*&> Delegate;
		static typename Delegate::IDelegate* getFactory()
		{
			return newDelegate(createFromFactory);
		}

	private:
		static void createFromFactory(IObject*& _instance)
		{
			_instance = new Type();
		}
	};


无疑 FactoryManager类中的私有成员变量mRegisterFactoryItems 需要详细的分析:

首先:

		typedef delegates::CDelegate1<IObject*&> Delegate;

而CDelegate1 是MyGUI 定义的代理类:

展开其宏为:

CDelegate1而言

	public:
		typedef delegates::CDelegate1<IObject*&> Delegate;
此处见识了一个没有用过的用法:

指针的引用:  IObject * & 


CDelegate1 主要用于Widget组件的建立:对应于IDelegate1

对于FactoryManager的IDelegate1 是通过GenericFactory 传入其具体代理方法

对于注册Widget创建的函数是通过FactoryManager下列member function 传入的:

对应template 方法:

		template<typename Type>
		void registerFactory(const std::string& _category)
		{
			registerFactory(_category, Type::getClassTypeName(), GenericFactory<Type>::getFactory());
		}

		template<typename Type>
		void registerFactory(const std::string& _category, const std::string& _type)
		{
			registerFactory(_category, _type, GenericFactory<Type>::getFactory());
		}
对应具体的cpp实现:

	void FactoryManager::registerFactory(const std::string& _category, const std::string& _type, Delegate::IDelegate* _delegate)
	{
		//FIXME
		mRegisterFactoryItems[_category][_type] = _delegate;
	}
传入的  _delegate 为 IDelegate
但是
mRegisterFactoryItems[_category][_type]为CDelegate1 类
为什么不同的类可以互等,这是因为在CDelegate1 重写了=
		CDelegate1  <T, TP1> & operator=(IDelegate* _delegate)
		{
			delete mDelegate;
			mDelegate = _delegate;
			return *this;
		}

		CDelegate1  <T, TP1> & operator=(const CDelegate1  <T, TP1>& _event)
		{
			// забираем себе владение
			delete mDelegate;
			mDelegate = _event.mDelegate;
			const_cast< CDelegate1  <T, TP1>& >(_event).mDelegate = nullptr;

			return *this;
		}

这是在注册函数中可以采取的现实理由




观察FactoryManager类成员变量,和成员函数可以得出其作用主要在于类初始化常见的注册工厂代理

至此我们打通了widget的创建之路,

继续有两个阶段性目标:

    1)Widget的属性设置,和动态加载皮肤

    2)Widget的渲染,结构和渲染管线。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值