寫在前面:
下面的這段代碼可以直接在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
后記,已經發布在了我的粘貼里,不過它上面說是根據時間訪問來刪除舊帖子的,我怕時間久了這點記憶再沒有了