WoW插件 - 按住键时动态工具提示

我有一个工具提示,并希望在按住SHIFT键时显示更详细的信息。以下代码已经起作用:

function myAddonFrame_OnEnter(self)
    myAddon_GenerateTooltip(self)
end

function myAddonFrame_OnLeave(self)
    GameTooltip:Hide()
end

function myAddon_GenerateTooltip(self)
    GameTooltip:SetOwner(self or UIParent, "ANCHOR_LEFT")
    GameTooltip:SetText(“myAddon”, 0.7, 0, 1)
    GameTooltip:AddLine(" ", 1, 1, 1)
    if IsShiftKeyDown() then
        -- 如果按下SHIFT键,显示更多详细信息。
        GameTooltip:AddLine(“一些关于上帝和世界的详细信息。”,1, 1, 1)
        GameTooltip:AddLine(“更多可读的伟大内容。”,0.9, 0.8, 0.1, 1)
    else
        -- 基本信息在没有按键的情况下显示。
        GameTooltip:AddLine(“一些基本信息。”。1, 1, 1)
        GameTooltip:AddLine(" ", 1, 1, 1)
        GameTooltip:AddLine(“按住SHIFT以获取更多信息…”, 0.5, 0.5, 0.5)
    end
    GameTooltip:Show()
end

但是,这仅在鼠标悬停在myAddonFrame之前按住SHIFT键时才有效。即使释放SHIFT键,只要鼠标光标仍然停留在myAddonFrame上,它也会显示详细信息。但是我希望它是动态的!

我的问题是:

当鼠标光标停留在帧上时,如何使工具提示根据SHIFT键刷新自身?

我心中有一个像当我在WoW中悬停在一个物品上,只要我按住SHIFT键,那个物品就会与我当前所穿的物品进行比较。我想要这种效果,只是在同一个工具提示中。

我希望有人可以指引我正确的方向。我尝试使用[MODIFIER_STATE_CHANGED](http://wowprogramming.com/docs/events/MODIFIER_STATE_CHANGED)但是我没有让它起作用。

哦,当我们谈论工具提示时...这是个额外问题:

它们可以稍微格式化吗?加粗,斜体,字体大小,一行中单词的颜色变化等等。?我在[这里(wowprogramming.com)](http://wowprogramming.com/docs/widgets#gametooltip)没有找到任何特别的内容,但是可能我忽略了它。

** - - -已解决 - - - **

对于有兴趣解决问题的人:

我使用了Nathanyel的代码片段并进行了调整。因为我将一个XML文件用于所有帧,并且一个相应的LUA文件仅用于功能,因此我不想在那里创建一个新帧。但是我找到了一种方法来在现有的 'myAddonFrame'中使用动态工具提示。

我上面的代码完美地工作,我只需要添加以下内容:

-- [所有的代码以上!]

function myAddonFrame_OnLoad(frame)
    frame:RegisterEvent("MODIFIER_STATE_CHANGED")   -- 动态工具提示所需。
end

function myAddonFrame_OnEvent(frame, event, ...)
    -- 当按下任何键盘键时触发。
    local key, state = select(1, ...)
    if (event == "MODIFIER_STATE_CHANGED") then
        -- 当按住SHIFT键时切换动态提示。
        if myAddonFrame:IsMouseOver() and ((key == "LSHIFT") or (key == "RSHIFT")) then
            myAddon_GenerateTooltip(frame)
        end
    end
end

就这些!感谢Nathanyel的思路。 :)

点赞
用户2523387
用户2523387

那个事件确实是关键,但你需要将其注册到一个框架中,最好是被代码影响的框架,因此你应该为你的工具提示使用一个新的框架:

local myFrame = CreateFrame("GameTooltip","myFrame",UIParent,"GameTooltipTemplate")

myFrame:SetScript("OnEvent",function(self, event, arg, ...)
  if myFrame:IsShown()
  and event == "MODIFIER_STATE_CHANGED"
  and (arg = "LSHIFT" or arg = "RSHIFT") then
    myAddon_GenerateTooltip() -- 可能需要一个参数
  end
end

myFrame:RegisterEvent("MODIFIER_STATE_CHANGED")

当任意一个 Shift 键按下时,它会重新填充工具提示,你的函数可以根据按键的新状态做出反应。

餐巾代码,从我使用此方法的插件中复制了一些,因此可能不完美,但足以传达概念。

2016-11-04 13:25:01