在SOUI中使用GetAttribute获取XML中配置的属性
SOUI的界面布局使用XML来布局,在XML配置的属性值会通过SObject::SetAttribute(name, value)的方式交给SObject处理。
SWindow是SOUI的界面元素对象,继承自SObject,同样也是通过SetAttribute获取XML中配置的属性。
虽然SObject提供了GetAttribute方法,实际上这个方法并不能直接获取使用SetAttribute设置的值。因为SetAttribute设置的值在对象处理属性的时候,消费完就丢掉了,并不会保存以供后面的GetAttribute使用。
那么什么时候GetAttribute会有效呢?
SOUI提供了一个IAttrStorageFactory接口:
SNSBEGIN typedef struct IWindow IWindow; #undef INTERFACE #define INTERFACE IAttrStorage DECLARE_INTERFACE_(IAttrStorage, IObjRef) { //!添加引用 /*! */ STDMETHOD_(long, AddRef)(THIS) PURE; //!释放引用 /*! */ STDMETHOD_(long, Release)(THIS) PURE; //!释放对象 /*! */ STDMETHOD_(void, OnFinalRelease)(THIS) PURE; STDMETHOD_(void, OnSetAttribute) (THIS_ const IStringW *strName, const IStringW *strValue, BOOL bHandled) PURE; STDMETHOD_(BOOL, OnGetAttribute)(CTHIS_ const IStringW *strName, IStringW *strValue) SCONST PURE; }; #undef INTERFACE #define INTERFACE IAttrStorageFactory DECLARE_INTERFACE_(IAttrStorageFactory, IObjRef) { //!添加引用 /*! */ STDMETHOD_(long, AddRef)(THIS) PURE; //!释放引用 /*! */ STDMETHOD_(long, Release)(THIS) PURE; //!释放对象 /*! */ STDMETHOD_(void, OnFinalRelease)(THIS) PURE; STDMETHOD_(HRESULT, CreateAttrStorage) (CTHIS_ IWindow * owner, IAttrStorage * *ppAttrStorage) SCONST PURE; }; SNSEND
在IAttrStorageFactory中需要实现CreateAttrStorage方法来创建IAttrStorage 接口。
IAttrStorage 主要有两个方法,OnSetAttribute,OnGetAttribute,在OnSetAttribute中,你可以决定一个属性要不要保存起来。
同样在OnGetAttribute就可以获取到前面保存的属性值。