• <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>

            loop_in_codes

            低調(diào)做技術(shù)__歡迎移步我的獨(dú)立博客 codemaro.com 微博 kevinlynx

            讓wxListCtrl支持子item編輯

            我使用的wxLua版本信息為wxLua 2.8.7.0 built with wxWidgets 2.8.8,也就是LuaForWindows_v5.1.4-40.exe這個(gè)安裝包里自帶的wxLua。我不知道其他wxWidgets版本里wxListCtrl怎樣,但我使用的版本里wxListCtrl是不支持編輯里面的子item的。在我使用的report模式下,子item也就是特定某一行一列的item。

            google了一下,發(fā)現(xiàn)悲劇地需要自己實(shí)現(xiàn),主要就是自己顯示一個(gè)wxTextCtrl:

            --
            -- file: wxListCtrlTextEdit.lua
            -- author: Kevin Lynx
            -- date: 08.06.2012
            --
            local EditList = {}
            
            -- get the column by an abs point
            function EditList:getColumn(x)
                local cols = self.listctrl:GetColumnCount()
                local cx = 0
                for i = 0, cols - 1 do
                    local w = self.listctrl:GetColumnWidth(i)
                    if x <= cx + w then return i end
                    cx = cx + w
                end
                return -1
            end
            
            -- when a mouse down, show a text edit control 
            function EditList:onLeftDown(evt)
                if self.editor:IsShown() then
                    self:closeEditor()
                end
                local p = evt:GetPoint()
                local row = evt:GetIndex()
                local col = self:getColumn(p.x)
                local rect = wx.wxListCtrlEx.GetSubItemRect(self.listctrl, row, col)
                rect:SetHeight(rect:GetHeight() + 5) -- adjust
                self.editor:SetSize(rect)
                self.editor:Show()
                self.editor:SetValue(wx.wxListCtrlEx.GetItemText(self.listctrl, row, col))
                self.editor:SetFocus()
                self.col = col
                self.row = row
            end
            
            function EditList:closeEditor()
                if not self.editor:IsShown() then return end
                self.editor:Hide()
                self.listctrl:SetItem(self.row, self.col, self.editor:GetValue())
            end
            
            function EditList:initialize()
                self.editor = wx.wxTextCtrl(self.listctrl, wx.wxID_ANY, "", wx.wxDefaultPosition, wx.wxDefaultSize, wx.wxTE_PROCESS_ENTER + wx.wxTE_RICH2)
                self.editor:Connect(wx.wxEVT_COMMAND_TEXT_ENTER, function () self:closeEditor() end)
                -- not work actually
                self.editor:Connect(wx.wxEVT_COMMAND_KILL_FOCUS, function () self:closeEditor() end)
                self.editor:Hide()
            end
            
            function wx.wxListCtrlTextEdit(listctrl)
                local o = {
                    listctrl = listctrl,
                    editor = nil,
                }
                local editlist = newObject(o, EditList)
                editlist:initialize()
                listctrl:Connect(wx.wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK, function (evt) editlist:onLeftDown(evt) end)
                listctrl:Connect(wx.wxEVT_COMMAND_LIST_ITEM_FOCUSED, function () editlist:closeEditor() end)
                return listctrl
            end
            

            其原理就是獲取到當(dāng)前鼠標(biāo)點(diǎn)擊所在的子item位置,然后在此位置顯示一個(gè)wxEditCtrl即可。以上代碼需要依賴我之前寫的Lua里實(shí)現(xiàn)簡單的類-對象中的代碼,同時(shí)依賴以下針對wxListCtrl的擴(kuò)展接口:

            --
            -- file: wxListCtrlExtend.lua
            -- author: Kevin Lynx
            -- date: 08.07.2012
            -- brief: extend some util functions to wx.wxListCtrl
            -- 
            wx.wxListCtrlEx = {}
            
            function wx.wxListCtrlEx.GetSubItemRect(listctrl, item, col)
                local rect = wx.wxRect()
                listctrl:GetItemRect(item, rect)
                local x = 0
                local w = 0
                for i = 0, col do
                    w = listctrl:GetColumnWidth(i)
                    x = x + w
                end
                return wx.wxRect(x - w, rect:GetY(), w, rect:GetHeight())
            end
            
            function wx.wxListCtrlEx.GetItemText(listctrl, item, col)
                local info = wx.wxListItem()
                info:SetId(item)
                info:SetColumn(col)
                info:SetMask(wx.wxLIST_MASK_TEXT)
                listctrl:GetItem(info)
                return info:GetText()
            end
            

            在我看到的wxWidgets官方文檔里,其實(shí)wxListCtrl已經(jīng)有GetSubItemRect接口,并且在另一些示例代碼里,也看到了GetItemText接口,但是,我使用的版本里沒有,所以只好自己寫。基于以上,要使用這個(gè)可以支持編輯子item的wxListCtrl,可以:

            list = wx.wxListCtrlTextEdit(wx.wxListCtrl(dialog, wx.wxID_ANY, wx.wxDefaultPosition, wx.wxDefaultSize, wx.wxLC_REPORT))
            

            也就是通過wx.wxListCtrlTextEdit這個(gè)函數(shù)做下處理,這個(gè)函數(shù)返回的是本身的wxListCtrl。當(dāng)然更好的方式是使用繼承之類的方式,開發(fā)一種新的控件,但在Lua中,針對usedata類型的擴(kuò)展貌似只能這樣了。

            最好吐槽下,這個(gè)控件擴(kuò)展其實(shí)很惡心。本來我打算當(dāng)編輯控件失去焦點(diǎn)后就隱藏它,但是往編輯控件上注冊KILL_FOCUS事件始終不起作用;我又打算弄個(gè)ESC鍵盤事件去手動(dòng)取消,但顯然wxTextCtrl是不支持鍵盤事件的。好吧,湊合用了。

            posted on 2012-08-07 17:09 Kevin Lynx 閱讀(2973) 評論(0)  編輯 收藏 引用 所屬分類: luatips

            久久夜色tv网站| 久久久久一本毛久久久| 思思久久99热只有频精品66| 欧美激情精品久久久久久久九九九| 日韩亚洲欧美久久久www综合网 | 国内精品伊人久久久久| 亚洲一区二区三区日本久久九| 久久亚洲国产精品一区二区| 思思久久99热只有频精品66| 欧美一区二区三区久久综合| 国产精品欧美久久久久无广告| 久久综合伊人77777| 99久久国产热无码精品免费| 无码任你躁久久久久久久| 国产精品九九九久久九九| 中文国产成人精品久久亚洲精品AⅤ无码精品| 中文成人无码精品久久久不卡 | 色婷婷噜噜久久国产精品12p| 久久精品国产亚洲AV麻豆网站| 久久99精品久久久久久噜噜| 伊人久久大香线蕉综合影院首页| 大美女久久久久久j久久| 久久精品国产亚洲av麻豆色欲| 国产精品久久久久久五月尺| 99久久精品免费国产大片| 国产产无码乱码精品久久鸭 | 国内精品久久人妻互换| 亚洲国产成人精品91久久久 | 色噜噜狠狠先锋影音久久| 漂亮人妻被黑人久久精品| 亚洲愉拍99热成人精品热久久| 久久天天躁狠狠躁夜夜av浪潮| 性欧美大战久久久久久久久 | 无码国内精品久久人妻| 久久精品国产男包| 亚洲国产成人精品久久久国产成人一区二区三区综 | 狠狠色婷婷久久综合频道日韩 | 欧洲人妻丰满av无码久久不卡| 亚洲精品白浆高清久久久久久| 国产精品中文久久久久久久| 亚洲国产高清精品线久久 |