欢迎来到天天文库
浏览记录
ID:30805822
大小:200.67 KB
页数:23页
时间:2019-01-03
《金山界面库分析_解析bkwin》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、通过XML创建界面---对象的动态创建以及属性的设置为了界面可配置化和换肤,需要界面元素可以根据XML动态创建和设置属性。在BKLib中,CBkObject类就完成了这样的功能,主要负责类的创建和属性的设置。因为对象都是从XML动态创建的,动态的创建是一个类最基本的属性,所以其他类都从CBkObject派生。来看看这个类的四个方法:BOOLIsClass(LPCSTRlpszName):判断是不是这个类的对象。纯虚方法,也就是从CBkObject继承来的类都要实现这个方法才行,同时,这个方法在不同的类上面会有不同的表现。所以上层定义
2、接口,下层提供实现。这个方法可以在运行时检测类实例的实际类型。LPCSTRGetObjectClass():同上一个方法,用于获取类的名字。BOOLLoad(TiXmlElement*pXmlElem):从XML中获取属性并将属性设置到对象中,在基类中仅仅是将一个XML元素的属性设置到对象中。当然,如果子类对象有更复杂的实现,比如一个对象对应的XML元素还有子节点,就需要Load其子节点,这些都可以在子类中通过覆盖父类方法来实现。HRESULTSetAttribute(CStringAstrAttribName,CStringAst
3、rValue,BOOLbLoading):设置属性的方法,CBkObject是纯虚类,在XML中不会有对应的节点,自然也没有相应的属性,所以其实现仅仅放回了一个E_FAIL,没有其他操作。接着我们就看到了在bkobject.h里面一大堆的宏定义:宏定义一般是为了简洁,而这些宏的用途多为子类使用。BKOBJ_DECLARE_CLASS_NAME:获取类名,判断是否是某个类的对象,还有CheckAndNew,用于动态创建以下的宏定义主要用于属性的设置和映射(XML节点属性和对象属性的对应)BKWIN_DECLARE_ATTRIBUTES
4、_BEGINBKWIN_DECLARE_ATTRIBUTES_ENDBKWIN_CHAIN_ATTRIBUTEBKWIN_CUSTOM_ATTRIBUTEBKWIN_INT_ATTRIBUTEBKWIN_UINT_ATTRIBUTEBKWIN_DWORD_ATTRIBUTEBKWIN_STRING_ATTRIBUTEBKWIN_TSTRING_ATTRIBUTEBKWIN_HEX_ATTRIBUTEBKWIN_COLOR_ATTRIBUTEBKWIN_FONT_ATTRIBUTEBKWIN_ENUM_ATTRIBUTEBKWIN_E
5、NUM_VALUEBKWIN_ENUM_ENDBKWIN_STYLE_ATTRIBUTEBKWIN_SKIN_ATTRIBUTE现在我们看一个例子,继承自CBkObject的控件对象CBkProgress是如何完成从XML动态创建的。首先,在类的定义中包含宏BKOBJ_DECLARE_CLASS_NAME(CBkProgress,"progress"),将宏展开如下:public:staticCBkProgress*CheckAndNew(LPCSTRlpszName){if(strcmp(GetClassName(),lpszNa
6、me)==0)returnnewCBkProgress;elsereturnNULL;}//通过传入名称创建对应的类,在解析XML中按照节点名字创建对应类的实例staticLPCSTRGetClassName(){return“progress”;}virtualLPCSTRGetObjectClass(){return“progress”;}//覆盖父类方法,返回类实例对应的XML节点名字virtualBOOLIsClass(LPCSTRlpszName){returnstrcmp(GetClassName(),lpszName)
7、==0;}//覆盖父类方法,根据XML节点名字检查类实例是否是此节点另外,包含设置节点属性的宏,如下BKWIN_DECLARE_ATTRIBUTES_BEGIN()BKWIN_SKIN_ATTRIBUTE("bgskin",m_pSkinBg,TRUE)BKWIN_DWORD_ATTRIBUTE("min",m_dwMinValue,FALSE)BKWIN_UINT_ATTRIBUTE("showpercent",m_bShowPercent,FALSE)BKWIN_DECLARE_ATTRIBUTES_END()将宏展开如下:pu
8、blic:virtualHRESULTSetAttribute(CStringAstrAttribName,CStringAstrValue,BOOLbLoading)//添加SetAttribute方法,在Load中循环调用设置属性
此文档下载收益归作者所有