控件的事件详解
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--;
}