CWDG论坛-专业魔兽插件's Archiver

cosin0002 发表于 2007-8-10 06:53

ComboBox [Component Without XML]

[b][color=Blue]不需要任何的XML文件,便可以如下代码所示,使用 ComboBox:[/color][/b]
[language=lua]local function comboCallBack(frm, sText)
        DEFAULT_CHAT_FRAME:AddMessage("ComboBox : ["..sText.."]");
end

local combo = createComboBox(frame, 20, -24, 135, 26, 6, comboCallBack);
comboboxRelayoutDropDownFrame(combo)

local combo2 = createComboBox(frame, 20 + 135, -24, 135, 26, 6, comboCallBack);
combo2.widget.strList = {[1] = "Aaaa",}

comboboxRelayoutDropDownFrame(combo2)
local combo3 = createComboBox(frame, 20 + 135, -200, 135, 26, 6, comboCallBack);
combo3.widget.strList = {
        [1] = "Aaaa",
        [2] = "Bbbb",
        [3] = "Cccc",
        [4] = "Dddd",
        [5] = "Eeee",
        [6] = "Ffff",
        [7] = "Gggg",
        [8] = "Hhhh",
        [9] = "Iiii",
        [10] = "Jjjj",
        [11] = "Kkkk",
}
comboboxRelayoutDropDownFrame(combo3)[/language]
[img]http://file.cwowaddon.com/addons/forumid_3/20070810_67d7c649374a37ce6ecfSjOxHY3ijnpg.jpg[/img] [img]http://file.cwowaddon.com/addons/forumid_3/20070810_07fbefa0e8687032c878na4qJut2Rj5C.jpg[/img] [img]http://file.cwowaddon.com/addons/forumid_3/20070810_3db212c1c021f44cd6f5l0sbExjY1zZr.jpg[/img] [img]http://file.cwowaddon.com/addons/forumid_3/20070810_763b1073e64afeff9618iNja7oUoNHQc.jpg[/img]
[b][color=Blue]将下面的代码保存至文件,在插件的 toc 文件中包括它,就可以轻松的使用 ComboBox[/color][/b]
[language=lua]-- Component ComboBox Code

local frmSingle = nil

local function DropDownFrame_OnClickItem()
        local rootFrm = this:GetParent():GetParent():GetParent()
        local sText = this:GetText()
        rootFrm.widget.edit:SetText(sText)
        if rootFrm.widget.funCallBack then
                rootFrm.widget.funCallBack(rootFrm, sText)
        end
end

local function createVScrollBar(parent)
        local frm = CreateFrame("Frame", nil, parent)
        frm:SetWidth(18)
        frm:SetPoint("TOPRIGHT", parent, "TOPRIGHT", 0, 0)
        frm:SetPoint("BOTTOM", parent, "BOTTOM", 0, 0)

        local silder = CreateFrame("Slider", nil, frm)
        silder:SetPoint("LEFT", frm, "LEFT", 0, 0)
        silder:SetPoint("RIGHT", frm, "RIGHT", 0, 0)
        silder:SetPoint("TOP", frm, "TOP", 0, -17)
        silder:SetPoint("BOTTOM", frm, "BOTTOM", 0, 17)
        silder:SetThumbTexture("Interface\\Buttons\\UI-ScrollBar-Knob")
        local texture = silder:GetThumbTexture()
        texture:SetTexCoord(7/32, 25/32, 7/32, 24/32)
        texture:SetWidth(18)
        texture:SetHeight(17)
        silder:SetMinMaxValues(1, 10)
        silder:SetValueStep(1)
        silder:SetValue(1)

        local btnScrollUp = CreateFrame("Button", nil, frm)
        btnScrollUp:SetWidth(32)
        btnScrollUp:SetHeight(32)
        btnScrollUp:SetPoint("TOP", frm, "TOP", 0, 7)
        btnScrollUp:SetNormalTexture("Interface\\Buttons\\UI-ScrollBar-ScrollUpButton-Up")
        btnScrollUp:SetPushedTexture("Interface\\Buttons\\UI-ScrollBar-ScrollUpButton-Down")
        btnScrollUp:SetDisabledTexture("Interface\\Buttons\\UI-ScrollBar-ScrollUpButton-Disabled")
        btnScrollUp:SetHighlightTexture("Interface\\Buttons\\UI-ScrollBar-ScrollUpButton-Highlight", "ADD")
        btnScrollUp:SetHitRectInsets(6, 7, 7, 8)

        local btnScrollDown = CreateFrame("Button", nil, frm)
        btnScrollDown:SetWidth(32)
        btnScrollDown:SetHeight(32)
        btnScrollDown:SetPoint("BOTTOM", frm, "BOTTOM", 0, -8)
        btnScrollDown:SetNormalTexture("Interface\\Buttons\\UI-ScrollBar-ScrollDownButton-Up")
        btnScrollDown:SetPushedTexture("Interface\\Buttons\\UI-ScrollBar-ScrollDownButton-Down")
        btnScrollDown:SetDisabledTexture("Interface\\Buttons\\UI-ScrollBar-ScrollDownButton-Disabled")
        btnScrollDown:SetHighlightTexture("Interface\\Buttons\\UI-ScrollBar-ScrollDownButton-Highlight", "ADD")
        btnScrollDown:SetHitRectInsets(6, 7, 7, 8)

        local widget = {
                frm = frm,
                silder = silder,
                btnScrollUp = btnScrollUp,
                btnScrollDown = btnScrollDown,
        }
        frm.widget = widget

        -- Event Handle
        btnScrollUp:SetScript("OnClick", function()
                local rootFrm = this:GetParent():GetParent():GetParent():GetParent()
                local silder = rootFrm.widget.dropdown.scrollBar.silder
                local iMin, iMax = silder:GetMinMaxValues()
                local iPos = silder:GetValue()
                if iPos > iMin then
                        silder:SetValue(iPos - 1)
                end
        end)

        btnScrollDown:SetScript("OnClick", function()
                local rootFrm = this:GetParent():GetParent():GetParent():GetParent()
                local silder = rootFrm.widget.dropdown.scrollBar.silder
                local iMin, iMax = silder:GetMinMaxValues()
                local iPos = silder:GetValue()
                if iPos < iMax then
                        silder:SetValue(iPos + 1)
                end
        end)

        silder:SetScript("OnValueChanged", function()
                local rootFrm = this:GetParent():GetParent():GetParent():GetParent()
                local btnItems = rootFrm.widget.dropdown.btnItems
                local i
                local iCount = table.getn(btnItems)
                rootFrm.widget.scrollTop = this:GetValue()
                for i = 1, iCount do
                        btnItems[ i ]:SetText(rootFrm.widget.strList[i + rootFrm.widget.scrollTop - 1])
                end
        end)

        return widget
end

local function createDropDownFrame(parent, offsetX, offsetY, width, dropCount)
        local height = dropCount * 26 + 8
        local frm = CreateFrame("ScrollFrame", nil, parent)
        frm:Hide()
        frm:SetWidth(width)
        frm:SetHeight(height)
        frm:SetPoint("TOPLEFT", parent, "TOPLEFT", offsetX, offsetY)
        frm:SetBackdrop({
                bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
                edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
                tile = true, tileSize = 16, edgeSize = 16,
                insets = {left = 4, right = 4, top = 4, bottom = 4}
        })
        frm:SetBackdropColor(0, 0, 0)

        local panel = CreateFrame("Frame", nil, frm)
        panel:SetPoint("TOPLEFT", frm, "TOPLEFT", 4, -4)
        panel:SetPoint("BOTTOMRIGHT", frm, "BOTTOMRIGHT", -4, 4)

        local scrollBar = createVScrollBar(panel)
        scrollBar.frm:Hide()

        local i, btn, btnFontString, texture
        local btnItems = {}
        for i = 1, dropCount do
                btn = CreateFrame("Button", nil, panel)
                btn:SetPoint("LEFT", panel, "LEFT", 0, 0)
                btn:SetPoint("RIGHT", scrollBar.frm, "LEFT", 0, 0)
                btn:SetPoint("TOP", panel, "TOP", 0, (i - 1) * -26)
                btn:SetHeight(26)
                btn:SetHighlightTexture("Interface\\BUTTONS\\UI-Common-MouseHilight", "ADD")
                texture = btn:GetHighlightTexture()
                texture:SetTexCoord(0.125,0.875,0.125,0.875)
                btnFontString = btn:CreateFontString(nil, "ARTWORK", "GameFontNormal")
                btn:SetFontString(btnFontString)
                btn:SetText("Button "..i)
                btn:Hide()
                btn:SetScript("OnClick", DropDownFrame_OnClickItem)
                btnItems[ i ] = btn
        end

        local widget = {
                frm = frm,
                panel = panel,
                scrollBar = scrollBar,
                btnItems = btnItems,
        }
        frm.widget = widget

        -- Event Handle
        --[[frm:SetScript("OnShow", function()
        end)]]

        return widget
end

local function createHScrollBar(parent)

end

function createComboBox(parent, offsetX, offsetY, width, height, dropCount, funOnClickItem)
        local frm = CreateFrame("Frame", nil, parent)
        frm:SetWidth(width)
        frm:SetHeight(height)
        frm:SetPoint("TOPLEFT", parent, "TOPLEFT", offsetX, offsetY)
        frm:SetBackdrop({
                bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
                edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
                tile = true, tileSize = 16, edgeSize = 16,
                insets = {left = 4, right = 4, top = 4, bottom = 4}
        })
        frm:SetBackdropColor(0, 0, 0)

        local panel = CreateFrame("Frame", nil, frm)
        panel:SetPoint("TOPLEFT", frm, "TOPLEFT", 4, -4)
        panel:SetPoint("BOTTOMRIGHT", frm, "BOTTOMRIGHT", -4, 4)

        local btnDropdown = CreateFrame("Button", nil, panel)
        btnDropdown:SetWidth(32)
        btnDropdown:SetHeight(32)
        btnDropdown:SetPoint("TOPRIGHT", panel, "TOPRIGHT", 7, 7)
        btnDropdown:SetNormalTexture("Interface\\Buttons\\UI-ScrollBar-ScrollDownButton-Up")
        btnDropdown:SetPushedTexture("Interface\\Buttons\\UI-ScrollBar-ScrollDownButton-Down")
        btnDropdown:SetDisabledTexture("Interface\\Buttons\\UI-ScrollBar-ScrollDownButton-Disabled")
        btnDropdown:SetHighlightTexture("Interface\\Buttons\\UI-ScrollBar-ScrollDownButton-Highlight", "ADD")
        btnDropdown:SetHitRectInsets(6, 7, 7, 8)

        local edit = CreateFrame("EditBox", nil, parent)
        edit:SetPoint("TOPLEFT", panel, "TOPLEFT", 0, 0)
        edit:SetPoint("RIGHT", btnDropdown, "LEFT", 6, 0)
        edit:SetPoint("BOTTOM", panel, "BOTTOM", 0, 0)
        edit:SetAutoFocus(false)
        edit:SetJustifyH("CENTER")
        edit:SetJustifyV("MIDDLE")
        edit:SetFontObject("GameFontNormalSmall")

        dropdown = createDropDownFrame(frm, 0, -26, width, dropCount)

        local widget = {
                frm = frm,
                panel = panel,
                btnDropdown = btnDropdown,
                edit = edit,
                dropdown = dropdown,

                root = true,
                dropCount = dropCount,
                scrollTop = 1,
                strList = {},
                funCallBack = funOnClickItem
        }
        frm.widget = widget

        -- Event Handle
        btnDropdown:SetScript("OnClick", function()
                local widget = this:GetParent():GetParent().widget
                if frmSingle ~= nil and frmSingle ~= widget.dropdown.frm then
                        frmSingle:Hide()
                        frmSingle = widget.dropdown.frm
                end
                if widget.dropdown.frm:IsShown() then
                        widget.dropdown.frm:Hide()
                        frmSingle = nil
                else
                        widget.dropdown.frm:Show()
                        frmSingle = widget.dropdown.frm
                end
        end)

        edit:SetScript("OnTabPressed", function() this:ClearFocus() end)
        edit:SetScript("OnEnterPressed", function() this:ClearFocus() end)
        edit:SetScript("OnEscapePressed", function() this:ClearFocus() end)
        edit:SetScript("OnEditFocusLost", function() this:HighlightText(0, 0) end)
        edit:SetScript("OnEditFocusGained", function() this:HighlightText() end)

        return frm
end

function comboboxRelayoutDropDownFrame(frm)
        local i
        local iStrCount = table.getn(frm.widget.strList)
        local iBtnCount = table.getn(frm.widget.dropdown.btnItems)
        local dropdown = frm.widget.dropdown
        if iStrCount == 0 then
                for i = 1, iBtnCount do
                        dropdown.btnItems[ i ]:Hide()
                end
                dropdown.frm:SetHeight(iBtnCount * 26 + 8)
                dropdown.scrollBar.silder:SetMinMaxValues(1, 1)
                dropdown.scrollBar.frm:Hide()
        elseif frm.widget.dropCount >= iStrCount then
                for i = 1, iStrCount do
                        dropdown.btnItems[ i ]:Show()
                        dropdown.btnItems[ i ]:SetText(frm.widget.strList[ i ])
                end
                dropdown.frm:SetHeight(iStrCount * 26 + 8)
                dropdown.scrollBar.silder:SetMinMaxValues(1, 1)
                dropdown.scrollBar.frm:Hide()
        else
                for i = 1, iBtnCount do
                        dropdown.btnItems[ i ]:Show()
                        dropdown.btnItems[ i ]:SetText(frm.widget.strList[ i ])
                end
                dropdown.frm:SetHeight(iBtnCount * 26 + 8)
                dropdown.scrollBar.silder:SetMinMaxValues(1, iStrCount - iBtnCount + 1)
                dropdown.scrollBar.frm:Show()
        end
        frm.widget.scrollTop = 1
        dropdown.scrollBar.silder:SetValueStep(1)
        dropdown.scrollBar.silder:SetValue(1)
end[/language]

kurapica 发表于 2007-8-10 11:20

很不错哦,比自带那个模板好很多了。

simonw 发表于 2007-8-10 12:41

好东西, 能做套控件集合就好了.

cosin0002 发表于 2007-8-10 15:53

[quote]原帖由 [i]simonw[/i] 于 2007-8-10 12:41 发表 [url=http://bbs.cwowaddon.com/redirect.php?goto=findpost&pid=12790&ptid=1314][img]http://bbs.cwowaddon.com/images/common/back.gif[/img][/url]
好东西, 能做套控件集合就好了. [/quote]
好多事情要做。。。有空了可能会做吧

jilingshu 发表于 2007-8-10 17:42

前天你弄了一晚上就为了这个?

cosin0002 发表于 2007-8-10 20:43

[quote]原帖由 [i]jilingshu[/i] 于 2007-8-10 17:42 发表 [url=http://bbs.cwowaddon.com/redirect.php?goto=findpost&pid=12836&ptid=1314][img]http://bbs.cwowaddon.com/images/common/back.gif[/img][/url]
前天你弄了一晚上就为了这个? [/quote]
最近就在弄这个。。。

月色狼影 发表于 2007-9-4 05:18

fr   数据库快跟我做....~  已经3个月了

cosin0002 发表于 2007-9-4 09:04

[quote]原帖由 [i]月色狼影[/i] 于 2007-9-4 05:18 发表 [url=http://bbs.cwowaddon.com/redirect.php?goto=findpost&pid=16549&ptid=1314][img]http://bbs.cwowaddon.com/images/common/back.gif[/img][/url]
fr   数据库快跟我做....~  已经3个月了 [/quote]
在搞 File 页的东西。。。把过滤搞完回头弄数据库的事情

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.