• <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++高級(jí)工程師 Android高級(jí)軟件工程師 IT集成工程師 音頻工程師 熟悉c,c++,java,c#,py,js,asp等多種語(yǔ)言 程序猿
            接上篇
            我們接著說(shuō)UI部分的控件基類
            控件基類應(yīng)該具備的要素
            1.按名生成
            2.控件尺寸
            3.控件大小
            4.控件狀態(tài)
            5.對(duì)消息事件的處理
            6.控件渲染
            7.控件檢測(cè)
            8.控件文本
            然后具體代碼如下:
            ///////////////////////////////////////////////////////////
            /// 定義UI控件基類
            ///////////////////////////////////////////////////////////
            class GAPI UI_Widget : public SlotHolder,public UI_EventHandler,public Object
            {
            public:
                typedef std::list
            <UI_EventListener*> UIEventListener;
                typedef std::list
            <UI_EventListener*>::iterator UIEventListenerItr;
            public:
                
            ////////////////////////////////////////////////////////
                
            /// 窗體構(gòu)造和析構(gòu)
                
            ////////////////////////////////////////////////////////
                explicit UI_Widget(UI_Widget* parent = NULL,const engine_wstring& text = L"widget");
                
            virtual ~UI_Widget();
            public:
                
            ////////////////////////////////////////////////////////
                
            /// 獲取,設(shè)置設(shè)置窗體文本
                
            ////////////////////////////////////////////////////////
                engine_wstring GetText()const{return text_;}
                
            void SetText(const engine_wstring& text);
            public:
                
            ////////////////////////////////////////////////////////
                
            /// 窗體大小和尺寸
                
            ////////////////////////////////////////////////////////
                Size  GetSize()const;
                
            void  SetSize(const Size& size);
                Point GetPosition()
            const;
                
            void  SetPosition(const Point& point);

                
            ////////////////////////////////////////////////////////
                
            /// 獲取窗體推薦大小
                
            ////////////////////////////////////////////////////////
                virtual Size GetRecommendedSize()const;
            public:
                
            ////////////////////////////////////////////////////////
                
            /// 檢測(cè)給定點(diǎn)下控件
                
            ////////////////////////////////////////////////////////
                UI_Widget* GetWidgetBelow(int x,int y);

                
            ////////////////////////////////////////////////////////
                
            /// 獲取本控件的頂層控件
                
            ////////////////////////////////////////////////////////
                UI_Widget* GetTopWidget()const;

                
            ////////////////////////////////////////////////////////
                
            /// 獲取,設(shè)置父窗體
                
            ////////////////////////////////////////////////////////
                UI_Widget* GetParentWidget()const;
                
            void  SetParentWidget(UI_Widget* parent);
            public:
                
            ////////////////////////////////////////////////////////
                
            /// 設(shè)置,獲取控件邊框
                
            ////////////////////////////////////////////////////////
                void SetBorder(const RefPtr<UI_AbstractBorder>& border);
                RefPtr
            <UI_AbstractBorder> GetBorder()const;
                
            ////////////////////////////////////////////////////////
                
            /// 設(shè)置,獲取是否渲染邊框
                
            ////////////////////////////////////////////////////////
                void SetBorderVisible(bool visible);
                
            bool IsBorderVisible();
            public:
                
            ////////////////////////////////////////////////////////
                
            /// 增加,移除事件消息
                
            ////////////////////////////////////////////////////////
                void AddEventListener(UI_EventListener* listener);
                
            void RemoveEventListener(UI_EventListener* listener);
                
            ////////////////////////////////////////////////////////
                
            /// 消息處理
                
            ////////////////////////////////////////////////////////
                virtual bool Process(const UI_Event& event);
            public:
                
            ////////////////////////////////////////////////////////
                
            /// 焦點(diǎn)函數(shù)
                
            ////////////////////////////////////////////////////////
                bool IsFocusOn()const;
                
            void SetFocusOn(bool focus);
                
            void ChangedFocusOn();

                
            ////////////////////////////////////////////////////////
                
            /// 設(shè)置,檢測(cè)是否為活動(dòng)控件
                
            ////////////////////////////////////////////////////////
                void SetAsActiveWidget();
                
            bool IsActiveWidget()const;

                
            ////////////////////////////////////////////////////////
                
            /// 檢測(cè)控件層次關(guān)系
                
            ////////////////////////////////////////////////////////
                virtual bool DoesHierarchyContain(UI_Widget* widget)const;
            public:
                
            ////////////////////////////////////////////////////////
                
            /// 顯示,隱藏窗體
                
            ////////////////////////////////////////////////////////
                void SetVisible(bool visible);
                
            void Show();
                
            void Hide();
                
            bool IsVisible()const;

                
            ////////////////////////////////////////////////////////
                
            /// 窗體狀態(tài)函數(shù)
                
            ////////////////////////////////////////////////////////
                void IsEnable(){enabled_ = true;}
                
            void Disable(){enabled_ = false;}
                
            bool IsEnabled()const{return enabled_;}
            public:
                
            ////////////////////////////////////////////////////////
                
            /// 窗體渲染
                
            ////////////////////////////////////////////////////////
                void Render();

                
            ////////////////////////////////////////////////////////
                
            /// 當(dāng)窗體關(guān)閉的時(shí)候發(fā)射信號(hào)
                
            ////////////////////////////////////////////////////////
                Signal0 closed_;

                 
            ////////////////////////////////////////////////////////
                
            /// 窗體數(shù)據(jù)載入
                
            ////////////////////////////////////////////////////////
                virtual bool Load(const engine_string& file,const engine_string& widget);
            protected:
                
            ////////////////////////////////////////////////////////
                
            /// 執(zhí)行函數(shù)
                
            ////////////////////////////////////////////////////////
                virtual void OnResize(){}
                
            virtual void OnMove(){}
                
            virtual void OnTextChanged(){}
                
            virtual void OnShow(){}
                
            virtual void OnHide(){}
                
            virtual void OnGainedFocus(){}
                
            virtual void OnLostFocus(){}
                
            virtual void OnDraw(){}
            private:
                UI_Widget
            *         parent_;
                UIEventListener    message_listeners_;
                engine_wstring     text_;
                Size               size_;
                Point              position_;
                
            bool               visible_;
                
            bool               enabled_;
                RefPtr
            <UI_AbstractBorder> border_;
                
            bool               border_visible_;
            private:
                DECLARE_OBJECT(UI_Widget)
            };

            }

            #ifdef G_COMPILER_MSVC
            #pragma warning(pop)
            #endif

            需要說(shuō)明的就是這里有3個(gè)父類
            一個(gè)是Object
            一個(gè)是SlotHolder這是消息樁
            另外一個(gè)是UI_EventHandler負(fù)責(zé)對(duì)事件的處理

            需要說(shuō)明的是UI_Widget總是和UI_WidgetManager配合使用的
            畢竟UI上下文最大只能有一個(gè)活動(dòng)控件
            posted on 2010-10-20 18:19 ccsdu2009 閱讀(2002) 評(píng)論(4)  編輯 收藏 引用 所屬分類: Game引擎
            Comments
            • # re: UI設(shè)計(jì)概要4:UI基件[未登錄](méi)
              by
              Posted @ 2010-10-21 13:43
              我以前也是這么做,后來(lái)覺(jué)得,其實(shí)顯示部分和事件處理,邏輯算法這些可以分開(kāi)。
              也就是一個(gè)顯示元素樹(shù),和一個(gè)邏輯元素樹(shù),這樣邏輯會(huì)更清晰。貌似MS的WPF那套也是這么干的吧。  回復(fù)  更多評(píng)論   
            • # re: UI設(shè)計(jì)概要4:UI基件
              2009
              Posted @ 2010-10-21 14:34
              @by
              呵呵 這個(gè)不管如何
              基本都是2個(gè)面
              1個(gè)顯示
              1個(gè)邏輯  回復(fù)  更多評(píng)論   
            • # re: UI設(shè)計(jì)概要4:UI基件
              沫沫
              Posted @ 2010-10-23 23:55
              你這應(yīng)該是模范chrome的代碼寫的吧。。太像了  回復(fù)  更多評(píng)論   
            • # re: UI設(shè)計(jì)概要4:UI基件
              2009
              Posted @ 2010-10-24 16:39
              @沫沫
              不是  回復(fù)  更多評(píng)論   
             
            国产精品亚洲美女久久久| 久久久久久精品久久久久| 久久久久久久国产免费看| 久久精品免费全国观看国产| 婷婷伊人久久大香线蕉AV| 国产精品日韩深夜福利久久| 大香伊人久久精品一区二区| 久久精品国产69国产精品亚洲| 久久综合鬼色88久久精品综合自在自线噜噜| 亚洲成色WWW久久网站| 国产999精品久久久久久| 久久精品无码专区免费东京热 | 欧美精品一区二区久久| 久久综合噜噜激激的五月天| 久久天天躁狠狠躁夜夜2020| 久久777国产线看观看精品| 2021最新久久久视精品爱| 精品久久久久久无码中文野结衣| 亚洲欧美日韩中文久久| 一级a性色生活片久久无| 久久久久国产精品三级网| 国产午夜精品理论片久久影视 | 99久久婷婷国产综合亚洲| 噜噜噜色噜噜噜久久| 久久久久久久久久免免费精品 | 精品人妻久久久久久888| 久久综合视频网| 一级做a爰片久久毛片免费陪| 精品久久久久国产免费 | 亚洲欧美伊人久久综合一区二区 | 99久久国产宗和精品1上映| 久久夜色精品国产噜噜亚洲a| 青青草国产97免久久费观看| 国产日韩久久久精品影院首页| 久久精品国内一区二区三区| 97r久久精品国产99国产精| 精品国产VA久久久久久久冰| 久久夜色精品国产欧美乱| 久久久久人妻精品一区二区三区| 亚洲伊人久久精品影院| 亚洲精品国产美女久久久|