MyGUI探索(三)MyGUI页面布局

MyGUI探索(三)MyGUI页面布局,第1张

MyGUI探索(三)MyGUI页面布局 MyGUI探索(三)MyGUI页面布局

文章目录
  • MyGUI探索(三)MyGUI页面布局
  • 一、layout文件
  • 二、Layer的类型


一、layout文件

先上案例


  
    	    
    
        
            
        
    

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5686797.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存