duilib初始化无法获取控件位置(所有位置都为0)
duilib中,我们往往在InitWindow虚函数中获取指定控件位置,调整控制其他控件大小等,但是使用getpos获取的矩形位置为0,所有我们没法在其中最我们自己想要的操作,经过duilib的调试跟踪发现:在窗口创建后第一次刷屏WM_Paint的时候,第一次调整pRoot根节点容器的所有子控件位置就在这个时候;而虚函数InitWindow是在Oncreate中调用的,所有在InitWindow的
duilib中,我们往往在InitWindow虚函数中获取指定控件位置,调整控制其他控件大小等,但是使用getpos获取的矩形位置为0,所有我们没法在其中最我们自己想要的操作,经过duilib的调试跟踪发现:在窗口创建后第一次刷屏WM_Paint的时候,第一次调整pRoot根节点容器的所有子控件位置就在这个时候;而虚函数InitWindow是在Oncreate中调用的,所有在InitWindow的时候所有控件位置为0,也就是构造时候的空值;整理一下顺序:
(1) 窗口Create,也就是调用CWndWindow或CWindowBaseImpl的create方法创建窗口;
(2)捕获WM_Create消息,在OnCreate处理函数里会调用InitWindow虚函数,此时子控件位置都未初始化;
(3)窗口创建后第一次刷新的时候也就是第一次处理WM_PAINT的时候,会调用pRoot根节点的SetPos,根节点的SetPos会循环递归设置所有子控件的位置;
(4)在(3)过程之后会触发windowinit消息,表示窗口初始化完毕;
定位截图如下:
WM_PAINT 消息第一次刷新操作:
if(m_bFirstLayout)
{
m_bFirstLayout = false;
SendNotify(m_pRoot, DUI_MSGTYPE_WINDOWINIT, 0, 0,false);
}
在SendNotify中给所有通知对象发送了窗口初始化消息,消息发出者pSender即为pRoot,而WindowBaseImpl在创建的时候
已经调用AddNotify(this)将自己加入PaintMgr通知列表当中去了,所有WindowBaseImpl可以得到通知消息!
我们需要做的就是在WindowBaseImp子类中的虚方法Notify中处理该消息DUI_MSGTYPE_WINDOWINIT("windowinit")即可,
在这里我们可以获取到所有控件位置已经准备就绪,实现我么想做的事!
更多推荐
所有评论(0)