六种不同的机械动作分为上下两组,上面三种布尔控件的值改变时刻之与鼠标的按下和释放有关,也就是说改变的时刻完全是由鼠标决定的。下面的一组则不同,改变的时刻是由鼠标和软件读取控件的时刻共同决定的。 m代表鼠标的动作,v代表值改变的时刻,RD代表软件读取的时刻,我们今天要讨论的布尔控件的机械动作和事件结构之间的关系,对于不同机械动作的含义不做详细分析。 一、单击时转换 第一行左数第一个图标,单击时转化,每次单击的时刻,就是布尔状态的改变时刻,与鼠标何时释放和软件是否读取布尔控件没有关系,我们常用的灯开关就是这种方式。 事件结构中,对于鼠标动作,提供多种事件,比如鼠标进入、鼠标离开,这两个事件并不影响布尔控件的动作。我们重点讨论鼠标按下、鼠标释放和值改变事件。 从图标可以推测出,次序应该是这样的,鼠标按下---》布尔值改变---》鼠标释放,我们可以验证一下,下面我们使用了NI公司最新的桌面跟踪工具包(Desktop Execution Trace Toolkit),通过这个工具包,很容易跟踪鼠标动作的次序。 上面的程序框图中,鼠标按下通知事件应该是最先发生的,通过通知事件可以决定鼠标消息是否需要进一步处理,看一下这几个事件的执行次序。 鼠标事件的相应次序是:鼠标按下--》值变化---》鼠标释放,使用单击时转换机械动作时,采用鼠标按下事件或者值变化事件处理布尔控件是最合适的,但是显然不应该使用鼠标释放事件来处理,因为鼠标释放的时刻由用户决定,与希望改变的时刻是不相符的。 二、释放时转换 第一行第二个图标,这种机械模式与单击时转换不同,值改变的时刻由鼠标抬起的时刻决定。 事件的产生次序是:鼠标按下---》鼠标释放---》值改变,所以这种方式的事件处理应该放在在鼠标释放或者值改变事件中。 三、保持转换直到释放 这种方式,在鼠标按下时改变布尔控件的值,在鼠标释放时恢复布尔控件的原来的状态,现实世界中,门铃就是这种工作方式,按下时工作,释放时停止。 事件次序为:鼠标按下--〉值改变---〉鼠标抬起---〉值改变,这种方式下,值的改变发生两次,而且发生的时刻完全不同,使用时要特别注意。 如果关心的是第一次值改变,必须使用鼠标按下事件或者使用值改变事件,使用值改变事件时,必须判断布尔控件的当前值,比如原来状体为FALSE,则必须判断是否为TRUE,在TRUE中处理事件。 如果关心的是恢复时的值改变,则必须使用鼠标释放事件或者值改变事件,使用值改变事件时,必须判断布尔控件的当前值,比如原来状态为FALSE,则必须判断是否为FALSE,并做相应的处理。 四、单击时触发 第二排的三中方式都直接涉及到何时软件读取布尔控件的问题。如果在布尔发生值改变时,软件没有读取控件的值,则布尔控件无法自动回复它的原来状态。 第二排左数第一个为单击时触发,在鼠标按下时发生值改变,一旦软件已经读取了布尔控件,则自动恢复到原来状态。 事件发生的次序是鼠标按下--》值改变---》鼠标抬起 读取布尔控件的最佳位置是放在值改变事件中,如果放在释放事件中,则只有鼠标释放时才能恢复原来状态。 五、释放时触发 这种方式与第四种方式类似,区别在于值改变是由鼠标释放触发的,因此事件发生的次序是:鼠标按下--》鼠标释放--》值改变,其中鼠标释放和值改变几乎是同时发生的,读取控件应该在值改变事件中。 六、保持触发直至释放 这种方式值改变发生了两次,分别是鼠标按下时和鼠标释放时。 读取控件可以放在鼠标释放或者值改变事件中,在第一次值改变后,鼠标未释放之前,并不影响布尔控件的当前状态,在鼠标释放再次读取,才会导致鼠标恢复。 由于发生了两次值改变事件,所以在值改变事件中应该判断布尔控件的当前值,以便做相应的处理。
|