轉--CEGUI學習筆記一--FirstWindow和FalagardDemo1分析

前言

        該系列文章將記錄我在學習CEGUI(0.6.0)時碰到的一些問題和得出的心得體會,適合沒有任何CEGUI基礎的朋友看。我會不定期的將自己的學習整理成筆記,同時由於我是本月剛接觸CEGUI,也是正在學習的階段,所以熱烈歡迎各路朋友和我探討、交流、指教。最終目的是想在基於OGRE圖像庫的項目中應用CEGUI,希望我這些文字對你有所幫助。


--------------------------------------------------------------------------------

CEGUI學習筆記一

CEGUI 自帶例子,所以我的學習切入點就從這些例子開始。

如果你還沒有成功編譯CEGUI自帶的例子,請仔細閱讀《vs2005環境下編譯CEGUI 0.6.0 》的第4部分。

另外提一句,Lua已經升級到5.1.3了```


--------------------------------------------------------------------------------

OK,現在我假設你對編譯例子時各個文檔是幹什麼用的有一定了解了。並能根據自己機器上的SDK來選擇你想要的渲染層模塊。

實際上,Common就是把渲染層和CEGUI控件分成了兩件事,讓你能專心關注CEGUI的實際使用,而不是過多的關係如何實現一個CEGUI用的渲染層。

關於渲染層的問題,將在未來與OGRE合併的時候來討論,現在我們只需要關注使用CEGUI的套路就好。


--------------------------------------------------------------------------------

首先來看看CEGUISaple_FirstWindow這個例子

--------------------------------------------------------------------------------

1、Imageset、looknfell、scheme、layout都是些什麼?

他們都是CEGUI的窗體樣式配置文件。你可以參考powerkoria的專欄,關於falagard皮膚系統的翻譯手稿(2篇)。http://blog.csdn.net/powerkoria/archive/2008/03/31/2232283.aspx

Imageset

Imageset是CEGUI 用來繪製窗口控件的圖片集座標。如果你不知道我在說什麼,
首先下載CEImagesetEditor-0.6.0,
然後自己打開一個imageset文件自己看看吧。
注意設置相應的tag文件的路徑。
再用VS2005打開imageset文件,明白了吧?

looknfell

looknfell 就是我們寫控件的地方了,這個文件描述了控件長什麼樣子,包括大小,顏色,子控件的佈局等等。

scheme

該文件說老實話以我現在對CEGUI的瞭解,還不知道如何描述它是什麼。去我剛纔給出的連接看看吧,別說是我盜連的哦。

layout

記錄窗體佈局的文件,可以通過該文件直接創建一個帶各種控件的完整窗口。該文件可以用CELayoutEditor來生成。自己用的看看吧。

2、關於 imageset,默認字體,looknfell這些設置,實際上都可以在scheme文件裏設置,而不需要顯式的在程序中寫代碼來做。
仔細比較WindowsLook.scheme和WindowsLookWidgets.scheme這兩個文件。
在開頭部分,WindowsLook.scheme 多出兩行。

 <Imageset Name="WindowsLook" Filename="WindowsLook.imageset" />
 <LookNFeel Filename="WindowsLook.looknfeel" />

在這裏我使用WindowsLook樣式來舉例子,是因爲我將CPP文件裏關於樣式的讀取文件全部替換成了WindowsLook風格。這個沒有什麼困難的,你可以自己動手做做看。
唯一需要注意的就是WindowsLookWidgets.scheme缺少systemButton的聲明,
自己從WindowsLook.scheme中拷過去就好了。

OK,那如何直接使用WindowsLook.scheme把全部的配置都給做了呢?顯然在這個例子裏是沒有範例代碼的。

不過先別急,在完全閱讀了FirstWindow這個例子,併成功的顯示出不同於Taharez風格的窗口之前,我在這等你。


--------------------------------------------------------------------------------

很好~我們現在都已經看到了WindowsLook風格的窗口,就和想象中的一樣呆頭呆腦。

現在再來看看第2個例子FalagardDemo1。

--------------------------------------------------------------------------------

解釋事件機制是一個很麻煩的事情,我不知道能否將它講述清楚,盡力而爲。

講抽象的東西 我不在行,就以鼠標點擊事件來作爲例子吧。

當你初始化CEGUI的時候,會在輸入層的系統(比如OIS或者DXInput之類)上註冊監聽,表示如果發生什麼事情的話,告訴它一聲。

這個時候人點擊鼠標左鍵,鼠標驅動捕獲該動作(發生MouseLeftDown事件),向所有監聽該事件的系統發送這個事件。

CEGUI得到了通知,現在它就開始處理這個事件。

首先從事件發生的座標開始找起,看鼠標當前懸停在哪個窗口之上。
然後看看這個窗口有沒有 註冊處理這個事件 的回調函數。
如果有,則調用它。
如果沒有,則按照轉發規則逐層轉發,直到有人處理它或者 忽略本次事件。

這個規則一般來說 是向父級傳遞,比如如果Button沒有處理點擊事件,那該事件就交給Button的父級窗口來處理,在VCL裏就象在Button的 OnMouseLeftDown裏 向button->parent Send Message一樣。
也有不向上級轉發的事件,比如 MouseLeftUp或者別的什麼。這個需要深入研究CEGUI源代碼。

但是實際上事件處理和消息機制還是有些不同的,因爲這個時候父級對象不知道該事件的通知,CEGUI系統只是按照它的規則在查找與該事件相關的對象上是否有處理該事件的函數。(我不確定有沒發生事件轉發通知....)

那麼CEGUI如何進行查找的呢?
任何對象都有一個Event列表,每一個Event後面都對應着一個回調函數隊列。如:

對象EVENT列表結構:
event1: callbak 1, callbak 2, callbak3
event2: callbak 1, callbak 2, callbak3
event3: callbak 1, callbak 2, callbak3
event4: callbak 1, callbak 2, callbak3
(你可以想象一個 Map,以事件名字符串爲Key,以回調函數列表List爲值 的雙層容器)

首先我們寫一個函數,
然後將該函數註冊到Button事件列表中WindowEvent_OnMouseLeftDown這個事件所對應的回調函數列表中。
當在這個Button上發生了OnMouseLeftDown,CEGUI就會調用該Button上所有掛在這個消息上的回調函數。


--------------------------------------------------------------------------------

OK,首先請記住上面這個註冊回調流程,現在我們將在CPP文件中看到 在CEGUI中,如何在控件上註冊回調函數,從而使某個事件發生時,可以執行我們想要的邏輯。

我不是很習慣摘代碼來描述問題....但是爲了說明這個流程,我還是先摘一下把。

首先我們寫一個函數:

然後將這個函數註冊到 某個控件的事件監聽列表。

以下代碼分別在   一個按鈕的 EventClicked事件  和 一個Editbox 的EventTextAccepted事件 上註冊了剛纔我們寫的那個函數。

這樣的話,你在這個函數裏寫的東西,就會在發生相對應的事件時被調用。

   d_root->getChild(SubmitButtonID)->
        subscribeEvent(PushButton::EventClicked, Event::Subscriber(&DemoConsole::handleSubmit, this));

    d_root->getChild(EntryBoxID)->
        subscribeEvent(Editbox::EventTextAccepted, Event::Subscriber(&DemoConsole::handleSubmit, this));

這個就是註冊事件監聽函數的套路了。使用這個機制很簡單:寫函數→註冊到事件,但是至於爲什麼要這麼寫....一時半會我說不清楚....這個問題等我再次對本文進行修改的時候在這個地方補充進來.....首先就這樣用着吧。


--------------------------------------------------------------------------------

好了,現在我們知道如何通過控件響應事件。再回到 窗體佈局 和樣式配置的問題上來。

我想說的就是:大家看着改吧,沒什麼特別的。

最後留個作業:自己用LayoutEditor 搞個有editbox 和 button 的窗口,然後顯示它。
並且當Button按下時,用editbox裏的文字 來設置窗口的標題。

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/kun1234567/archive/2008/04/09/2270779.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章