我想在 Lua 中实现一个 GUI 消息处理系统,目前它的工作原理是这样的:
在 c++ 代码中,windows 有窗口过程,就像它们在 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);
这一切都在同一个脚本文件中,当我加载它时,它只会(据我所知)执行一次。因此,首先构建表,然后将表绑定到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);
}
}
因此,每当触发消息时,都会调用该表,并且每次都会返回一个函数,我猜。我假设这一点,因为即使我只加载脚本文件一次,当我调试脚本并在那里放置断点时,当调用动作对象时断点会被命中。
这是处理事情的好方法吗?