SOUI项目的SVN根目录下有一个doc目录,下面有一份控件属性表。包含了大部分控件的大部分属性,不过也不一定完全准确。最保险的办法还是查源代码。

SOUI对象包含控件及ISkinObj等从SObject派生的对象都可以使用XML配置属性。要知道如何查SOUI对象属性,首先要看一下SOUI解释属性的流程。

BOOL SObject::InitFromXml( pugi::xml_node xmlNode )
{
if(!xmlNode) return FALSE;
#ifdef _DEBUG
{
pugi::xml_writer_buff writer;
xmlNode.print(writer,L"\t",pugi::format_default,pugi::encoding_utf16);
m_strXml=SStringW(writer.buffer(),writer.size());
}
#endif //设置当前对象的属性 //优先处理"class"属性
pugi::xml_attribute attrClass=xmlNode.attribute(L"class");
if(attrClass)
{
attrClass.set_userdata(); //预处理过的属性,给属性增加一个userdata
SetAttribute(attrClass.name(), attrClass.value(), TRUE);
}
for (pugi::xml_attribute attr = xmlNode.first_attribute(); attr; attr = attr.next_attribute())
{
if(attr.get_userdata()) continue; //忽略已经被预处理的属性
SetAttribute(attr.name(), attr.value(), TRUE);
}
if(attrClass)
{
attrClass.set_userdata();
}
//调用初始化完成接口
OnInitFinished(xmlNode);
return TRUE;
}

在InitFromXml方法中,首先获取class属性交给对象解释,然后再枚举其它属性。

获取到一个属性以后调用SOjbect::SetAttribute方法来处理属性。

class SObject{
public
virtual HRESULT SetAttribute(const SStringW & strAttribName, const SStringW & strValue, BOOL bLoading)
{
return DefAttributeProc(strAttribName,strValue,bLoading);
}
};

SetAttribute是一个虚函数,所有派生类都可以通过重载该方法来实现不同属性的处理。

在SOUI中提供了一组宏来处理SObject的属性,下面看一下SWindow类的实现:

SOUI_ATTRS_BEGIN()
ATTR_CUSTOM(L"id",OnAttrID)
ATTR_STRINGW(L"name",m_strName,FALSE)
ATTR_CUSTOM(L"skin", OnAttrSkin) //直接获得皮肤对象
ATTR_SKIN(L"ncskin", m_pNcSkin, TRUE) //直接获得皮肤对象
ATTR_CUSTOM(L"class", OnAttrClass) //获得style
ATTR_INT(L"data", m_uData, )
ATTR_CUSTOM(L"enable", OnAttrEnable)
ATTR_CUSTOM(L"visible", OnAttrVisible)
ATTR_CUSTOM(L"show", OnAttrVisible)
ATTR_CUSTOM(L"display", OnAttrDisplay)
ATTR_CUSTOM(L"pos", OnAttrPos)
ATTR_CUSTOM(L"offset", OnAttrOffset)
ATTR_CUSTOM(L"pos2type", OnAttrPos2type)
ATTR_CUSTOM(L"cache", OnAttrCache)
ATTR_CUSTOM(L"alpha",OnAttrAlpha)
ATTR_CUSTOM(L"layeredWindow",OnAttrLayeredWindow)
ATTR_CUSTOM(L"trackMouseEvent",OnAttrTrackMouseEvent)
ATTR_I18NSTRT(L"tip", m_strToolTipText, FALSE) //使用语言包翻译
ATTR_INT(L"msgTransparent", m_bMsgTransparent, FALSE)
ATTR_INT(L"maxWidth",m_nMaxWidth,FALSE)
ATTR_INT(L"clipClient",m_bClipClient,FALSE)
ATTR_INT(L"focusable",m_bFocusable,FALSE)
ATTR_INT(L"float",m_bFloat,FALSE)
ATTR_CHAIN(m_style) //支持对style中的属性定制
SOUI_ATTRS_END()
SOUI_ATTRS_BEGIN + SOUI_ATTRS_END宏展开构成一个空的SetAttribute函数。
ATTR_XXX则对不同类型的属性提供一种固定的处理方式,全部属性形成一个属性映射表。 因此要查对象属性,首先就是查对象代码中对应的属性映射表,同时也别忘记去查对象的基类的属性映射表。 有些对象(如Richedit)的属性可能在这个属性映射表里找不到,那又是为什么呢?
注意SetAttribute最后调用了DefAttributeProc,使用属性映射表构造的属性处理函数也同样会调用DefAttributeProc。
在DefAttributeProc中可以批量的按照自己的方式处理属性。下面看一下Richedit::DefAttributeProc的实现:
HRESULT SRichEdit::DefAttributeProc(const SStringW & strAttribName,const SStringW & strValue, BOOL bLoading)
{
HRESULT hRet=S_FALSE;
DWORD dwBit=,dwMask=;
//hscrollbar
if(strAttribName.CompareNoCase(L"hscrollBar")==)
{
if(strValue==L"")
m_dwStyle&=~WS_HSCROLL;
else
m_dwStyle|=WS_HSCROLL;
dwBit|=TXTBIT_SCROLLBARCHANGE;
dwMask|=TXTBIT_SCROLLBARCHANGE;
}
//vscrollbar
else if(strAttribName.CompareNoCase(L"vscrollBar")==)
{
if(strValue==L"")
m_dwStyle&=~WS_VSCROLL;
else
m_dwStyle|=WS_VSCROLL;
dwBit|=TXTBIT_SCROLLBARCHANGE;
dwMask|=TXTBIT_SCROLLBARCHANGE;
}
//auto hscroll
else if(strAttribName.CompareNoCase(L"autoHscroll")==)
{
if(strValue==L"")
m_dwStyle&=~ES_AUTOHSCROLL;
else
m_dwStyle|=ES_AUTOHSCROLL;
dwBit|=TXTBIT_SCROLLBARCHANGE;
dwMask|=TXTBIT_SCROLLBARCHANGE;
}
//auto hscroll
else if(strAttribName.CompareNoCase(L"autoVscroll")==)
{
if(strValue==L"")
m_dwStyle&=~ES_AUTOVSCROLL;
else
m_dwStyle|=ES_AUTOVSCROLL;
dwBit|=TXTBIT_SCROLLBARCHANGE;
dwMask|=TXTBIT_SCROLLBARCHANGE;
}
//multilines
else if(strAttribName.CompareNoCase(L"multiLines")==)
{
if(strValue==L"")
m_dwStyle&=~ES_MULTILINE;
else
m_dwStyle|=ES_MULTILINE,dwBit|=TXTBIT_MULTILINE;
dwMask|=TXTBIT_MULTILINE;
}
//readonly
else if(strAttribName.CompareNoCase(L"readOnly")==)
{
if(strValue==L"")
m_dwStyle&=~ES_READONLY;
else
m_dwStyle|=ES_READONLY,dwBit|=TXTBIT_READONLY;
dwMask|=TXTBIT_READONLY;
if(!bLoading)
{//update dragdrop
OnEnableDragDrop(!(m_dwStyle&ES_READONLY) && m_fEnableDragDrop);
}
}
//want return
else if(strAttribName.CompareNoCase(L"wantReturn")==)
{
if(strValue==L"")
m_dwStyle&=~ES_WANTRETURN;
else
m_dwStyle|=ES_WANTRETURN;
}
//password
else if(strAttribName.CompareNoCase(L"password")==)
{
if(strValue==L"")
m_dwStyle&=~ES_PASSWORD;
else
m_dwStyle|=ES_PASSWORD,dwBit|=TXTBIT_USEPASSWORD;
dwMask|=TXTBIT_USEPASSWORD;
}
//number
else if(strAttribName.CompareNoCase(L"number")==)
{
if(strValue==L"")
m_dwStyle&=~ES_NUMBER;
else
m_dwStyle|=ES_NUMBER;
}
//password char
else if(strAttribName.CompareNoCase(L"passwordChar")==)
{
SStringT strValueT=S_CW2T(strValue);
m_chPasswordChar=strValueT[];
}
//enabledragdrop
else if(strAttribName.CompareNoCase(L"enableDragdrop")==)
{
if(strValue==L"")
{
m_fEnableDragDrop=FALSE;
}else
{
m_fEnableDragDrop=TRUE;
}
if(!bLoading)
{
OnEnableDragDrop( !(m_dwStyle&ES_READONLY) & m_fEnableDragDrop);
}
}
//auto Sel
else if(strAttribName.CompareNoCase(L"autoSel")==)
{
if(strValue==L"")
{
m_fAutoSel=FALSE;
}else
{
m_fAutoSel=TRUE;
}
}
else
{
hRet=__super::DefAttributeProc(strAttribName,strValue,bLoading);
}
if(!bLoading)
{
m_pTxtHost->GetTextService()->OnTxPropertyBitsChange(dwMask,dwBit);
hRet=TRUE;
}
return hRet;
}

可以看到在这个方法中对很多属性做了处理。

总结:

先查目标对象的属性映射表,再找基类的属性映射表,最后查对象的DefAttributeProc。

第二十七篇:SOUI中控件属性查询方法的更多相关文章

  1. Python之路(第二十七篇) 面向对象进阶:内置方法、描述符

    一.__call__ 对象后面加括号,触发执行类下面的__call__方法. 创建对象时,对象 = 类名() :而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()( ...

  2. C# 常用控件属性及方法介绍

      C#常用控件属性及方法介绍                                               目录 1.窗体(Form) 2.Label (标签)控件 3.TextBox ...

  3. 【转载】C#常用控件属性及方法介绍

    C#常用控件属性及方法介绍                                               目录 1.窗体(Form) 2.Label (标签)控件 3.TextBox(文 ...

  4. J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())

    J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())   当我们使用Hibernate进行数据的CRUD操作时,利用模版进行操作不失为一种方法. ...

  5. winFrom 常用控件属性及方法介绍

    目录 1.窗体(Form) 2.Label (标签)控件 3.TextBox(文本框)控件 4.RichTextBox控件 5.NumericUpDown控件 6.Button(按钮)控件 7.Gro ...

  6. VB6.0中WinSock控件属性和方法详解

    原文链接:http://liweibird.blog.51cto.com/631764/653134 WinSock控件能够通过UDP协议(用户数据报协议)或TCP协议(数据传输协议)连接到远程的机器 ...

  7. 第八篇:SOUI中控件事件的响应

    SOUI中提供了大部分常用的win32标准控件的实现,如pushbutton, checkbox, radiobox, edit, richedit, listbox, combobox, treec ...

  8. Android中控件属性详细总结(转载)

    转载地址:https://www.cnblogs.com/nanguojs/p/5950510.html 1.LinearLayout(线性布局): 可以分为水平线性:android:orientat ...

  9. 第二十七篇:Windows驱动中的PCI, DMA, ISR, DPC, ScatterGater, MapRegsiter, CommonBuffer, ConfigSpace

    近期有些人问我PCI设备驱动的问题, 和他们交流过后, 我建议他们先看一看<<The Windows NT Device Driver Book>>这本书, 个人感觉, 这本书 ...

随机推荐

  1. jenkins持续集成源码管理选项为None,构建失败找不到git.exe解决办法

    我的jenkins版本为Jenkins ver. 2.19.1 1.源码管理选项只有None的解决办法: 在插件管理中心,搜索对应的源码管理插件这里以git为例,搜索git plugin点击右下角的安 ...

  2. zTree简单实现

    用zTree简单实现从后台传数据生成树 1.在jsp上引入js,jsp的head完整的部分 <%@ page language="java" contentType=&quo ...

  3. iOS7时代我们用什么来追踪和识别用户?

    要识别用户,首先就是要选择一个标识符,通过这个标识符来识别这个用户的设备(而不是用户),这个标识符要能够保证一个设备上返回的值是一样的,并且在其他设备上不会出现相同的值. 在iOS7之前,曾经有过很多 ...

  4. 图解c/c++多级指针与“多维”数组

    声明:本文为原创博文,如有转载,请注明出处.若本文有编辑错误.概念错误或者逻辑错误,请予以指正,谢谢. 指针与数组是C/C++编程中非常重要的元素,同时也是较难以理解的.其中,多级指针与“多维”数组更 ...

  5. thinkphp分页二,分装到funciton.php

    function.php代码 <?php /* 全局分页 * $table 数据表名 * $order 排序 * $pagesize 每页显示N个 * $where 查询条件 * $rollPp ...

  6. 收藏一些好用的fifo

    1.Nordic库中的 E:\nRF52_SDK_0.9.2_dbc28c9\components\libraries\fifo app_fifo.c /* Copyright (c) 2013 No ...

  7. 基于 BinaryReader 的高效切割TXT文件

    日常工作中免不了要面对一些文件的操作.. 但是如果是日志文件..动辄上G的..处理起来就不那么轻松随意了.. 尤其文件还很多的时候.. 这个时候就会用到大文件切割.. 下边贴出的示例是实验了一个 10 ...

  8. tyvj1034 尼克的任务

    描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成.尼克的一个工作日为N分钟,从第一分钟开始到第N ...

  9. silverlight_容器

    Canvas絕對佈局 定位Canvas.Top.Canvas.Left ZIndex屬性 若制定2個控制項重疊,那麼後聲明控制項會覆蓋先聲明的控制項.此時可以使用Canvas.ZIndex屬性來改變它 ...

  10. 分布式中Redis实现Session终结篇

    上一篇使用Redis实现Session共享方式虽然可行,但是实际操作起来却很麻烦,现有代码已经是这个样子了,总不可能全部换掉吧!好吧,这是个很实际的问题,那么能不能实现无侵入式的分布式Session共 ...