基于form字符串解析创建窗口,并定制窗口的行为,使得创建窗口更简单化,设计者可以像写html网页那样编写form文件。文件使用xml格式,所以首先文件要符合xml格式标准。
程序会根据文件中的内容进行解析并创建相应的窗口,文件内容可分为两部分,定义窗口属性、编写lua功能脚本。
程序解析过程如下:
1.对文件或字符串进行解密,得到原始内容。
2.根据定义的窗口类型和属性解析并创建窗口控件,设置好属性,挂接好事件。
3.将文件中的脚本部分分离出来,加载执行。每次解析都会加载执行定义的所有的lua块,即使之前已经加载过。
内容须符合xml文件标准,根节点名必须为"form",对于根节点可指定一个默认父窗口,如果不指定,默认父窗口为游戏的根窗口(桌面)。默认父窗口值是一个窗口的文本描述,每个窗口都可以通过一个描述文本来指定,规则:描述文本是用窗口id拼接起来的,中间用逗号隔开,基于查找子窗口规则:逗号后面的id是逗号前面的id的子窗口。规定:根窗口(桌面)的描述文本是空串。
示例:假如id为"A"的窗口是桌面的子窗口,那么查找A窗口可以使用描述文本:",A"等价于"A"。假如id为"B"的窗口是A的子窗口,那么查找B窗口可以使用描述文本:",A,B"等价于"A,B"。
以下是每个窗口的属性和事件的定义:
通用标记wnd(所有的窗口都具有的属性和事件):
id [属性] 窗口的id,字符串,需要在父窗口范围内唯一,必须设定
x [属性] 窗口的x坐标位置,整型,默认为0
y [属性] 窗口的y坐标位置,整型,默认为0
w [属性] 窗口的宽度,整型,默认为0
h [属性] 窗口的高度,整型,默认为0
parent [属性] 父窗口的文本描述,字符串,如果指定,将当前窗口创建为指定窗口的子窗口,如果不指定,根据默认父窗口自动计算然后创建子窗口。
esc_close [属性] 窗口是否按下esc键关闭,布尔值,对于对话框窗口默认为true,其它窗口默认为false
drag [属性] 窗口是否鼠标左键可拖动,布尔值,对于对话框窗口默认为true,其它窗口默认为false
revmsg [属性] 窗口是否可接收消息,布尔值,若不可接收消息,则所有的鼠标键盘事件都不会处理,因此鼠标点上去会点穿。对于image、edit、richedit、static默认为false,其它窗口默认为true
enable [属性] 窗口是否可用,布尔值,默认为true
visible [属性] 窗口是否可见,布尔值,默认为true
param [属性] 用户自定义参数,整型。如果设置此值,在lua脚本中可用获取窗口自定义参数获取。默认为0
tip [属性] 简单的tips描述,字符串。默认为空串
tipex [属性] 复杂的tips描述,参见:Tips文本格式 ,字符串,默认为空串
scroll [属性] 是否是滚动窗口,布尔值,默认为false
OnInit [事件] 创建好此窗口的初始化事件,回调函数原型func(this,param)--this:窗口句柄 param:form文件字符串参数(由GenForm传入,比如:GenForm("精炼系统#1#2")此时param值为"1#2")。
OnLButtonDown [事件] 鼠标左键点下事件,回调函数原型func(this,param,x,y)--this:窗口句柄 param:可不关心 x:x坐标 y:y坐标
OnLButtonUp [事件] 鼠标左键弹起事件,回调函数原型func(this,param,x,y)--this:窗口句柄 param:可不关心 x:x坐标 y:y坐标
OnLButtonClick [事件] 鼠标左键点击事件,回调函数原型func(this,param,x,y)--this:窗口句柄 param:可不关心 x:x坐标 y:y坐标
OnLButtonDbClick [事件] 鼠标左键双击事件,回调函数原型func(this,param,x,y)--this:窗口句柄 param:可不关心 x:x坐标 y:y坐标
OnRButtonDown [事件] 鼠标右键点下事件,回调函数原型func(this,param,x,y)--this:窗口句柄 param:可不关心 x:x坐标 y:y坐标
OnRButtonUp [事件] 鼠标右键弹起事件,回调函数原型func(this,param,x,y)--this:窗口句柄 param:可不关心 x:x坐标 y:y坐标
OnRButtonClick [事件] 鼠标右键点击事件,回调函数原型func(this,param,x,y)--this:窗口句柄 param:可不关心 x:x坐标 y:y坐标
OnRButtonDbClick [事件] 鼠标右键双击事件,回调函数原型func(this,param,x,y)--this:窗口句柄 param:可不关心 x:x坐标 y:y坐标
OnMouseMove [事件] 鼠标移动事件,回调函数原型func(this,param,x,y)--this:窗口句柄 param:可不关心 x:x坐标 y:y坐标
OnMouseWheel [事件] 鼠标滑轮滑动事件,回调函数原型func(this,param)--this:窗口句柄 param:小于0向上滚动否则向下滚动
OnKeyDown [事件] 键盘按下事件,回调函数原型func(this,param)--this:窗口句柄 param:按下的键值
OnKeyUp [事件] 键盘弹起事件,回调函数原型func(this,param)--this:窗口句柄 param:按下的键值
OnMouseIn [事件] 鼠标进入此窗口事件,回调函数原型func(this)--this:窗口句柄
OnMouseOut [事件] 鼠标离开此窗口事件,回调函数原型func(this)--this:窗口句柄
OnVisible [事件] 可见状态发生变化事件,回调函数原型func(this,param)--this:窗口句柄 param:当前可见状态,1代表可见0代表隐藏
OnEnable [事件] 可用状态发生变化事件,回调函数原型func(this,param)--this:窗口句柄 param:当前可用状态,1代表可用0代表禁用
OnActive [事件] 激活状态发生变化事件,回调函数原型func(this,param)--this:窗口句柄 param:当前激活状态,1代表激活0代表未激活
OnMove [事件] 窗口位置发生变化事件,回调函数原型func(this)--this:窗口句柄
OnSizeChange [事件] 窗口大小发生变化事件,回调函数原型func(this)--this:窗口句柄
OnClose [事件] 窗口关闭事件,回调函数原型func(this)--this:窗口句柄
OnDestroy [事件] 窗口销毁事件,一个窗口被关闭,OnClose不一定会触发,但OnDestroy肯定会触发 ,回调函数原型func(this)--this:窗口句柄
OnTipsInit [事件] 加载Tips函数事件,回调函数原型func(this)--this:窗口句柄
对话框标记dialog
image [属性] 对话框的背景图片ID,整型,可以是单张图片,也可以是九张图片中间用逗号隔开(九宫格拼凑)。
color [属性] 背景图片的颜色,整型,默认是白色,参见:颜色字符串
fitsize [属性] 图片是否自动缩放,布尔值,如果为true,背景图片的大小根据所设定的窗口大小进行缩放,默认为false
close [属性] 是否具有关闭按钮,布尔值,默认为false
title [属性] 标题文字,字符串,可以通过设置窗口文字内容 动态修改,默认为空串
title_color [属性] 标题文字颜色,字符串,颜色字符串,可以通过设置窗口文字颜色 动态修改,默认为橙色
center [属性] 是否居中显示,布尔值,默认为false
savepos [属性] 是否保存对话框位置下次再打开时使用此位置,布尔值,默认为false。如果使用此标记,center标记将无效。
magic [属性] 面板打开或关闭时的动画,整型,默认为0
npc [属性] 关联npc的KeyName,字符串,默认无关联。如果该对话框与关联NPC距离超过9个逻辑格,则自动将该对话框关闭。
按钮标记button
image [属性] 按钮的图片ID,整型,默认为0
text [属性] 按钮上的文字内容,字符串,默认为空串
text_color [属性] 按钮上的文字颜色,整型,默认为白色,参见:颜色字符串
page_btn [属性] 是否是页签按钮,布尔值,默认为false
shine [属性] 是否有闪亮特效,布尔值,默认为false
复选框标记check
image [属性] 复选框的图片ID,整型,默认为0
text [属性] 复选框的文字内容,字符串,默认为空串
text_color [属性] 复选框的文字颜色,整型,默认为0,参见:颜色字符串
checked [属性] 复选框的选中初始化状态,布尔值,默认为false,非选中
auto_change [属性] 是否自动管理选中状态,布尔值,默认为true
OnCheckChange [事件] 选中状态发生变化事件,回调函数原型func(this)--this:窗口句柄
图片控件标记image
type [属性] 图片类型,字符串,分为四种:normal普通类型(image须对应单张图片ID),around九宫格类型(image须对应九张图片ID中间用逗号分隔),animate动画类型(image第一项是动画图片起始ID;第二项是播放速度,无此项默认100毫秒;第三项是动画的播放次数,无此项默认为0,代表不限制次数;第四项指定回调脚本函数,无此项默认为空串。每项用逗号隔开,详细参见:设置图片动画Ex ),flat平铺类型(image须对应单张图片ID),默认为normal类型
image [属性] 图片ID,根据上面的type类型而异
image_color [属性] 图片的颜色,整型,默认为白色,参见:颜色字符串
fitsize [属性] 是否自动缩放,布尔值,如果为true则图片会根据窗口大小自动缩放,默认为false
check_point [属性] 设置检查点是否在窗口内的规则,整型,0代表根据窗口大小规则 1代表根据窗口大小和点所在的图片像素是否透明,默认为0,一般情况下可不必关心此项属性
gray [属性] 是否灰色显示,布尔值,默认为false
编辑框标记edit
text [属性] 编辑框中的文字内容,字符串,默认为空串
text_color [属性] 编辑框中的文字颜色,整型,默认为白色,参见:颜色字符串
type [属性] 编辑框的类型,字符串,normal普通类型,password密码类型,number数字类型,默认为普通类型
canedit [属性] 是否可编辑,布尔值,默认为false
limit [属性] 设定最大输入文本长度,整型,默认无限制
align [属性] 设定编辑框文本的对齐方式,字符串,left左对齐,center居中,right右对齐(暂不支持),默认为左对齐
OnEditKeyEnter [事件] 按下回车事件,回调函数原型func(this)--this:窗口句柄
OnEditStrChange [事件] 编辑框内容发生变化事件,回调函数原型func(this)--this:窗口句柄
OnEditLBtnDown [事件] 鼠标左键点下事件,回调函数原型func(this,param,x,y)--this:窗口句柄 param:可不关心 x:x坐标 y:y坐标
OnEditMouseIn [事件] 鼠标进入事件,回调函数原型func(this)--this:窗口句柄
OnEditMouseOut [事件] 鼠标离开事件,回调函数原型func(this)--this:窗口句柄
OnEditKeyDown [事件] 键盘按下事件,回调函数原型func(this)--this:窗口句柄
OnEditKeyUp [事件] 键盘弹起事件,回调函数原型func(this)--this:窗口句柄
多功能编辑框richedit
text [属性] 编辑框中的文字内容,字符串,默认为空串
text_color [属性] 默认的文字颜色,整型,默认为白色,参见:颜色字符串
canedit [属性] 是否可编辑,布尔值,默认为false
font [属性] 默认字体名,参见字体,默认为system
align [属性] 设定编辑框文本的对齐方式,字符串,left左对齐,center居中,right右对齐(暂不支持),默认为左对齐
静态文本框static
text [属性] 编辑框中的文字内容,字符串,默认为空串
text_color [属性] 默认的文字颜色,整型,默认为白色,参见:颜色字符串
font [属性] 默认字体名,参见字体
物品框标记itemctrl
auto_manage [属性] 是否内存自动管理,布尔值,一般情况需要设置为true,默认为true
rbtn_use [属性] 鼠标右键是否可使用,布尔值,一般情况需要设置为false,默认为false
invalid [属性] 窗口中物品是否有效,布尔值,一般情况需设置为true,默认为true
count [属性] 物品框中初始状态物品的数量,整型,默认为1
is_bound [属性] 物品框中初始状态物品是否显示绑定,默认为false
init_item [属性] 物品框中初始状态要显示的物品,字符串或数字,若为字符串代表物品的KeyName,若为数字代表物品的模版ID
use_back [属性] 物品框是否使用背景格子,当使用大图标物品控件时此标记无效 。布尔值,默认为true
big_icon [属性] 物品框是否是大图标控件,布尔值,默认为false
offx [属性] 设置图标位置的水平偏移量,仅对大图标控件有效。整数,默认为0
offy [属性] 设置图标位置的水平偏移量,仅对大图标控件有效 。整数,默认为0
OnItemMoveIn [事件] 玩家操作物品进入此物品框事件,回调函数原型func(this, GUIData, DragIn, GUID, ItemId, KeyName, ItemPos, IsBound, Count)--this:窗口句柄 GUIData:参见GUIData句柄 DragIn:true代表鼠标拖动放进来false代表鼠标在包裹右键点击进入 GUID:物品的GUID ItemId:物品的模版ID KeyName:物品的KeyName ItemPos:物品的绝对位置 IsBound:物品是否绑定 Count:物品数量 如果该物品允许进入物品框请返回true,否则请返回false
OnItemCtrlDbClick [事件] 双击物品事件,回调函数原型func(this)--this:窗口句柄
组合框标记combobox
image [属性] 组合框右边下拉按钮的图片ID,整型,默认为0
fill_image [属性] 下拉背景图片ID,整型,默认为0
text [属性] 组合框中文本内容,字符串,默认为空串
text_color [属性] 组合框中文本颜色,整型,默认为白色,参见:颜色字符串
length [属性] 下拉框背景高度,整型,默认为150
content [属性] 下拉框文本内容,字符串,默认为空串。可以是多项,中间用分好隔开,每项由三个部分组成,文本内容(字符串)、唯一标识(整型)、文本颜色(颜色字符串,中间用逗号隔开。例如:文本[,id[,颜色]]; 其中第二项和第三项可以省略
OnComboStrChange [事件] 下拉框选择文字改变事件,回调函数原型func(this)--this:窗口句柄
举例:
设置VIP按钮为禁用灰色状态,则只需加载执行下面内容:
<form>
<button parent="GameMainInterface,LittleMap" id="Vip" enable="false" />
</form>
举例:
当点开VIP面板的时候同时打开包裹,则只需加载执行下面内容:
<form>
<button parent="GameMainInterface,LittleMap" id="Vip" OnLButtonClick="open" />
<script><![CDATA[
function open(this)
local pack_btn = GetWindow("GameMainInterface,GameMainBar,Pakage")
WndClick(pack_btn, nil)
end
]]></script>
</form>
举例:
修改VIP面板上的说明文字内容,并当VIP面板关闭的时候提交表单,则只需要加载执行下面内容:
<form default_parent="VipWnd">
<script><![CDATA[
function close(this)
UI:Lua_SubmitForm("文件名", "main", "玩家关闭VIP面板")
end
]]></script>
<richedit id="Desc" text="自定义的VIP面板描述内容" />
<dialog parent="" id="VipWnd" OnClose="close" />
</form>
举例:
创建一个新的对话框,里面有一个物品框,一个编辑框,一个按钮,物品框只接收"断空"武器,点击按钮,把物品的位置提交表单。标题为:断空换神器
<form>
<script><![CDATA[
function ItemIn(this, GUIData, DragIn, GUID, ItemId, KeyName, ItemPos, IsBound, Count)
if KeyName == "断空" then return true end
if DragIn then
MessageBox(0, "请放入断空物品")
end
return false
end
function Tijiao(this)
local Item = GetWindow(this, "parent,item")
local site = RDItemCtrlGetGUIDataPropByType(Item, nil, ITEMGUIDATA_ITEMPOS)
UI:Lua_SubmitForm("文件名", "main", tostring(site))
end
]]></script>
<dialog id="对话框1" x="220" y="20" w="500" h="300" image="1904400001,1904400002,1904400003,1904400004,1904400006,1904400005,1904400007,1904400008,1904400009" title="断空换神器" close="true" center="true" >
<richedit id="richeidt" x="50" y="100" w="400" h="100" text="#COLORCOLOR_BROWN#断空兑换神器啦!\n便宜啦快来看看。。。" />
<button id="button" x="220" y="250" w="50" h="50" image="1903400035" text="确 认" text_color="4288676000" OnLButtonClick="Tijiao" />
<itemctrl id="item" x="250" y="180" w="35" h="35" init_item="断空" count="0" OnItemMoveIn="ItemIn" />
</dialog>
</form>
现已将form的功能集成到NpcTalk中,NpcTalk还正常兼容之前的版本,如果要使用新功能,传过来的字符串须是xml格式,默认父窗口须指定为:"NpcTalk,Container",之前编辑框的内容须用text段来标记,例如:
<form default_parent="NpcTalk,Container">
<script>
<![CDATA[
function main2()
msg("点击事件")
end
function item_move_in(this, GUIData, DragIn, GUID, ItemId, KeyName, ItemPos, IsBound, Count)
if KeyName == "审判" then return true end
if DragIn then
msg("需要放入审判")
end
return false
end
]]>
</script>
<button id="对战" x="220" y="20" w="50" h="50" image="1903400035" text="确 认" text_color="4288676000" OnLButtonClick="main2" />
<itemctrl id="item" x="300" y="80" w="35" h="35" init_item="审判" count="0" is_bound="true" use_back="true" OnItemMoveIn="item_move_in" />
<edit id="edit" x="200" y="100" w="100" h="20" text="hello world!" />
<text>
<![CDATA[#COLORCOLOR_BROWN#483902警方扣留的时间里\nj飞机开绿灯赛季阿里\n\n\n\n分居两地撒酒疯\n\n\n\n飞机昆仑山大家来\n\n\n\n\n\n\n\n]]>
</text>
</form>