DuiLib : CControlUI->SetAttribute(L"pos"后, 属性不生效的问题

来源:互联网 发布:商业系统域名 编辑:程序博客网 时间:2024/05/29 04:44

今天在重构一段遗留的UI代码, 原来是3个200行的函数, 里面95%的代码都相同. 不同的地方都可以提炼成函数. 

最后重构了一个函数 + 3个调用, 每个调用带不同的参数.


但是在重构成一个函数后,  发现有 CControlUI->SetAttribute(L"pos" 的调用, 由于调用时机的问题, 导致没有位置变化的效果.


后来才弄清楚, 是需要界面(控件的Owner控件)刷新一下, 才有子控件属性变化的效果. e.g. 位置在容器中的位置变化了.

这种操作不能很频繁, 应该在UI初始化或按钮点击等事件开始的地方处理.


            std::wstring strTag = ns_base::StringFormatV(L"my_ctrl_%d", i_RowIndex);            CLabelUI* pLableObj = static_cast<CLabelUI*>(m_pList->FindSubControl(strTag.c_str()));            /// 必须在 SetAttribute 之后调用 Owner的NeedUpdate, 否则属性不生效            pLableObj->SetAttribute(L"pos",L"55,20,0,0");            m_pList->NeedUpdate(); ///< !


我觉得在UI中移动控件位置很烦人, 如果是我, 我会尽量的显示场景放在不同的Tab中, 这样维护起来很方便.

如果在不同场景下, 同时要移动多个控件, 很容易出BUG.  而且UI代码写的较多.


e.g. List中的行中的列, 如果有10种变化(e.g.  下载, 下载失败, 重新下载, 安装, 安装失败, 重新安装...), 这样搞在某行某列中建立Tab, 在Tab中建立N种子页.

这样换场景的时候, 只需要切换Tab页, 这样逻辑简化好多.


没有代码审查的环境, 对于多人开发后的维护, 真是个恶梦.





0 0