资源描述:
《金山界面库分析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、通过XML创建界面一-对象的动态创建以及属性的设置为了界面可配置化和换肽,需要界面元素可以根据XML动态创建和设置属性。在BKUb中,CBkObject类就完成了这样的功能,主要负责类的创建和属性的设置。因为对象都是从XML动态创建的,动态的创建是一个类最基木的属性,所以其他类部从CBkObject派生。来看看这个类的四个方法:BOOLlsClass(LPCSTRIpszName):判断是不是这个类的对象。纯虚方法,也就是从CBkObject继承來的类都要实现这个方法才行,同时,这个方法在不同的类上
2、面会有不同的表现。所以上层定义接口,下层提供实现。这个方法可以在运行时检测类实例的实际类型。LPCSTRGetObjectClass():同上一个方法,用于获取类的名字。BOOLLoad(TiXmlElement*pXmlElem):从XML中获取属性并将属性设置到对象中,在基类中仅仅是将一个XML元素的属性设置到対象中。当然,如果子类对象有更复杂的实现,比如一个对象对应的XML元索还有子节点,就需耍Load其子节点,这些都可以在子类屮通过覆盖父类方法來实现。HRESULTSetAttribute(
3、CStringAstrAttribName,CStringAstrValue,BOOLbLoading):设置属性的方法,CBkObject是纯虚类,在XML'P不会有对应的节点,H然也没有相应的属性,所以其实现仅仅放回了一个E_FAIL,没有其他操作。接着我们就看到了在bkobject.h里面一人堆的宏定义:宏定义一般是为了简洁,而这些宏的用途多为子类使用。BKOBJ_DECLARE_CLASS_NAME:获取类名,判断是否是某个类的对象,还有CheckAndNew,用于动态创建以卜•的宏定义主要
4、用于属性的设直和映射(XML节点属性和对象属性的对应)BKWIN_DECLARE_ATTRIBUTES_BEGINBKWIN_DECLARE_ATTRIBUTES_ENDBKWIN_CHAIN_ATTRIBUTEBKWIN_CUSTOM_ATTRIBUTEBKWIN」NT_ATTRIBUTEBKWIN_UINT_ATTRIBUTEBKWIN_DWORD_ATTRIBUTEBKWIN_STRING_ATTRIBUTEBKWIN_TSTRING_ATTRIBUTEBKWIN_HEX_ATTRIBUTEB
5、KWIN_COLOR_ATTRIBUTEBKWIN_FONT_ATTRIBUTEBKWIN_ENUM_ATTRIBUTEBKWIN_ENUM_VALUEBKWIN_ENUM_ENDBKWIN_STYLE_ATTRIBUTEBKWIN_SKIN_ATTRIBUTE现在我们看-•个例子,继承自CBkObject的控件对象CBkProgress是如何完成从XML动态创建的。首先,在类的定义中包含宏BKOBJ_DECLARE_CLASS_NAME(CBkProgress,"progress^,将宏展开如下:
6、public:staticCBkProgress*CheckAndNewfLPCSTRIpszName){if(strcmp(GetClassName(),IpszName)==0)returnnewCBkProgress;elsereturnNULL;}〃通过传入名称创建对应的类,在解析XML中按照节点名字创建对应类的实例staticLPCSTRGetClassName(){return"progress";}virtualLPCSTRGetObjectClass(){return"progres
7、s";}〃覆盖父类方法,返回类实例对应的XML节点名字virtualBOOLlsClass(LPCSTRIpszName){returnstrcmpfGetClassNameO,IpszName)==0;}〃覆盖父类方法,根据XML节点名字检查类实例是否是此节点另外,包含设置节点属性的宏,如下BKWIN_DECLARE_ATTRIBUTES_BEGIN()BKWIN_SKIN_ATTRIBUTECbgskinz,,m_pSkinBg,TRUE)BKWINDWORDATTRIBUTE("min",md
8、wMinValue,FALSE)BKWIN_UINT_ATTRIBUTE("showpercent",m_bShowPercent,FALSE)BKWINDECLAREATTRIBUTESENDO将宏展开如下:public:virtualHRESULTSetAttribute(CStringAstrAttribName,CStringAstrValue,BOOLbLoading)〃添加SetAttribute方法,在Load屮循坏调用设iff属性{HRESULThRe