• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            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 閱讀(2049) 評論(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
              主要是測試麻煩  回復  更多評論   
             
            亚洲人成无码www久久久| 久久精品亚洲日本波多野结衣| 久久久久AV综合网成人| 人妻中文久久久久| 久久亚洲精品无码观看不卡| 久久精品免费大片国产大片| 97久久精品人人澡人人爽| 91精品国产91热久久久久福利 | 伊人精品久久久久7777| 久久综合鬼色88久久精品综合自在自线噜噜 | 国产精品熟女福利久久AV| 嫩草影院久久99| 久久久久人妻一区精品| 中文字幕无码精品亚洲资源网久久| 精品久久久久久中文字幕大豆网| 日日躁夜夜躁狠狠久久AV| 亚洲精品乱码久久久久久| 国产精品久久99| 久久综合给合综合久久| 久久夜色精品国产噜噜噜亚洲AV | 免费一级欧美大片久久网| 2021国产精品午夜久久| 97久久香蕉国产线看观看| 久久亚洲视频| 国产精品久久毛片完整版| 亚洲国产香蕉人人爽成AV片久久| 国产69精品久久久久777| 99精品国产免费久久久久久下载| 久久香蕉综合色一综合色88| 久久久国产99久久国产一| 国产亚洲色婷婷久久99精品| 久久久人妻精品无码一区 | 久久亚洲精品国产精品| 久久狠狠一本精品综合网| 久久精品麻豆日日躁夜夜躁| 久久精品极品盛宴观看| 97久久精品人人澡人人爽| 高清免费久久午夜精品| 精品久久久久久无码专区不卡| 亚洲色婷婷综合久久| 亚洲国产成人乱码精品女人久久久不卡 |