Widget 的创建

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

这三个类分别为

抽象模板类工厂:

用来创建类实例

Widget 的创建_第1张图片

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();
		}
	};

Widget 的创建_第2张图片

无疑 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的渲染,结构和渲染管线。







你可能感兴趣的:(Widget 的创建)