看到一段代码,留个脚印

此代码是向一个frame添加一个按扭

--===========================================================================
-- 添加按扭
--===========================================================================
local MyButton = CreateFrame('Button')
MyButton:SetScript('OnEvent', function(self, event, ...) self[event](self, event, ...) end)

local function OnClick()
	ReloadUI()
    PlaySound("igMainMenuOption")
end


local function OnEnter(self)
	GameTooltip:SetOwner(self, 'ANCHOR_RIGHT')
	GameTooltip:AddLine("^_^")
	GameTooltip:Show()
end

function ReLoad_OnEnter(self)
	GameTooltip:SetOwner(self, 'ANCHOR_RIGHT')
	GameTooltip:AddLine("重载插件", 0, 1, 0)
	GameTooltip:Show()
end

local function OnLeave()
	GameTooltip:Hide()
end

function CreateButton(parent, width, height, point1, point2, point3)
	local f = CreateFrame('Button', nil, parent, 'UIPanelButtonTemplate')		
	
	f:SetWidth(width)
	f:SetHeight(height)
	f:SetPoint(point1, point2, point3)
	f:SetText("~_^", 0, 1, 0)
	f:SetScript('OnClick', OnClick)
	
	f:SetScript('OnEnter', OnEnter)
	f:SetScript('OnLeave', OnLeave)
	
	return f
end
function MyButton:PLAYER_LOGIN()
	MyButton:UnregisterEvent('PLAYER_LOGIN')
--	if IsAddOnLoaded('EN_UnitFrames') then
--	CreateButton(EUF_OptionFrame, 60, 20, 'CENTER', -30, -10)
	local mi = CreateFrame('Button', nil, EUF_OptionFrame, 'EUF_ButtonTemplate')
	mi:SetPoint('BOTTOM', -20, 20)
	mi:SetWidth(90)
	mi:SetHeight(24)
	mi:SetText("重 载")
	mi:SetScript("OnClick", function(self, ...)
--[[		ReloadUI()
		PlaySound("igMainMenuOption")]]
		mi:SetScript('OnClick', OnClick)
	end)
	
	mi:SetScript('OnEnter', ReLoad_OnEnter)		-- 等同于下面
	--[[mi:SetScript("OnEnter", function(self, ...)
		GameTooltip:SetOwner(self, 'ANCHOR_RIGHT')
		GameTooltip:AddLine("重新加载")
		GameTooltip:Show()
		ReLoad_OnEnter(self)		-- 这里要加参数 self 才有效
	end)]]
	mi:SetScript("OnLeave", function(self, ...)
		GameTooltip:Hide()
	end)
	
--	end
	MyButton:RegisterEvent('ADDON_LOADED')
end

MyButton:RegisterEvent('PLAYER_LOGIN')

  其实上面是一段 lua 代码,但是选择中没有 lua 选项,只有用 java代替了,效果如下:

 >>>>>>>>>>

 

 

 其实还有种方法是就是在 xml中加一段简单的代码:

 

<Button name="$parentRELOAD" inherits="EUF_ButtonTemplate" text="重载">
  <Anchors>
      <Anchor point="TOPRIGHT" relativeTo="$parentCONFIRM" relativePoint="TOPLEFT">
         <Offset>
             <AbsDimension x="-100" y="0"/>
         </Offset>
        </Anchor>
  </Anchors>
  <Scripts>	
    <OnClick>
      ReloadUI()
	 PlaySound("igMainMenuOption")
    </OnClick>
  </Scripts>	
</Button>

  效果和上面差不多。第一种方法中又有了两种方法建立一个按扭,一种是自己定义一个创建按扭的函数,然后建立一系统的函数,如鼠标移动按扭后鼠标提示函数,鼠标移开按扭后鼠标提示隐藏,按扭单击后的动作等等,这里的每一个函数都可以建多个自定义函数,如重载的鼠标提示函数:

function ReLoad_OnEnter(self) ...end

  又如 控制面板 的鼠标提示函数

function Option_OnEnter() ... end

  等等……,鼠标提示按扭的单击动作

function ReLoad_OnClick(self) ... end

  打开控制面板按扭的单击动作

function Option_OnClick(self) ... end

  鼠标离开按扭后的动作都一样,因此就只需要一个函数。

然后如果用 CreatButton 函数传入的参数有框体、建立按扭长、宽、坐标,而此函数里又有鼠标移到按扭及离开按扭和单击按扭的动作代码,也就是说用 CreatButton 建立的按扭动作全部都是一样的,但我们有时会有不同的鼠标提示和单击动作,因此我们就用第二种方法建立框体

local mi = CreateFrame('Button', nil, EUF_OptionFrame, 'EUF_ButtonTemplate')
  mi:SetPoint('BOTTOM', -20, 20)
  mi:SetWidth(90)
  mi:SetHeight(24)
  mi:SetText("重 载")

  鼠标的动作(鼠标移到按扭、单击)又有两种实现方法,一种是直接把代码写到下面,如下面

mi:SetScript("OnClick", function(self, ...)
    ReloadUI()
    PlaySound("igMainMenuOption")   -- 这里按键的声音
end)

  另一种方法是调用上面的 function ReLoad_OnClick(self) 函数

mi:SetScript("OnClick", function(self, ...)
    ReLoad_OnClick(self)
end)

  还有一种方法

mi:SetScript('OnClick', ReLoad_OnClick)

OnClick:为触发类型. 即事件触发. 常见的还有OnEnter OnLeave OnMouseDown OnUpdate OnEven,后面的 ReLoad_OnClick 是函数调用

今天是阴历12月28日,再过两天就过年了,该收拾收东西准备去宿舍了,先写到这里

今天回家了,在路上我就想一直想一个问题,为何创建一个按扭这么麻烦,之前也有试过,比如代码如下

mi = CreateFrame("Button", "mi", frame, "OptionsButtonTemplate");
	mi:SetPoint("CENTER", EUF_OptionFrame, "TOPRIGHT", -50, -40);
	mi:SetWidth(40)
	mi:SetHeight(25)
	mi:SetText("整理")

但是却没有效果,昨天晚上看了最上面那段代码后,突发奇想,是不是我上面的代码有问题,于是,我就随便写了两行代码

ReLoad_Button = CreateFrame("Button", "ReLoad_Button", EUF_OptionFrame, "EUF_ButtonTemplate");
ReLoad_Button:SetPoint("BOTTOM", 0, 0);	

 果然 按扭已经出来了,看来之前写的代码还是有问题,主要是 CreatFrame 里面的第三个参数,之前一直以为这里的第三个参数只是随便一个 frame,主要看后面的 SetPoint 位置,看来研究方向错了。然后调整下位置,加几行代码,灰常简单的代码,根本用不上最初的,不过最初的代码还是可以学习和借鉴滴

 

 

ReLoad_Button = CreateFrame("Button", "ReLoad_Button", EUF_OptionFrame, "EUF_ButtonTemplate");
ReLoad_Button:SetPoint("BOTTOM", 0, 20);	
ReLoad_Button:SetText("重 载")
-- 下面用三种方法实现三种动作之一:鼠标移到按扭上的提示,需要先自定义一个鼠标提示的函数
function ReLoad_OnEnter(self)
	GameTooltip:SetOwner(self, 'ANCHOR_RIGHT')
--	GameTooltip:AddDoubleLine("点击重新加载游戏", 0, 1, 0)
	GameTooltip:AddLine("点击重新加载游戏", 0, 1, 0)
	GameTooltip:Show()
end
-- 然后在下面的函数中再调用
ReLoad_Button:SetScript("OnEnter", function(self, ...)
	ReLoad_OnEnter(self)
end)
-- 下面用三种方法实现三种动作之二:鼠标移开按扭后的提示消息
ReLoad_Button:SetScript("OnLeave", function(self, ...)
	GameTooltip:Hide()
end)
-- 下面用三种方法实现三种动作之三:鼠标点击按扭后实现重载游戏,先自定义一个函数
function ReLoad_OnClick(self)
	ReloadUI()								-- 注意这里的大小写,正确写法是 ReloadUI(),而并非是 ReLoadUI()
	PlaySound("igMainMenuOption")
end
-- 然后直接调用上面的重载函数
ReLoad_Button:SetScript('OnClick', ReLoad_OnClick)

  

这是鼠标放到按扭有的提示

 

 鼠标离开按扭和重载的就不截图了,至此添加一个重载的工作完成了

posted @ 2020-01-22 21:58  人五人六  阅读(434)  评论(0)    收藏  举报