目前觉得比较好的做法,C++写具体控件效果,lua处理事件响应
<EventList>
<Event Name="OnCreate" File="LogonWnd.xml.lua" Func="MSG_OnCreate"/>
</EventList>
self为事件源注册到lua中的类型事例。
迅雷界面库中还有另一种做法:
function OnInit()
直接在lua层处理事件,貌似更舒服了。但是所引用的函数不能是上层C的,也不能有self参数了,否则内存管理又是一大害处。
这里的AttachListener应该和上层的Wnd类或者对应的派发消息的CPP里边的《EventList》关联,貌似这样能动态添加消息处理器,而且不用担心对象生命周期管理。
![]()
<EventList>
<Event Name="OnCreate" File="LogonWnd.xml.lua" Func="MSG_OnCreate"/>
</EventList>
function MSG_OnCreate(self)
i = 0
print(self)
end
self为事件源注册到lua中的类型事例。
迅雷界面库中还有另一种做法:
function OnInit()
local owner = self:GetOwner()
local objFactory = XLGetObject("Xunlei.UIEngine.ObjectFactory")
local newIcon = objFactory:CreateUIObject("icon2","ImageObject")
local xarManager = XLGetObject("Xunlei.UIEngine.XARManager")
newIcon:SetResProvider(xarManager)
newIcon:SetObjPos(45,165,45+70,165+70)
newIcon:SetResID("app.icon2")
local function onClickIcon()
XLMessageBox("Don't touch me!")
end
newIcon:AttachListener("OnLButtonDown",true,onClickIcon)
self:AddChild(newIcon)
end直接在lua层处理事件,貌似更舒服了。但是所引用的函数不能是上层C的,也不能有self参数了,否则内存管理又是一大害处。
这里的AttachListener应该和上层的Wnd类或者对应的派发消息的CPP里边的《EventList》关联,貌似这样能动态添加消息处理器,而且不用担心对象生命周期管理。