我的Lua小函数之创建iup菜单

写在前面:
下面的这段代码可以直接在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

后记,已经发布在了我的粘贴里,不过它上面说是根据时间访问来删除旧帖子的,我怕时间久了这点记忆再没有了

你可能感兴趣的:(我的Lua小函数之创建iup菜单)