事件结构-----鼠标消息的次序,消息链的终止和转发
扫描二维码
随时随地手机看文章
对于前面板和前面板上的控件,如果鼠标左键点击面板上的一个控件,控件肯定会发生mouse down事件,那么由于控件是位于面板上的,面板是否会发生mouse down事件那?如果发生mouse down事件,那么这个两个事件的先后次序如何?根据WINDOWS窗口过程处理来看,任何消息应该是主窗口先得到所有消息,然后派发到它上面的各个控件.LABVIEW是否也是这样处理的那?做个实验看一下.
看得出,面板先产生mouse down 然后图片控件才产生mouse down事件,验证上面的设想.
有的鼠标事件是连续发生的,比如mouse move事件,那mouse down ,mouse up,mouse enter,mouse leave是否是连续发生的事件吗?比如我的鼠标一直按下,那mouse down不断地发生吗?因为连续发生的事件极大地占用了系统资源,所以编程时要尽量避免.
大家看测试程序
测试结果:
可以得出结论:除了mouse move是连续产生事件之外,其它的都不是连续发生了.
下面的问题是:
既然任何针对控件的消息都是通过PANEL接收并转发的,那么我们能否截取这个消息,中断消息的传送或者重定向,比如本来是按钮A产生事件,我们人为地使按钮B产生事件那,我们研究一下.(VC中称为钩子)
仔细看上图,事件有的是有?有的没有,有?的表示该事件可以进行相应处理,来决定消息是否继续或者如何继续.
还是用上面的例子,我们先来添加PANEL的mouse down事件,并禁止它继续传送,那么PICTURE BOX还能产生响应鼠标按下的
事件吗?
从上图可以清楚地看到,当鼠标点击picture box时候,产生的是pane的mouse down?事件,无论是是pane还是上面的控件包括STOP按钮都不再产生mouse down事件,同时,其它的鼠标事件 mouse enter ,mouse leave都不受影响.
红色箭头处,我们给定常量TRUE,表示后面将忽略这个mouse down消息.
这样我们就做到了截取并终止消息的传送.
这个方法有很重要的用途,比如我们在测试或者控制中,禁止操作者用鼠标对画面进行操作,有三种方式
用API函数全面禁止,包括其他程序,隐藏或这发灰需要禁止的按钮(如果多了,就不现实了),而在程序自身禁止是比较合适的.上面的例子就全面禁止了对鼠标按下的响应,解决了这个问题.
能否重定向消息那,右面只有四个可用的选择:
DISARD:TRUE-->中断消息传送,FALSE-->继续.其它三个都是和键有关的,所以没有好的办法.
有一个折中的办法:对于每一个控件都有两个属性value 和value(signal),这两个属性的区别是当给Value(signal)一个值时,将产生value change事件,没有办法直接其它消息的重定向.