青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

CEGUI的事件系統分析

作者: 楊粼波
Email: tx7do@yahoo.com.cn


什么是GUI?

       GUI就是圖形用戶界面(Graphics User Interface),是指采用圖形方式顯示的計算機操作用戶接口.

 

 什么是GUI的事件?

       所謂事件就是指發送給GUI系統的消息,該消息通知GUI系統某種事情已發生,要求作出響應.簡言之就是:用戶將自己的一個或多個回調函數掛鉤到某個“事件”上,一旦“事件”被觸發,所有掛鉤的函數都被調用。

      顯然,事件機制是一個非常有用的并且常用的機制,C#已經將之在語言層面進行了實現,但是C++并無實現.不過很多庫都有實現比如:boost::signal. 

 

CEGUI的事件機制是什么?

       CEGUI的事件機制采用的是觀察者模式(Observer pattern)的一種實現.很有點像QtSignal/Slot機制,但是又沒有那么復雜.

對事件的封裝上雖然用到了仿函數,但其實卻是為了統一接口,其實質可以是回調函數也可以是仿函數.


CEGUI事件系統的靜態類圖



向事件系統注冊事件的流程

首先客戶調用EventSet::subscribeEvent方法,傳入的參數為參數名和回調方法.實際上第二個參數的傳入過程中有一個創建臨時變量SubscriberSlot,其實質上是一個綁定的回調函數(函數指針,成員函數指針,仿函數等)的過程,在圖中并沒有表現出來.

       接著, EventSet::subscribeEvent方法中會首先調用EventSet::getEventObject方法獲取事件,EventSet::getEventObject,如果沒有查找到事件,則會創建之.當獲取到事件之后, EventSet::subscribeEvent會調用Event::subscribe方法.

       Event::subscribe方法中,會先創建一個BoundSlot的實例,而在BoundSlot的構造方法當中,它會創建一個SubscriberSlot的實例,并將EventSet::subscribeEvent傳入的第二個參數保存到SubscriberSlot的實例里面去.



事件系統響應事件的流程

       首先要說明的是,客戶首先必須要從EventSet繼承下來才行,CEGUI里面有System,Renderer,Window,MouseCursor以及GlobalEventSet.其中GlobalEventSet是單件,系統創建以后就要創建它,EventSet對它是有依賴的,由上圖就可以得知.

       EventSet是什么呢?EventSet它是一個事件的容器,它是一個事件處理中心.可以說是事件系統的接口.

       當客戶向事件系統發送了一個事件之后,即是執行EventSet::fireEvent. EventSet::fireEvent首先執行了GlobalEventSet:: fireEvent,而后才執行其自身的一個方法EventSet::fireEvent_impl,該方法才是真正進行事件處理的方法,由該方法的后綴impl即可得知了. EventSet::fireEvent_impl先是執行了getEventObject方法查找到事件,然后調用該事件Event的仿函數,該仿函數調用BoundSlot:: m_pSubscriber的仿函數,它最終將會調用到SlotFunctorBase接口的實現的仿函數,而這個仿函數內部調用到的是真正的回調方法.

       SlotFunctorBase這一塊實際上是Gof模式之一的適配器模式(adapter pattern)的應用.

 

測試代碼:

using namespace CEGUI;

/// 事件參數
class TestEventArgs : public EventArgs
{
public:
    TestEventArgs(
const int& _n) : n(_n) {}

    
int n;    
}
;

/// 事件
class testEvent : public EventSet
{
public:
    testEvent()
{}

    
static const String EventNamespace;
    
static const String EventTest;

    
void injectTest(int n)
    
{
        TestEventArgs e(n);
        fireEvent(EventTest, e, EventNamespace);
    }

}
;
const String testEvent::EventTest("test");
const String testEvent::EventNamespace("testEvent");

/// 客戶
class testClient
{
public:
    testClient()
    
{
        Init();
    }


    
void Init()
    
{
        
new GlobalEventSet();
        mEvent.subscribeEvent(testEvent::EventTest, Event::Subscriber(
&testClient::handleTest, this) );
    }


    
bool handleTest(const CEGUI::EventArgs& e)
    
{
        
int val = static_cast<const TestEventArgs&>(e).n;
        std::cout 
<< val << std::endl;
        
return true;
    }


    
void exe()
    
{
        mEvent.injectTest(
99);
        mEvent.injectTest(
5555);
    }


private:
    testEvent mEvent;
}
;

int main()
{
    testClient client;
    client.exe();

    system(
"pause");
    
return 0;
}

下面對代碼進行講解.
   首先,我們需要聲明一個事件參數,在CEGUI主模塊里面都是一些鍵盤鼠標的輸入事件參數.
   然后,我們需要聲明一個事件集,它由EventSet繼承而來.
   在測試代碼里面,我們聲明了一個testClient的類,代表著客戶在里面我們聲明一個回調方法:testClient::handleTest.testClient::Init方法作為客戶的初始代碼,在這里面,我們注冊事件.在testClient::exe里面執行觸發事件的代碼.而后,事件將會被觸發,繼而testClient::handleTest方法將會被回調執行.


代碼下載:
testEventSystem.rar
需要注意的是,這份代碼里面的事件系統不是原汁原味的CEGUI的事件系統,是經過我略加修改之后的東西.


文檔和圖片下載:
CEGUI事件系統分析.rar
靜態類圖貌似過大了,上傳到博客上面它自動給我縮小了--!那根本就看不清楚,Word和PDF文檔里面也勉強能看清楚,沒辦法只好都打包進去了.


參考資料

1.       圖形用戶界面 http://zh.wikipedia.org/zh-cn/GUI

2.       GUI系統的事件機制 http://wenku.baidu.com/view/a07ea19951e79b896802260d.html

posted on 2010-06-02 00:58 楊粼波 閱讀(4333) 評論(3)  編輯 收藏 引用

評論

# re: CEGUI的事件系統分析 2010-06-02 10:48 Any

可否告訴我文中的圖用什么畫的?  回復  更多評論   

# re: CEGUI的事件系統分析 2010-06-02 10:53 楊粼波

用EA(Enterprise Architect 7.5)畫的.  回復  更多評論   

# re: CEGUI的事件系統分析 2011-04-15 12:36 liigo

我(liigo)認為CEGUI使用的這套事件處理機制挺漂亮的,簡單實用。基本上由EventSet管理:它維護著一個string為key,鏈表為value的哈希表;每個string就對應一個事件名稱,鏈表里則存儲著用于接收這個事件的用戶處理代碼的抽象(仿函數,由subscribeEvent提供)。注冊一個事件處理函數(也可以是任意對象方法或仿函數),就是往哈希表中事件名稱對應的鏈表中添加一個項;觸發事件處理函數呢,就是循環調用指定事件名稱對應的鏈表中的每一個仿函數。  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            黄色日韩网站视频| 玖玖在线精品| 男女精品网站| 欧美综合激情网| 亚洲黄色尤物视频| 国产午夜精品一区理论片飘花 | 亚洲一区二区三区精品视频| 在线成人免费观看| 久久成人免费视频| 欧美一区二区免费观在线| 欧美日韩国产精品一卡| 欧美高清在线一区二区| 激情欧美国产欧美| 午夜精品视频| 欧美一区二区三区久久精品茉莉花| 欧美精品国产一区二区| 亚洲国产经典视频| 亚洲国产视频直播| 牛牛国产精品| 欧美r片在线| 91久久久精品| 欧美成年网站| 亚洲精品国产视频| 夜夜嗨av色一区二区不卡| 欧美精品一区三区在线观看| 亚洲国内自拍| 亚洲最新视频在线| 欧美日韩在线播放| 一区二区不卡在线视频 午夜欧美不卡'| 亚洲精品国久久99热| 女同一区二区| 亚洲狼人综合| 午夜一区二区三区不卡视频| 国产欧美精品日韩精品| 亚洲欧美中文另类| 久久亚洲不卡| 亚洲欧洲在线观看| 欧美日韩三级一区二区| 亚洲图片在线观看| 久久人人97超碰精品888| 欧美日韩国产片| 亚洲一区不卡| 久久久久久免费| 亚洲国产精品一区| 欧美日韩成人综合在线一区二区| 亚洲另类黄色| 欧美在线免费播放| 亚洲国产成人在线视频| 欧美精品18videos性欧美| 夜夜狂射影院欧美极品| 久久精品动漫| 亚洲国产综合视频在线观看| 欧美日韩视频一区二区| 亚洲欧美一区二区三区久久| 欧美 日韩 国产在线| 亚洲深夜福利| 激情久久中文字幕| 欧美日韩在线播放三区四区| 性8sex亚洲区入口| 欧美国产日韩一区二区| 午夜日韩激情| 91久久精品国产91性色tv| 欧美性理论片在线观看片免费| 久久国产成人| 亚洲卡通欧美制服中文| 久久久噜噜噜| 制服诱惑一区二区| 在线观看日韩一区| 国产精品久久久久婷婷| 欧美暴力喷水在线| 午夜在线观看免费一区| 亚洲精品美女在线观看| 久久精品国产久精国产一老狼| 亚洲美女电影在线| 狠狠色狠狠色综合系列| 国产精品theporn| 免费黄网站欧美| 欧美一区二区三区在线看 | 亚洲欧美日韩一区| 亚洲国产99| 老司机精品福利视频| 亚洲一级影院| 99国产精品国产精品毛片| 一区久久精品| 国产一区二区三区直播精品电影 | 久久夜色精品国产欧美乱| 亚洲一区二区精品在线观看| 尤物yw午夜国产精品视频| 国产精品影音先锋| 欧美日韩精品二区第二页| 久久一二三区| 久久久国际精品| 久久爱www久久做| 亚洲综合色网站| 一区二区三区福利| 日韩视频中文字幕| 亚洲啪啪91| 亚洲激情av| 亚洲第一成人在线| 欧美不卡视频一区| 浪潮色综合久久天堂| 久久国产色av| 久久不射中文字幕| 欧美在线观看视频一区二区| 午夜精品福利在线观看| 亚洲综合色丁香婷婷六月图片| 一级成人国产| 亚洲综合色婷婷| 亚洲综合视频一区| 午夜精品在线视频| 欧美一区亚洲一区| 久久久久九九九九| 老司机免费视频久久| 牛牛精品成人免费视频| 欧美二区在线播放| 欧美激情亚洲综合一区| 亚洲欧洲精品一区二区三区不卡 | 亚洲欧美日韩一区二区三区在线观看| 亚洲午夜电影在线观看| 午夜精品婷婷| 欧美在线关看| 欧美成人免费大片| 亚洲高清视频一区| 亚洲毛片在线| 亚洲在线免费| 欧美在线视频一区二区| 久久人人爽人人爽| 欧美大片一区二区三区| 欧美婷婷久久| 欧美激情精品久久久久| 欧美性事免费在线观看| 国产一区999| 最近看过的日韩成人| 亚洲网站在线观看| 欧美中文字幕第一页| 嫩草成人www欧美| 日韩天堂在线视频| 欧美一区国产一区| 欧美69wwwcom| 国产精品视频午夜| 亚洲国产高清一区二区三区| 亚洲视频在线观看免费| 久久精品麻豆| 亚洲欧洲日产国产网站| 亚洲视频自拍偷拍| 久久久人成影片一区二区三区观看 | 美女成人午夜| 久久免费国产精品1| 欧美精品一区二区高清在线观看| 国产精品入口夜色视频大尺度| 今天的高清视频免费播放成人 | 亚洲免费观看在线观看| 欧美在线看片a免费观看| 欧美激情久久久久| 亚洲在线中文字幕| 免费高清在线一区| 国产嫩草影院久久久久| 亚洲九九九在线观看| 久久久噜噜噜久久中文字免 | 亚洲高清视频在线观看| 亚洲欧美视频在线观看| 欧美人妖另类| 亚洲国产成人porn| 久久精品国产亚洲精品| 99亚洲视频| 欧美va亚洲va香蕉在线| 国产欧美一区二区三区久久人妖| 99热免费精品| 亚洲国产精品成人一区二区 | 欧美一区免费视频| 欧美午夜影院| 亚洲乱码国产乱码精品精可以看 | 亚洲国产精品久久久久秋霞不卡| 欧美一区二区三区视频| 一区二区三区久久久| 欧美第一黄网免费网站| 精品二区视频| 久久精品一区二区三区不卡牛牛| 在线中文字幕一区| 欧美中文在线字幕| 国产精品久久久久久久久免费桃花 | 原创国产精品91| 久久福利视频导航| 亚洲免费影视第一页| 国产精品免费福利| 性欧美大战久久久久久久免费观看 | 欧美日本中文| 一本色道**综合亚洲精品蜜桃冫| 亚洲国产精品女人久久久| 久久综合电影一区| 精品99视频| 久久影院午夜论| 久久久综合精品| 在线观看欧美日韩国产| 美女尤物久久精品| 久久综合久久综合久久综合| 亚洲大胆在线| 亚洲激情电影在线| 欧美日韩另类丝袜其他| 亚洲天天影视|