钩子示例:单选钮的互锁关系

有了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,即未选中