• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            visualfc

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              42 隨筆 :: 0 文章 :: 119 評論 :: 0 Trackbacks

                 原創 visualfc

             
                 在LUA中進行GUI程序設計,可以選擇的GUI庫一般有wxLua和IupLua。wxLua具備典型的面向對象風格,功能相對強大。而IUP的LUA綁定則非常簡潔易用。本文主要介紹IupLua。
                IUPLUA目前穩定版本為2.7.1,最新版本為3.0beta1。
                IUP項目主頁為:http://sourceforge.net/projects/iup
                在IupLua程序設計中,主要使用表來設計應用程序界面,表的鍵值則為GUI部件的屬性,通過回調函數完成窗口消息的獲取。下面給出一個完整的例子。

             1require "iuplua"
             2
             3text_location = iup.text{expand="HORIZONTAL", id="text_location"}
             4btn_browse = iup.button{title="Browse", rastersize="x22",id="btn_browse"}
             5dlg = iup.dialog
             6{
             7    iup.vbox
             8    {
             9        iup.label{title="Location:"},
            10        iup.hbox
            11        {
            12            text_location,
            13            btn_browse
            14            ; margin="0x0"
            15        },
            16        iup.label{title="Text:"},
            17        iup.multiline{expand="YES"},
            18    }
            19    ;title="iuplua sample", size="200x100", margin="10x10"
            20}
            21
            22function btn_browse:action()
            23    local dlg = iup.filedlg{dialogtype="DIR"}
            24    dlg:popup()
            25    if dlg.status == "0" then
            26        text_location.value = dlg.value
            27    end
            28end
            29
            30dlg:show()
            31
            32iup.MainLoop()
            33
            上面的例子通過hbox和vbox進行界面的自動調整。程序很簡單,如下圖所示:

            其中22行的fuctnion btn_browse:action即為回調函數,相比wxLua的Bind方法,這種用法更為簡潔。
                 另外我們也可以看到在此程序中我們需要對text_location和btn_browse進行聲明,而后在dialog的box中進行引用,我們也可以使用類似HTML控制中的ID值來進行設計而無需事先聲明。如下:
             1require "iuplua"
             2require "iupid"
             3
             4dlg = iup.dialog
             5{
             6    iup.vbox
             7    {
             8        iup.label{title="Location:", id="ok"},
             9        iup.hbox
            10        {
            11            iup.text{expand="HORIZONTAL", id="text_location"},
            12            iup.button{title="Browse", rastersize="x22", id="btn_browse"}
            13            ; margin="0x0"
            14        },
            15        iup.label{title="Text:"},
            16        iup.multiline{expand="YES"},
            17    }
            18    ;title="iuplua sample", size="200x100", margin="10x10"
            19}
            20
            21function btn_browse:action()
            22    local dlg = iup.filedlg{dialogtype="DIR"}
            23    dlg:popup()
            24    if dlg.status == "0" then
            25        text_location.value = dlg.value
            26    end
            27end
            28
            29dlg:show()
            30
            31iup.MainLoop()
            32
            如上所示,使用id值的方式GUI設計代碼顯得更為一致。那么如何做到這一點呢,在LUA中實現起來很簡單,使用upvalue就可以做到。
             1function iup_id(func)
             2    return function(o)
             3        if o.id ~= nil then
             4            _G[o.id] = func(o)
             5            return _G[o.id]
             6        else
             7            return func(o)
             8        end
             9    end
            10end
            然后對所需部件進行聲明。
            --standard
            iup.button = iup_id(iup.button)
            iup.text = iup_id(iup.text)
            這樣就可以使用id的方式來直接引用GUI部件了,另外需要注意的是各個GUI部件要取不同的id值。
            下面給出了我寫的iupcd.lua的完整源代碼以供參考。
            require "iuplua"
            require "iupluacontrols"


            function iup_id(func)
                return function(o)
                    if o.id ~= nil then
                        _G[o.id] = func(o)
                        return _G[o.id]
                    elseif o.ID ~= nil then
                        _G[o.ID] = func(o)
                        return _G[o.ID]
                    else
                        return func(o)
                    end
                end
            end

            --standard
            iup.button = iup_id(iup.button)
            iup.canvas = iup_id(iup.canvas)
            iup.frame = iup_id(iup.frame)
            iup.multiline = iup_id(iup.multiline)
            iup.progressbar = iup_id(iup.progressbar)
            iup.spin = iup_id(iup.spin)
            iup.tabs = iup_id(iup.tabs)
            iup.val = iup_id(iup.val)
            iup.toggle = iup_id(iup.toggle)
            iup.radio = iup_id(iup.radio)
            iup.text = iup_id(iup.text)
            iup.list = iup_id(iup.list)
            iup.label = iup_id(iup.label)
            --dialog
            iup.dialog = iup_id(iup.dialog)
            iup.filedlg = iup_id(iup.filedlg)
            iup.messagedlg = iup_id(iup.messagedlg)
            iup.colordlg = iup_id(iup.colordlg)
            iup.fontdlg = iup_id(iup.fontdlg)
            iup.alarm = iup_id(iup.alarm)
            iup.getfile = iup_id(iup.getfile)
            iup.gettext = iup_id(iup.gettext)
            iup.listdialog = iup_id(iup.listdialog)
            iup.message = iup_id(iup.message)
            iup.scanf = iup_id(iup.scanf)
            iup.getcolor = iup_id(iup.getcolor)
            iup.getparam = iup_id(iup.getparam)
            --layout
            iup.fill = iup_id(iup.fill)
            iup.vbox = iup_id(iup.vbox)
            iup.hbox = iup_id(iup.hbox)
            iup.zbox = iup_id(iup.zbox)
            iup.cbox = iup_id(iup.cbox)
            iup.sbox = iup_id(iup.cbox)
            --additional
            iup.cells = iup_id(iup.cells)
            iup.colorbar = iup_id(iup.colorbar)
            iup.colorbrowser = iup_id(iup.colorbrowser)
            iup.dial = iup_id(iup.dial)
            iup.gauge = iup_id(iup.gauge)
            iup.tabs = iup_id(iup.tabs)
            iup.matrix = iup_id(iup.matrix)
            iup.tree = iup_id(iup.tree)
            iup.glcanvas = iup_id(iup.glcanvas)
            iup.pplot = iup_id(iup.pplot)
            iup.olecontrol = iup_id(iup.olecontrol)
            iup.speech = iup_id(iup.speech)
            posted on 2008-12-29 22:43 visualfc 閱讀(11269) 評論(4)  編輯 收藏 引用 所屬分類: LUA

            評論

            # re: 學習LUA,使用IUP進行GUI程序設計 2008-12-30 09:55 LOGOS
            不錯,最近正有使用lua做些工具的傾向,收獲一個新工具,不需要編譯的東西真是好東西啊

            回調函數的問題
            btn_brower:action,其實和wxLua.bind差不多
            只不過bind顯式的提供了不同的函數名綁定到signal的方法
            而action則隱含了這一點,如果換個寫法
            btn.action = function btn:ooxx() ... end
            和bind應該是無異的
              回復  更多評論
              

            # re: 學習LUA,使用IUP進行GUI程序設計[未登錄] 2008-12-30 12:50 visualfc
            @LOGOS
            個人比較喜歡iup的界面設計方式。wxLua通過
            dialog:Connect(ID_BROWSE, wx.wxEVT_COMMAND_BUTTON_CLICKED, OnBrowse)的Bind方式來實現,iup的方式相對更加lua化一些。:)

            Lua真是不錯呀,最近在用Lua重寫VisualFC的WTL向導,最終選定了iup來完成。
              回復  更多評論
              

            # re: 學習LUA,使用IUP進行GUI程序設計 2009-01-10 22:13 LOGOS
            哈哈,我也用上這個了
            確實非常容易上手
            我記錄id的方式是
            function ctrl_set.regist(name, ctrl )
            ctrl_set[name] = ctrl
            return ctrl
            end

            dlg = iup.dialog
            {
            ctrl_set.regist("myfrm",
            iup.frame{}),
            }

            用ctrl_set.myfrm引用即可  回復  更多評論
              

            # re: 學習LUA,使用IUP進行GUI程序設計 2009-12-14 23:14 kraft
            博主tekui有沒有試過,感覺有些像  回復  更多評論
              

            久久精品日日躁夜夜躁欧美| 狠狠久久综合伊人不卡| 亚洲AV无码久久精品色欲| 久久精品午夜一区二区福利| 久久亚洲高清观看| 色综合合久久天天给综看| 欧美熟妇另类久久久久久不卡 | 欧美亚洲国产精品久久高清| 亚洲av日韩精品久久久久久a| 久久国产精品一区二区| 久久这里都是精品| 9999国产精品欧美久久久久久| 亚洲国产精品综合久久网络| 韩国免费A级毛片久久| 欧美精品福利视频一区二区三区久久久精品 | 麻豆成人久久精品二区三区免费| 精品国产热久久久福利| 久久水蜜桃亚洲av无码精品麻豆| 欧美国产成人久久精品| 国内精品伊人久久久久av一坑 | 久久亚洲精品国产精品| 久久久久国产一区二区三区| 国产精品久久永久免费| 国内高清久久久久久| 欧美午夜精品久久久久久浪潮| 久久久九九有精品国产| 久久精品国产久精国产思思| 2019久久久高清456| 久久精品免费全国观看国产| 手机看片久久高清国产日韩| 亚洲国产二区三区久久| 99久久成人国产精品免费| 青青草原精品99久久精品66| 婷婷久久香蕉五月综合加勒比| 久久人人爽人人爽人人av东京热| 亚洲国产成人久久笫一页| 国内精品久久久久久久久电影网| 91麻豆精品国产91久久久久久| 91精品观看91久久久久久| 国产精品丝袜久久久久久不卡| 国内精品伊人久久久久影院对白|