• <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等多種語言 程序猿
            接上文:http://m.shnenglu.com/gaimor/archive/2010/09/30/128134.html
            本文我們接著說UI庫的消息事件部分:
            1.UI基本事件類型
              基本上就下面幾種:
            ////////////////////////////////////////////////////////////
            /// 枚舉UI消息類型
            ////////////////////////////////////////////////////////////
            enum UI_EVENT
            {
                
            //! 鼠標移動
                UI_EVENT_MOUSE_MOVE = 0,
                
            //! 鼠標點擊
                UI_EVENT_MOUSE_CLICK,
                
            //! 鼠標進入
                UI_EVENT_MOUSE_ENTERED,
                
            //! 鼠標退出
                UI_EVENT_MOUSE_EXITED,
                
            //! 鼠標滾輪事件
                UI_EVENT_MOUSE_WHEEL,
                
            //! 字符輸入
                UI_EVENT_CHAR_INPUT,
                
            //! 鍵盤按鍵
                UI_EVENT_KEY_PRESS,
                
            //! 按鍵退出
                UI_EVENT_KEY_RELEASE,
                
            //! 焦點事件
                UI_EVENT_LOST_FOCUSE,
                UI_EVENT_GAIN_FOCUSE,
                
            //! 滑塊事件
                UI_EVENT_SLIDER_MOVE,
                
            //! 編輯事件
                UI_EVENT_EDIT,
                
            //! 選擇,反選擇
                UI_EVENT_SELECTED,
                UI_EVENT_DESELECTED
            };
            2.
            關于事件一般就3個相關對象:
            事件,消息聽者和消息處理對象3個單元塊:
            如下所示:

            ///////////////////////////////////////////////////////////
            /// 定義引擎事件基類模板
            ///////////////////////////////////////////////////////////
            template<class EventType = int>
            class Event : NonCopyable
            {
            public:
                
            ///////////////////////////////////////////////////////
                
            /// 事件基類構造函數
                
            ///////////////////////////////////////////////////////
                Event(const EventType& type):type_(type){}

                
            ////////////////////////////////////////////////////////
                
            /// 事件基類析構函數
                
            ////////////////////////////////////////////////////////
                virtual ~Event(){}

                
            ////////////////////////////////////////////////////////
                
            /// 獲取事件類型
                
            ////////////////////////////////////////////////////////
                EventType GetEventType()const{return type_;}
            private:
                
            ////////////////////////////////////////////////////////
                
            /// 數據成員變量
                
            ////////////////////////////////////////////////////////
                EventType type_;
            };

            ////////////////////////////////////////////////////////////
            /// 定義事件聽者基類
            ////////////////////////////////////////////////////////////
            template<class Event,class Target>
            class EventListener
            {
            public:
                
            ////////////////////////////////////////////////////////
                
            /// 事件聽者虛析構函數
                
            ////////////////////////////////////////////////////////
                virtual ~EventListener(){}

                
            ////////////////////////////////////////////////////////
                
            /// 消息派送
                
            ////////////////////////////////////////////////////////
                virtual bool Dispatch(const Event& message,Target object= 0;
            };

            ////////////////////////////////////////////////////////////
            /// 定義事件處理者基類
            ////////////////////////////////////////////////////////////
            template<class Event,class EventListener>
            class EventHandler
            {
            public:
                
            ////////////////////////////////////////////////////////
                
            /// 事件聽者虛析構函數
                
            ////////////////////////////////////////////////////////
                virtual ~EventHandler(){}

                
            ////////////////////////////////////////////////////////
                
            /// 消息處理
                
            ////////////////////////////////////////////////////////
                virtual bool Process(const Event& message){return false;}

                
            ////////////////////////////////////////////////////////
                
            /// 增加,移除事件消息
                
            ////////////////////////////////////////////////////////
                virtual void AddEventListener(EventListener* listener){}
                
            virtual void RemoveEventListener(EventListener* listener){}
            };
            然后便是模板實例:
            typedef Event<UI_EVENT>                          UI_Event;
            typedef EventListener<UI_Event,UI_Widget*>       UI_EventListener;
            typedef EventHandler<UI_Event,UI_EventListener*> UI_EventHandler;
            說實話可以不這樣做而是用boost::function之類的函數綁定
            但是沒法子這樣寫我習慣了 呵呵
            2.下面是UI事件的承接部分:
            通過UI管理器承接輸入輸出系統的消息響應:
            {
            ////////////////////////////////////////////////////////////
            /// 蓋莫GUI管理器
            ////////////////////////////////////////////////////////////
            class GAPI UI_WidgetManager : public UI_EventListenerImpl
            public:
                
            ////////////////////////////////////////////////////////
                
            /// 按鍵處理
                
            ////////////////////////////////////////////////////////
                bool OnMouseLeftDown(int x,int y);
                
            bool OnMouseLeftUp(int x,int y);
                
            bool OnMouseMiddleDown(int x,int y);
                
            bool OnMouseMiddleUp(int x,int y);
                
            bool OnMouseRightDown(int x,int y);
                
            bool OnMouseRightUp(int x,int y);
                
            bool OnMouseMove(int x,int y);
                
            bool OnChar(wchar_t code);
                
            bool OnKeyDown(int code);
                
            bool OnKeyUp(int code);
                
            bool OnMouseWheel(int z);
            public:
            3.事件生成:
            以上2部分分別是UI事件對象系列和UI事件輸入部分
            下面設計UI事件的生成
            無論是鼠標還是鍵盤事件實際上都相當于生成了一個新的事件
            舉例如下:
            OnMouseLeftDown(int x,int y)
            如果該函數被調用
            那么就說明鼠標的左鍵被點擊同時我們還知道了點擊的位置坐標
            這樣就生成了一個UI_MouseClickEvent 對象
            不過這里需要考慮是鼠標雙擊還是單擊
            這就要考慮本次點擊和上次點擊的時間間隔了
            這樣就生成了一個UI鼠標事件
            那本事件應該傳給誰?
            應該是目標對象
            直觀一點應該是傳給鼠標當前位置下的控件對象
            但是考慮到實際情況
            這里有一個聚焦控件和活動控件的概念
            比如說我們打開一個對話框(這是一個聚焦控件)
            對話框上有1個按鍵
            當用戶點擊本按鍵則消息發送給這個按鍵了
            但是當鼠標移出對話框之外
            一般情況其他控件此時處于非活動狀態
            消息應該發送給聚焦控件
            所以這里至少有3各類型的控件指針分別為:聚焦控件,活動控件以及鼠標下控件(當然他們可以是同一控件)
            在這里需要說明這三個控件是這樣切換的
            如果發生特定的uI事件則修改當前的聚焦控件等對象了
            4.具體控件對消息的處理:
               生成特定消息,并發送給相應的控件對象之后那么控件就需要相應該消息了:
            控件對象的相關函數:
            ///////////////////////////////////////////////////////////
            /// 定義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;
                
            void RemoveEventListener(UI_EventListener* listener);
                
            ////////////////////////////////////////////////////////
                
            /// 消息處理
                
            ////////////////////////////////////////////////////////
                virtual bool Process(const UI_Event& event)
            在這里我們通過Process函數來接受UI管理器傳過來的消息對象.
            這里是想要的處理
            注意我們并不直接根據消息響應控件的各種狀態!
            而是通過迭代消息聽者鏈表的
            如下:
            bool UI_Widget::Process(const UI_Event& event)
            {
                
            bool ret = false;
                
            if(IsVisible() && IsEnabled())
                {
                    UIEventListenerItr it;
                    
            for(it = message_listeners_.begin();it != message_listeners_.end();++it)
                    {
                        UI_EventListener
            * listener = *it;
                        ret 
            = ret || listener->Dispatch(event,this);
                    }
                    
            //! 處理控件邊框事件
                    if(border_)
                        border_
            ->Process(event);
                }
                
            return ret;
            }
            當消息傳來之后我們并不能確定這就是本控件所需要的消息需要驗證它
            如何驗證?
            就看當前控件是不是可顯示和活動的咯
            同時如何控件有邊框對象我們則把消息發給它以改變可能的邊框外觀

            下篇:UI設計概要4:UI控件對象

            posted on 2010-10-04 16:46 ccsdu2009 閱讀(1855) 評論(0)  編輯 收藏 引用 所屬分類: Game引擎
             
            99久久无码一区人妻| 久久精品亚洲福利| 影音先锋女人AV鲁色资源网久久| 日本欧美久久久久免费播放网| 久久青青草原精品影院| 久久只有这精品99| 国产精品狼人久久久久影院 | 精品久久久久久久久久中文字幕 | 精品久久久久久综合日本| 亚洲国产香蕉人人爽成AV片久久| 久久97精品久久久久久久不卡| 精品久久久久久久中文字幕| 亚洲狠狠婷婷综合久久蜜芽| 国产免费久久精品99re丫y| 国内精品久久久久久久亚洲| 午夜精品久久久久久影视riav| 色欲综合久久中文字幕网| 久久久久亚洲?V成人无码| 国产成人久久激情91| 久久99热只有频精品8| 久久久久亚洲精品天堂| 伊人久久精品无码二区麻豆| 亚洲国产成人久久综合一| 亚洲色婷婷综合久久| 亚洲婷婷国产精品电影人久久| 精品久久久久久综合日本| 色8久久人人97超碰香蕉987| 一级做a爰片久久毛片免费陪| 色成年激情久久综合| 国产产无码乱码精品久久鸭| 狠狠综合久久综合88亚洲| 久久精品一区二区三区AV| 久久久久久久久久久免费精品| 久久青青草原国产精品免费| 久久久久亚洲AV无码麻豆| 奇米影视7777久久精品| 亚洲国产精品无码久久久秋霞2| 思思久久好好热精品国产| 久久伊人影视| 91精品国产综合久久婷婷| 亚洲欧美伊人久久综合一区二区|