钩子示例:单选钮的互锁关系
有了HOOK钩子功能之后,我们就可以利用钩子在appbase中完成控件间的互调,从而完成一些特殊功能,比如单选纽;
单选纽是一个独立的控件,但同一页面间的单选钮却有一个互锁的关联关系,当一个单选纽被选中之后,同一页面的同一组单选钮就得被未选中,在以往没有HOOK的时候,就得在onchange事件中手工处理,有了HOOK之后,就可以在appbase中完成自动处理,以下是代码片段:
第一步:单选钮控件挂钩子
单选钮控件代码:
//单选钮控件增加一个group组的属性,约定group相同的单选钮有互锁关系
int group=1;#defattr(group,int,"同组互锁");
void create()
{
hook_add("radiowork","skinradio2","work"); //挂钩子到appbase中
}
在单选钮控件中挂钩子到appbase中,钩子名称(槽位)为radiowork;这样每个单选钮在create事件中都挂钩子到appbase中,appbase也就可以回调所以的单选钮控件
第二步:单选钮点击后
void onmouse(int t,int rn)
{ //在此书写有关热区处理方法的代码
echo("t="+t+"\r\n");
if (t==2){
if (val==0)
{ val=1;
onchange();
$radiogroup=group;
bind_set("radiotext",text);
callappbase("radiowork");
}
}
}
单选钮点击后,将当前控件的group组这个整数变量存在$radiogroup这个全局快捷变量中,将单选钮的标题存在radiotext这个全局bind变量中,并调用:app.radiowork();事件;
第三步:appbase回调
appbase控件中:
void radiowork(){
//控件间单选纽处理,$radiogroup 传入分组
hook_run("radiowork","*","*"); //回调所有radiowork名字的控件
}
在app.radiowork() 事件中,调用hook_run回调钩子,前面hook_add语句中我们可以看到 radiowork 槽位对应的是skinradio2.work()这个方法
第四步:控件内回调的方法函数
单选钮(skinradio2)的代码:
void work()
{ //钩子回调函数,用于判断同一group的选项互锁
if ($radiogroup==group){
//当前控件与选中控件一组
str name;
name=bind_get("radiotext");
if (text!=name){
val=0; //互锁,排除选中控件
}
}
}
appbase.radiowork()中回调所有单选钮控件的钩子函数,在其中只要是同一组且标题不同的单选钮统统val参数=0,即未选中