先上案例
<?xml version="1.0" encoding="UTF-8"?>
<MyGUI type="Layout" version="3.2.0">
<Widget type="Window" skin="WindowC" position="20 72 711 709" layer="Overlapped" name="_Main">
<Property key="Caption" value="HelloWord!!"/>
<Widget type="Button" skin="Button" position="14 22 160 26" name="OK">
<Property key="Caption" value="OK"/>
</Widget>
</Widget>
</MyGUI>
MyGUI中的页面布局会调用layout文件,格式为XML。
Widget标签中包含了一个窗口界面的信息,type类型,skin皮肤,position位置,layer层级,name名字等,其中position有四个参数,从左到右依次是X,Y,W,H,界面中坐标系原点位于屏幕左上角,左上角向右为X轴正方向,向下为Y轴正方向,w为界面的宽度,H为界面的高度。
详细的规则可以看MyGUI中MyGUI_Media目录下的文件,里面包含了所有MyGUI中使用的xml文件。下面说一下layer。
layer有两种类型:Shared和Overlapped。
我们看源码进行一个对比
首先,Shared比Overlapped的默认构造函数中多了一个mChildItem(nullptr)
OverlappedLayer::OverlappedLayer() :
mIsPick(false),
mOutOfDate(false)
{
mViewSize = RenderManager::getInstance().getViewSize();
}
SharedLayer::SharedLayer() :
mIsPick(false),
mChildItem(nullptr),
mOutOfDate(false)
{
mViewSize = RenderManager::getInstance().getViewSize();
}
再来看各自的createChildItemNode()
ILayerNode* SharedLayer::createChildItemNode()
{
if (mChildItem == nullptr)
mChildItem = new SharedLayerNode(this);
mChildItem->addUsing();
mOutOfDate = true;
return mChildItem;
}
ILayerNode* OverlappedLayer::createChildItemNode()
{
// создаем рутовый айтем
ILayerNode* node = new LayerNode(this);
mChildItems.push_back(node);
mOutOfDate = true;
return node;
}
OverLapped中新建的节点通过push_back()依次从后面插入,因此OverLapped是有序的。
Shared则不同,使用的是addUsing()
void SharedLayerNode::addUsing()
{
mCountUsing++;
}
发现这是一个计数器,只统计数量,是无序的。
再看
void OverlappedLayer::upChildItemNode(ILayerNode* _item)
{
// если есть отец, то пусть сам рулит
ILayerNode* parent = _item->getParent();
if (parent != nullptr)
{
parent->upChildItemNode(_item);
mOutOfDate = true;
return;
}
if ((2 > mChildItems.size()) || (mChildItems.back() == _item))
return;
for (VectorILayerNode::iterator iter = mChildItems.begin(); iter != mChildItems.end(); ++iter)
{
if ((*iter) == _item)
{
mChildItems.erase(iter);
mChildItems.push_back(_item);
mOutOfDate = true;
return;
}
}
MYGUI_EXCEPT("item node not found");
}
void SharedLayer::upChildItemNode(ILayerNode* _item)
{
// если есть отец, то пусть сам рулит
// if there is a father, then let him steer
ILayerNode* parent = _item->getParent();
if (parent != nullptr)
parent->upChildItemNode(_item);
mOutOfDate = true;
}
可以看出
OverLapped把ChildItemNode都放在一个vector容器中,通过迭代器进行插入和删除的操作,每个Child之间有对应关系。
Shared则是直接指向上一层的父节点。一个父节点可以有多个Child,因此是个一对多或者一对一的关系,跟OverLapped相比,层级关系显得较为混乱。
因此可以认为,OverLapped是有层级的,Shared是没有层级的。