新聞中心

EEPW首頁 > 測試測量 > 設計應用 > 事件結構-----鼠標消息的次序,消息鏈的終止和轉發(fā)

事件結構-----鼠標消息的次序,消息鏈的終止和轉發(fā)

作者: 時間:2017-01-09 來源:網絡 收藏
對于前面板和前面板上的控件,如果鼠標左鍵點擊面板上的一個控件,控件肯定會發(fā)生mouse down事件,那么由于控件是位于面板上的,面板是否會發(fā)生mouse down事件那?如果發(fā)生mouse down事件,那么這個兩個事件的先后次序如何?根據(jù)WINDOWS窗口過程處理來看,任何消息應該是主窗口先得到所有消息,然后派發(fā)到它上面的各個控件.LABVIEW是否也是這樣處理的那?做個實驗看一下.


本文引用地址:http://butianyuan.cn/article/201701/337208.htm

看得出,面板先產生mouse down 然后圖片控件才產生mouse down事件,驗證上面的設想.

有的鼠標事件是連續(xù)發(fā)生的,比如mouse move事件,那mouse down ,mouse up,mouse enter,mouse leave是否是連續(xù)發(fā)生的事件嗎?比如我的鼠標一直按下,那mouse down不斷地發(fā)生嗎?因為連續(xù)發(fā)生的事件極大地占用了系統(tǒng)資源,所以編程時要盡量避免.

大家看測試程序


測試結果:



可以得出結論:除了mouse move是連續(xù)產生事件之外,其它的都不是連續(xù)發(fā)生了.

下面的問題是:

既然任何針對控件的消息都是通過PANEL接收并轉發(fā)的,那么我們能否截取這個消息,中斷消息的傳送或者重定向,比如本來是按鈕A產生事件,我們人為地使按鈕B產生事件那,我們研究一下.(VC中稱為鉤子)


仔細看上圖,事件有的是有?有的沒有,有?的表示該事件可以進行相應處理,來決定消息是否繼續(xù)或者如何繼續(xù).

還是用上面的例子,我們先來添加PANEL的mouse down事件,并禁止它繼續(xù)傳送,那么PICTURE BOX還能產生響應鼠標按下的

事件嗎?


從上圖可以清楚地看到,當鼠標點擊picture box時候,產生的是pane的mouse down?事件,無論是是pane還是上面的控件包括STOP按鈕都不再產生mouse down事件,同時,其它的鼠標事件 mouse enter ,mouse leave都不受影響.


紅色箭頭處,我們給定常量TRUE,表示后面將忽略這個mouse down消息.

這樣我們就做到了截取并終止消息的傳送.

這個方法有很重要的用途,比如我們在測試或者控制中,禁止操作者用鼠標對畫面進行操作,有三種方式

用API函數(shù)全面禁止,包括其他程序,隱藏或這發(fā)灰需要禁止的按鈕(如果多了,就不現(xiàn)實了),而在程序自身禁止是比較合適的.上面的例子就全面禁止了對鼠標按下的響應,解決了這個問題.

能否重定向消息那,右面只有四個可用的選擇:

DISARD:TRUE-->中斷消息傳送,FALSE-->繼續(xù).其它三個都是和鍵有關的,所以沒有好的辦法.

有一個折中的辦法:對于每一個控件都有兩個屬性value 和value(signal),這兩個屬性的區(qū)別是當給Value(signal)一個值時,將產生value change事件,沒有辦法直接其它消息的重定向.







評論


技術專區(qū)

關閉