写在前面:
下面的这段代码可以直接在LuaForWindows的Scite中运行,这个函数的是仿照LuaForWindows自带教程中的那个创建iup菜单的函数写的,改进的一个地方是可以用一个消息处理回调函数来响应多个菜单项,然后再统一dispatch,个人认为写法上比直接把进行实际处理的函数写在菜单定义表前面美观一些,
说来惭愧,就改写的这个小函数,也是调试了一大会才弄好的,刚接触Lua的时候,就是不熟练啊...(废话? !)
require 'cdlua'
require 'iuplua'
require 'iupluacd'
function event_handler_g (self)
iup.Message(self.title,'dispatch message')
end
function event_handler1 (self)
iup.Message(self.title,'event 1 dispatch message')
end
function event_handler2 (self)
iup.Message(self.title,'event 2 dispatch message')
end
function event_handler3 (self)
iup.Message(self.title,'event 3 dispatch message')
end
my_menu_test =
{
nil,'M1',{event_handler_g,'M11','M12','M13',{event_handler3,'M21','M22',},},'M2',{event_handler_g,'M22','M23',},
}
function my_create_menu2(menu_define_table)
local items={}
for k,v in pairs(menu_define_table) do
if type(v) == 'function' or type(v)=='nil' then
--~ event_handler=v
___my_library__global__event_handler=v
end
if type(v) =='string' then
--~ local item=iup.item{title=v,action=event_handler}
local item=iup.item{title=v,action=___my_library__global__event_handler}
table.insert(items,item)
end
if type(v) =='table' then
m1_menu_title=table.remove(items)
local item=iup.submenu {my_create_menu2(v),title=tostring(m1_menu_title.title)}
table.insert(items,item)
end
end--end of for
return iup.menu(items)
end
my_main_frame=iup.frame
{
iup.canvas
{
cursor='CROSS',
scrollbar='VERTICAL',
posy=0.0,
ymax=0.8,
}
}
dlg = iup.dialog
{
my_main_frame,
size="HALFxHALF",
title="finally I got the expected result",
menu=my_create_menu2(my_menu_test),
}
dlg:showxy(iup.CENTER,iup.CENTER)
if (not iup.MainLoopLevel or iup.MainLoopLevel()==0) then
iup.MainLoop()
end
后记,已经发布在了我的粘贴里,不过它上面说是根据时间访问来删除旧帖子的,我怕时间久了这点记忆再没有了