Lua で GUI メッセージ処理システムを実装したいのですが、現在は次のように機能します。
C++ コードでは、ウィンドウには Windows API にあるようなウィンドウ プロシージャがあり、Lua でもこれに頼ろうとしています。
したがって、私のウィンドウにはluabind::object
、次のようなテーブルを指す があります
local action = {
[on_uimsg.MOUSEMOVE] = function (ele, a,b,c)return on_mousemove(b,c) end,
[on_uimsg.MOUSEDOWN] = function (ele, a,b,c) return on_mousedown(ele,b) end,
[on_uimsg.LEAVE] = function (ele, a,b,c) return on_mouseleave(b,c) end,
}
表の鍵は GUI メッセージです。Ele はウィンドウのハンドル、a はメッセージ、b と c はパラメーターです。
local function on_mousemove(b,c)
ConsoleOut2("mousemove %i %i",b,c);
return 0;
end;
local function on_command(b,c)
ConsoleOut2("mousecmd %i %i",b,c);
return 1;
end;
いくつかの関数の例です。
次のようにオブジェクトにバインドされます。
parms.pos_x = 620;
parms.pos_y = 300;
parms.width = 100;
parms.height = 100;
parms.parent = DESKTOP;
parms.name = "Test";
parms.skin = "Default_outline";
parms.class = "BasicStaticText";
local window = hud:addWindow(parms,action);
これはすべて同じスクリプト ファイル内にあり、(私の知る限り) ロード時に 1 回だけ実行されます。したがって、最初にテーブルが構築され、後でテーブルが にバインドされますluabind:::object
。このオブジェクトは、次のように C++ で呼び出されます。
if (luabind::type(o)==LUA_TFUNCTION)
{
luabind::call_function<int>(o,handle,a,b,c);
}
else if (luabind::type(o)==LUA_TTABLE)
{
luabind::object call = o[a];
if (luabind::type(call)==LUA_TFUNCTION)
{
luabind::call_function<int>(call,handle,a,b,c);
}
}
したがって、メッセージが発生するたびにテーブルが呼び出され、毎回関数が返されると思います。スクリプト ファイルを 1 回だけロードしても、スクリプトをデバッグしてそこにブレークポイントを配置すると、アクション オブジェクトが呼び出されたときにブレークポイントがヒットするため、これを想定しています。
それは物事を処理する良い方法ですか?