Cpper
C/C++高级工程师 Android高级软件工程师 IT集成工程师 音频工程师 熟悉c,c++,java,c#,py,js,asp等多种语言 程序猿
GUI系统 布局管理器
1.布局管理器存在的理由:可以避免手动或者逐个调整控件位置
2.布局管理器的基本功能:调整同一容器下同一层次下各个控件的位置
3.布局管理器的基本接口:
       A.控件加入
       B.控件移除
       C.控件排列
4.布局管理器和控件的关系
       A.一个布局管理器负责1个或则多个控件的排列
       B.具有控件容器语义的控件(例如面板)持有一个布局管理器
5.合适调用布局管理之布局?
      A.持有的控件尺寸变化,移动或者用户显示的调用之时
6.可能的布局管理器类型
      A>流式,中央布局,盒子,复杂类型,...

7.简单的布局管理器接口
///////////////////////////////////////////////////////////
/// UI布局信息基类
///////////////////////////////////////////////////////////
class UILayoutInfo
{
public:
    UILayoutInfo(){}
    
virtual ~UILayoutInfo(){}
public:
    
virtual engine_string GetLayouttType()const = 0;
};

///////////////////////////////////////////////////////////
/// 定义UI布局管理器基类
///////////////////////////////////////////////////////////
class UILayouter
{
public:
    UILayouter(){}
    
virtual ~UILayouter(){}
public:
    
////////////////////////////////////////////////////////
    
/// 增加一个窗体到布局管理区
    
////////////////////////////////////////////////////////
    virtual UILayouter& AddWidget(Widget* widget) = 0;
    
virtual UILayouter& AddWidget(Widget* widget,const UILayoutInfo&)
    {
        AddWidget(widget);
        
return *this;
    }

    
////////////////////////////////////////////////////////
    
/// 控件移除和重新排列
    
////////////////////////////////////////////////////////    
    virtual UILayouter& RemoveWidget(Widget* widget) = 0;
    
virtual UILayouter& Arrange(Widget* parent) = 0;
};

所有类型的布局管理器都需要继承于UILayouter
其成员函数Arrange负责调配parent控件下的所有控件单元.

需要说明的是当容器控件加入一个新的控件的时候,其布局管理器就会调用AddWidget负责把新的控件加入布局管理器对象

举一个UI面板的例子:
////////////////////////////////////////////////////////////
/// UI面板(容器)
////////////////////////////////////////////////////////////
class G_DLL_API Panel : public Widget
{
public:
    Panel(
const Rectf& rect,Widget* parent,const engine_string& text = "Panel");
    
virtual ~Panel();
public:
    
////////////////////////////////////////////////////////
    
/// 加入一个子窗体
    
////////////////////////////////////////////////////////
    Panel& AddChildWidget(Widget* widget)
    {
        windows_.push_back(widget);
        layouter_
->AddWidget(widget);
        
return *this;
    }
    Panel
& AddChildWidget(Widget* widget,const UILayoutInfo& info)
    {
        windows_.push_back(widget);
        layouter_
->AddWidget(widget,info);
        
return *this;
    }

    
////////////////////////////////////////////////////////
    
/// 控件移除
    
////////////////////////////////////////////////////////
    Panel& RemoveChildWidget(Widget* widget)
    {
        windows_.remove(widget);
        layouter_
->RemoveWidget(widget);
        
return *this;
    }

    
////////////////////////////////////////////////////////
    
/// 控件排列
    
////////////////////////////////////////////////////////
    Panel& ArrangeChildren()
    {
        layouter_
->Arrange(this);
        
return *this;
    }

    
////////////////////////////////////////////////////////
    
/// 加载布局管理器
    
////////////////////////////////////////////////////////
    Panel& SetLayouter(UILayouter* layouter);
在我设计的时候主要参考了2个GUI库,glooey,opengl gui lib
目前商业上使用的开源CEGUI过于复杂 比很多游戏引擎都大 让人难以容忍
posted on 2010-06-02 17:14 ccsdu2009 阅读(2037) 评论(4)  编辑 收藏 引用 所属分类: Game引擎
Comments
  • # re: 盖莫游戏引擎-GUI系统-布局管理器
    ccsdu2009
    Posted @ 2010-06-02 17:18
    这个应该使用UML,可惜我很少耶很久没有使用咯  回复  更多评论   
  • # re: 盖莫游戏引擎-GUI系统-布局管理器[未登录]
    cexer
    Posted @ 2010-06-02 23:23
    见过的最强的的布局管理器是WOW的。布局管理器一般实现得都灵活性不高,使用起来的代码不比手写MoveWindow少多少,能实现的布局也太有限。写的好的像WOW那种的确实很强大,不过实现起来太费精力了,使用起来也不如MoveWindow直观,反正我自己写GUI框架是不写这个的。  回复  更多评论   
  • # re: 盖莫游戏引擎-GUI系统-布局管理器
    陈梓瀚(vczh)
    Posted @ 2010-06-03 13:26
    @cexer
    我自己实现了TableLayout, StackLayout, Docklayout, FreeLayout。  回复  更多评论   
  • # re: 盖莫游戏引擎-GUI系统-布局管理器
    陈梓瀚(vczh)
    Posted @ 2010-06-03 13:26
    @cexer
    主要是测试麻烦  回复  更多评论   

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理