我想在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);


这些全部在同一个脚本文件中,据我所知,在我加载该脚本文件时,该脚本文件仅执行一次。
因此,首先构造表,然后再将表绑定到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);
        }
    }


因此,我猜想,每当一条消息被触发时,该表就会被调用,并且每次都会返回一个函数。
我假设这样做是因为即使我只加载脚本文件一次,但在调试脚本并在其中放置断点时,调用动作对象时断点会被命中。

这是处理事情的好方法吗?

最佳答案

我假设您的问题是,是否每次访问表时都会分配一个新函数。答案是不。

请记住:Lua中的普通函数定义只是未命名函数创建的特殊情况。以下是相同的:

function SomeName() end

SomeName = function() end


该函数是在最初执行Lua源文件时创建的。就像您使用的表仅创建一次:最初执行Lua源文件时。如果您多次执行Lua源文件,那么表及其内容将被多次创建。

是的,您的代码中将包含许多功能。但是那有什么问题呢?除非您不停地创建函数或做同样的滥用行为,否则就没有“太多”之类的事情。 Lua没有确切的switch语句,因为Lua代码通常以这种方式进行操作。

简而言之:这对于Lua来说是完全正常的。

关于c++ - 这个脚本会导致很多很多的关闭吗?如果是,还有什么替代方法吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6560127/

10-14 16:31
查看更多