控件的事件详解

onmouse事件

//----onmouse方法,用户点击触摸屏上的热区,会调用此方法,其中:
//t:触摸模式: t=0 按下鼠标按钮,相当于触摸屏点击 ;t=2鼠标抬起
//rn:热区编号,允许一个控件对应多个热区,多个热区靠rn变量识别,对于按钮等整个控件一个热区,可以忽视rn
void onmouse(int t,int rn)
{   //在此书写有关热区处理方法的代码
}

onmouse事件是针对触摸屏操作的事件,该事件需要先设置热区,对于控件设置热区有两种模式

第一种热区设置模式,全区域模式

将控件属性status的b15 设置为1,也可以使用界面:

此时,如果触摸屏被触摸,系统会自动调用 onmouse(0 or 2,0);

第二种热区设置模式,多区域模式

在控件的create方法中,可以调用 addhotarea 语句来进行多区域的热区设置

void create(){
    addhotarea(x1,y1,x1+(x2-x1)/2,y2,1,32);//设置左边的热区
    addhotarea(x1,y1,x2-(x2-x1)/2,y2,2,32);//设置右边的热区
}

在create事件中设置了两个热区,当左边的热区被按下的时候,系统会自动调用onmouse(1,1);松开的时候,会调用onmouse(2,1); 当右边的热区被按下的时候,系统会自动调用onmouse(1,2);松开的时候,会调用onmouse(2,2);

另外,如果需要获取触摸坐标,自行处理热区识别,可以调用getsysval 语句获取触摸坐标。

onmove事件

在控件的status的b30~b24(拖拽栅格大小)设置,也可以使用界面设置status的属性值,触摸按下后,先会产生onmouse的按下事件,然后当触摸点移动超过栅格后,会自动触发onmove事件,最后松开触摸会产生onmouse的松开事件;

例:滑块的onmove事件(只处理了横向滑块)

void onmove(int x,int y,int dx,int dy){
    //x,y 当前鼠标位置  dx,dy是触摸落笔位置
    val=oval+(x-dx)*100/(x2-x1-w-4);
    if (val<0) val=0;
    if (val>100) val=100;
    onchange();
}

ontimer事件

在控件的status的b23~b16 定时器默认值,如果设置非0,则自动启动了定时器,比如设置为100,则100*10ms=1秒调用一次ontimer事件;在ontimer事件中,可以使用settimer 函数调整定时值,调整到0则关闭定时器;

//----ontimer方法:status中设置的定时器会调用此方法
//当本控件有属性数值发生变化后,系统会自动调用show方法显示,定时器代码中无需操作界面
void ontimer()
{   //在此书写有关定期器对数据的修改代码
    if (ts>0) ts--;
}