Lua訊息處理入門

2021-05-22 00:57:17 字數 2230 閱讀 9084

lua訊息處理入門

把gui的訊息處理從**中分離出來,並交給lua指令碼處理,這樣可以給你的介面帶來很大的靈活性.gui

的相關地東西可以在測試期間很輕鬆的修改.

lua中的負責處理訊息的東西其實只不過是普普通通的只帶乙個引數的lua函式而已.若想用它作事件

處理函式,你必須先在系統中註冊它.所以除非你在初始化指令碼中載入他們,你必須在處理相應事件之前

載入相關指令碼檔案.

載入指令碼檔案

有2種載入指令碼檔案的方法:使用c++**或者在初始化指令碼中使用lua**,由於lua函式和相應的c++

函式一一對應,這2種方法看起來很像.

cegui::system::executescriptfile(const cegui::string &filename,const cegui::string& resourcegroup="");

顯然這個函式有兩個引數:檔名和資源組。大多數情況下,可以不用管最後乙個引數。

通過cegui指定的lua指令碼模組呼叫此函式就可以執行指定的lua指令碼檔案。這意味著:你的程式可以訪問指令碼中檔案定義的函式等所有東西了,當然,被定義為區域性範圍的除外。

例如,用c++可以這麼寫:

cegui::system::getsingleton().executescriptfile("../datafiles/scripts/guiscript.lua");

如果有錯誤產生,它會丟擲乙個異常。

用lua可以這麼寫:

cegui.system:getsingleton():executescriptfile("../datafiles/scripts/guiscript.lua")

指令碼檔案中的全域性**也將被執行,所以要注意對每次執行進行必要的處理(使用乙個計數器fx)。

註冊事件到lua函式

既然我們已經載入了指令碼檔案,下一步就可以繫結事件到指令碼處理函式上了.

繫結lua函式的函式與繫結c++函式的函式名稱不同。

event::connection subscribescriptedevent(const string& name,   

const string& subscriber_name);

引數name是你要繫結的事件。引數subscriber_name為處理此事件的lua函式的函式名。

呼叫完此函式後,指定的lua函式就將成為那個事件的處理函式。而且它執行起來和c++版本的函式幾乎一模一樣(當然,不同的是:它是lua指令碼)。

如下是繫結pushbutton單擊事件到乙個lua函式上的**片段:

cegui::pushbutton* pb = (cegui::pushbutton*)cegui::windowmanager::getsingleton().createwindow("taharezlook/button","lua_powered_button");  

pb->setsize(cegui::size(0.1f,0.1f));  

pb->setposition(cegui::point(0.1f,0.1f));  

pb->subscribescriptedevent("clicked","luabtn_clicked");  

cegui::system::getsingleton().getguisheet()->addchildwindow(pb);

這段**將建立乙個簡單的taharezlook按鈕,把它的clicked事件繫結到lua函式luabtn_clicked中,然後把它新增到當前的gui。

現在,我們看一下那個lua事件處理函式:

function luabtn_clicked(e)  

local we = cegui.towindoweventargs(e)  

we.window:settext("handled from lua");  

end

它使得當按鈕被按下時,它的文字會變成「handled from lua」。

我們使用了乙個公用的函式:

cegui.towindoweventargs(e)

從它的名字可以看出:它把eventargs引數轉換為windoweventargs型別。其他的eventargs型別也有類似的轉換函式。

在layout檔案中註冊lua事件處理函式

在layout檔案中繫結用lua寫的事件處理函式是很簡單的。看下這個例子吧:

<?xml version="1.0"?>  

這個簡單的layout檔案所做的事和上面的c++**是一樣的。

cegui 8 Lua訊息處理入門

cegui 8 lua訊息處理入門 把gui的訊息處理從 中分離出來,並交給lua指令碼處理,這樣可以給你的介面帶來很大的靈活性.gui 的相關地東西可以在測試期間很輕鬆的修改.lua中的負責處理訊息的東西其實只不過是普普通通的只帶乙個引數的lua函式而已.若想用它作事件 處理函式,你必須先在系統中...

windows程式與vc訊息處理入門概念

while getmessage msg,winmain函式中的迴圈,整個應用程式生存期由getmessage的返回值決定,當其返回0 即wm quit訊息 即結束應用程式。視窗的生成由主函式中呼叫createwindow api函式實現 關閉視窗產生wm close由defwindowproc清除...

C 異常處理入門

先看如下 void test02 當你在main 中呼叫test02 時,很明顯會出現如下錯誤 因為除數不能為0,所以執行a b時就會引發錯誤,然後程式就自動停止了。有無錯誤就停止,這到沒什麼,關鍵是這種使用者體驗不是很好,你想一下,當程式執行好好的時候,遇到錯誤,就彈出這麼乙個視窗,然後程式就終止...