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

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
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 楊粼波 閱讀(4331) 評論(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>
            久久精品一区二区三区中文字幕| 欧美精品videossex性护士| 欧美综合激情网| 先锋亚洲精品| 久久亚洲高清| 欧美激情精品久久久久久黑人| 欧美顶级大胆免费视频| 亚洲大片av| 99re8这里有精品热视频免费| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲精品一区二区三区福利| 亚洲精品免费在线| 亚洲无线一线二线三线区别av| 亚洲欧美日韩一区在线| 久久久噜噜噜久久人人看| 亚洲国产精品久久久久秋霞蜜臀 | 亚洲欧美一区二区激情| 久久亚洲精品视频| 亚洲三级电影在线观看| 亚洲综合精品| 蜜桃av综合| 国产欧美一区二区三区沐欲 | 亚洲欧美日本视频在线观看| 久久天天狠狠| 国产精品高潮在线| 亚洲人成网站在线播| 欧美亚洲网站| 亚洲精品久久久蜜桃| 久久不射电影网| 欧美午夜国产| 亚洲人成网站999久久久综合| 欧美黑人多人双交| 亚洲一区二区在线看| 久久久99爱| 亚洲免费av片| 久久一二三国产| 国产精品手机在线| 亚洲美女av电影| 久久久久欧美| 亚洲免费在线观看视频| 欧美屁股在线| 亚洲国产国产亚洲一二三| 欧美一区二区在线看| 99精品国产热久久91蜜凸| 暖暖成人免费视频| 尤物九九久久国产精品的分类| 亚洲欧美中文在线视频| 亚洲精品国产系列| 欧美国产日韩视频| 亚洲国产一区二区三区青草影视 | 亚洲欧美中文另类| 欧美午夜激情视频| 中日韩美女免费视频网站在线观看| 欧美成人精品高清在线播放| 久久不射2019中文字幕| 黄网站免费久久| 欧美一区二区三区久久精品茉莉花| 亚洲精品之草原avav久久| 欧美大尺度在线观看| 亚洲黄色小视频| 亚洲第一区中文99精品| 欧美大片在线看免费观看| 亚洲国产精品视频一区| 欧美a级在线| 欧美黄色视屏| 亚洲丝袜av一区| 宅男噜噜噜66国产日韩在线观看| 欧美午夜免费电影| 欧美亚洲系列| 久久久www成人免费精品| 亚洲国产精品第一区二区| 亚洲成色精品| 欧美日韩视频在线| 欧美伊人久久大香线蕉综合69| 亚洲欧美春色| 伊人精品久久久久7777| 欧美激情一区二区三区成人| 欧美精品一卡二卡| 性xx色xx综合久久久xx| 久久精品视频免费播放| 最新亚洲激情| 亚洲视频你懂的| 激情综合五月天| 亚洲另类春色国产| 国产精品影视天天线| 免费欧美电影| 欧美视频一区二区在线观看| 久久久99免费视频| 欧美久久久久久久久久| 久久久久高清| 欧美成人三级在线| 亚洲午夜女主播在线直播| 亚洲欧美视频| 最新中文字幕一区二区三区| 亚洲一区三区在线观看| 亚洲丁香婷深爱综合| 99精品国产高清一区二区| 国产有码一区二区| 日韩一二在线观看| 在线观看一区二区视频| 日韩视频在线永久播放| 国产一区观看| 99re6热在线精品视频播放速度| 国产日本精品| 亚洲免费观看高清完整版在线观看熊 | 亚洲精品偷拍| 国产在线精品一区二区中文 | 99国内精品久久| 黄色资源网久久资源365| 一卡二卡3卡四卡高清精品视频| 精品成人在线观看| 亚洲一二三区精品| 99pao成人国产永久免费视频| 欧美专区日韩专区| 午夜精品久久久久久久久久久 | 欧美日韩国产综合新一区| 久久亚洲精品伦理| 国产欧美日韩中文字幕在线| 亚洲精选在线| 亚洲三级免费| 老司机免费视频一区二区三区| 久久久久国产精品午夜一区| 国产精品私房写真福利视频| 99re亚洲国产精品| 一区二区三区久久精品| 欧美福利视频在线观看| 欧美国产日韩在线| 亚洲高清不卡在线观看| 久久久久久亚洲综合影院红桃 | 国产日产欧美一区| 亚洲图片激情小说| 一本高清dvd不卡在线观看| 鲁大师影院一区二区三区| 久久人人爽人人爽| 国内精品久久久久伊人av| 午夜亚洲性色视频| 久久狠狠婷婷| 国外精品视频| 久久久久久夜| 欧美大尺度在线观看| 亚洲激情午夜| 欧美日本在线播放| 亚洲一级在线观看| 久久激情婷婷| 国产亚洲午夜| 久久精品国产91精品亚洲| 可以免费看不卡的av网站| 亚洲国产女人aaa毛片在线| 牛人盗摄一区二区三区视频| 亚洲欧洲精品一区二区三区波多野1战4 | 日韩午夜中文字幕| 亚洲欧美经典视频| 国产欧美日韩专区发布| 久久久久久久高潮| 亚洲激情影院| 午夜视频一区在线观看| 国产一区激情| 欧美大片在线观看| 亚洲午夜精品一区二区三区他趣| 久久精品国内一区二区三区| 亚洲电影av在线| 欧美日韩精品二区第二页| 亚洲在线中文字幕| 欧美激情精品久久久久久久变态| 日韩午夜在线观看视频| 国产精品一区二区你懂得| 久久九九久久九九| 亚洲精品一区二区三区蜜桃久| 亚洲欧美网站| 亚洲精品女人| 国产日韩成人精品| 欧美黄色网络| 久久精品动漫| 在线亚洲欧美专区二区| 美女999久久久精品视频| 在线一区欧美| 亚洲国产高清在线观看视频| 国产精品视频自拍| 欧美精品久久一区| 久久久久国色av免费观看性色| 亚洲日本视频| 欧美777四色影视在线| 欧美亚洲在线| 在线亚洲电影| 亚洲国产精品视频| 国产视频不卡| 欧美亚洲成人精品| 鲁大师成人一区二区三区| 性欧美激情精品| 中文日韩在线视频| 亚洲黄色在线视频| 麻豆久久婷婷| 久久久久久久一区| 欧美一区二区三区婷婷月色 | 国产精品99久久久久久www| 亚洲电影免费| 国外成人性视频| 国产一区二区三区精品欧美日韩一区二区三区 | 亚洲国产欧美久久| 久久一区中文字幕|