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

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
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>
            亚洲日产国产精品| 亚洲黄一区二区| 欧美女人交a| 久久久久国产精品www| 欧美日韩精品在线播放| 美国十次了思思久久精品导航| 欧美伦理一区二区| 亚洲福利专区| 亚洲激情在线播放| 久久久99爱| 久久精品视频在线播放| 国产精品美女久久久久av超清 | 亚洲人成在线播放网站岛国| 久久精品视频免费播放| 久久精品人人做人人爽| 国产精品久久影院| 亚洲先锋成人| 亚洲欧美文学| 国产麻豆综合| 性18欧美另类| 久久久久久自在自线| 国产一区视频在线观看免费| 亚洲在线日韩| 久久精品国产精品亚洲精品| 国产欧美一区二区视频| 性久久久久久| 久久天堂av综合合色| 一区二区三区我不卡| 久久婷婷国产综合尤物精品 | 午夜视黄欧洲亚洲| 国产精品日韩精品欧美在线| 亚洲影院高清在线| 欧美一区二区三区久久精品茉莉花| 欧美午夜寂寞影院| 亚洲欧美日韩另类精品一区二区三区| 午夜精品久久| 一区二区在线观看av| 欧美成人官网二区| 亚洲精品中文字幕在线观看| 亚洲一区欧美二区| 国产视频一区二区在线观看| 久久久蜜桃一区二区人| 亚洲国产va精品久久久不卡综合| 亚洲精品一区二区三区四区高清| 欧美日韩亚洲激情| 性做久久久久久久免费看| 久久这里只有| 99精品免费视频| 国产精品综合av一区二区国产馆| 久久精品123| 亚洲激情av| 久久国产精品网站| 亚洲国产成人porn| 国产精品成人免费精品自在线观看| 亚洲欧美一级二级三级| 欧美韩日一区二区| 午夜视频在线观看一区二区三区| 国产自产女人91一区在线观看| 看欧美日韩国产| 一本大道久久精品懂色aⅴ| 久久精品在线视频| 99国产精品视频免费观看一公开 | 欧美精品在线免费观看| 亚洲一区二区欧美日韩| 农村妇女精品| 欧美亚洲视频在线看网址| 亚洲二区视频| 国产精品永久免费在线| 免费视频最近日韩| 午夜精彩国产免费不卡不顿大片| 欧美激情第二页| 久久激情视频免费观看| 在线一区二区三区做爰视频网站| 一区在线播放视频| 国产精品女主播在线观看| 男人天堂欧美日韩| 亚洲欧美亚洲| 亚洲美女区一区| 榴莲视频成人在线观看| 性欧美超级视频| 国产精品99久久不卡二区| 亚洲成色最大综合在线| 国产精品综合av一区二区国产馆| 欧美电影在线观看| 久久麻豆一区二区| 亚洲欧美激情诱惑| 中文无字幕一区二区三区| 亚洲大胆女人| 麻豆成人小视频| 欧美在线观看视频一区二区三区| 亚洲午夜视频在线| 一区二区精品| 99国产精品久久久久久久成人热| 亚洲激情成人在线| 在线观看免费视频综合| 国产一区二区三区奇米久涩| 欧美午夜免费电影| 欧美午夜激情小视频| 欧美日韩一区二区欧美激情| 欧美国产日韩在线| 欧美福利视频一区| 欧美成人视屏| 欧美精品亚洲精品| 欧美久久一区| 欧美日韩色婷婷| 欧美日韩一区二区免费视频| 欧美日韩精品一本二本三本| 欧美日韩第一页| 国产精品成人一区| 国产精品一区二区久久精品| 国产美女扒开尿口久久久| 国产欧美日韩一级| 国内久久精品| 亚洲国产精品成人| 一区二区欧美在线| 久久久久久久精| 性久久久久久久久久久久| 欧美夜福利tv在线| 久久理论片午夜琪琪电影网| 久热re这里精品视频在线6| 欧美成人a视频| 91久久国产综合久久91精品网站| 亚洲国产成人久久| 日韩视频中文字幕| 亚洲专区在线| 久久久久网站| 欧美理论大片| 国产伦精品一区二区三区免费迷| 国产一区二区三区久久| 亚洲国产三级在线| 亚洲网站在线播放| 久久久久久夜| 亚洲人成在线免费观看| 亚洲图片在线| 久热爱精品视频线路一| 欧美视频中文字幕| 精品99视频| 亚洲视频香蕉人妖| 麻豆av一区二区三区| 99亚洲视频| 久久精品道一区二区三区| 欧美精品久久99| 国产在线一区二区三区四区| 亚洲国产精品嫩草影院| 亚洲欧美日本国产专区一区| 久久免费偷拍视频| 一本大道久久a久久综合婷婷| 久久大香伊蕉在人线观看热2| 欧美国产高清| 国产亚洲成av人片在线观看桃| 亚洲国产经典视频| 欧美在线观看视频一区二区三区| 亚洲第一中文字幕| 亚洲欧美日韩中文在线制服| 欧美成人精品一区| 国内精品久久久| 亚洲午夜成aⅴ人片| 久久久久国产一区二区| 99精品欧美| 欧美成人免费网| 激情综合色综合久久综合| 亚洲欧美在线免费| 亚洲精品在线观看免费| 美日韩精品免费观看视频| 国产香蕉久久精品综合网| 亚洲先锋成人| 亚洲国产天堂久久综合网| 久久久久高清| 国产视频一区二区在线观看| 亚洲先锋成人| 日韩午夜在线电影| 欧美大成色www永久网站婷| 好吊一区二区三区| 欧美中文字幕不卡| 亚洲综合成人婷婷小说| 欧美视频中文在线看 | 欧美激情国产日韩| 久久精品国产在热久久| 国产欧美日韩一区二区三区在线观看 | 日韩一级精品视频在线观看| 久久人人爽人人爽爽久久| 亚洲欧美日韩国产综合精品二区| 欧美日韩三级视频| 中文一区在线| 日韩亚洲欧美成人一区| 欧美国产精品中文字幕| 亚洲国产一区视频| 亚洲大片av| 欧美www在线| 亚洲狼人综合| 亚洲精品婷婷| 欧美三级乱码| 亚洲欧美乱综合| 午夜在线不卡| 伊甸园精品99久久久久久| 免费观看不卡av| 欧美丰满高潮xxxx喷水动漫| 日韩视频永久免费| 日韩亚洲欧美一区| 国产精品日本欧美一区二区三区|