MyGUI探索(三)MyGUI页面布局

MyGUI探索(三)MyGUI页面布局



一、layout文件

先上案例

<?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的类型

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是没有层级的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值