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

Posted on 2009-11-04 17:14 侠客西风 阅读(2977) 评论(7)  编辑 收藏 引用 所属分类: Lua

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

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

Feedback

# re: 我的Lua小函数之创建iup菜单  回复  更多评论   

2010-04-29 20:38 by liuyukuan
发现有个bug,菜单项M1被其子菜单项M13给覆盖了。出现了两个M13。

# re: 我的Lua小函数之创建iup菜单  回复  更多评论   

2010-09-08 14:56 by 博主
@liuyukuan
谢谢提醒,已经发现

有机会我把它修复好.

# re: 我的Lua小函数之创建iup菜单  回复  更多评论   

2010-09-08 15:43 by 侠客西风
代码虽然都是自己以前写的,但是现在竟然都忘的差不多了,一点都不熟悉了...

# re: 我的Lua小函数之创建iup菜单  回复  更多评论   

2012-07-22 01:58 by xx
@博主
m1_menu_title=table.remove(items)改成
local m1_menu_title=table.remove(items)即可
我QQ786647787

# re: 我的Lua小函数之创建iup菜单  回复  更多评论   

2012-09-19 00:54 by 好久都没有来过的博主
@xx

谢谢哦,呵呵,没想到你是今年7月份回复的,我都几年没来过这个博客了,
都不知道你是怎么找到这里的...

原来我2年前可能没有找到的bug是那个原因,lua的不加local就是全局变量...


时过境迁,不禁感慨一番啊,
两年过去了,我变了好多,但是托管在这里的这个免费博客却还依旧.

依稀还有人不知道怎么从搜索引擎过来,或许是他也在恰好搜索这些关键字.

# re: 我的Lua小函数之创建iup菜单  回复  更多评论   

2014-03-30 02:50 by 蓝澍
再说我么···我就是搜索来的,搜索iuplua,只因为我的luawindows例程里面的iup.dll找不到了,所以·······2年了啊

# re: 我的Lua小函数之创建iup菜单  回复  更多评论   

2014-05-02 13:26 by sleepers
博主有试过在osx上编译iup么,折腾一天了,还没编译好:(。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理