2011-05-24 142 views
4

我創建了一個類,它爲建築物上的圖形添加了功能。此類爲WindowMouseMotion事件創建一個偵聽器;然而,爲了讓這個事件發生,我必須爲圖的WindowButtonMotionFcn屬性添加一個虛擬回調函數。我首先檢查這個屬性是否已經填充。如果不是,那麼我將它設置爲一個虛擬回調函數,它什麼都不做。是否可以在WindowButtonMotionFcn中使用多個回調?

而不是檢查屬性是否已經設置,我可以簡單地添加這個虛擬回調到任何現有的回調?回調屬性可以調用多個函數嗎?

編輯

當使用handle.listener方法來處理下面給出的WindowButtonMotionEvent事件,一定要使用eventdata.CurrentPoint訪問當前鼠標的位置。以這種方式處理WindowButtonMotionEvent事件之前,該圖的CurrentPoint屬性未得到更新。

回答

3

A related article可以在客人博客作者Matt Whitaker的Yair Altman的未記錄MATLAB博客上找到。你所暗指的是回調鏈,並從博客引用:

坦率地說,編寫代碼之前 ,處理回調 鏈接,我寧願自己捅在用叉子眼 !

幸運的是,該文章中似乎還有其他解決方案。使用從那裏發佈的代碼片段,我能夠得到一個函數來執行鼠標移動沒有必須設置'WindowButtonMotionFcn'。我添加一個監聽到當前圖像這樣:

myListener = handle.listener(gcf,'WindowButtonMotionEvent',... 
          @(hSource,eventData) disp('hello')); 

和消息hello當我移動在窗口將小鼠顯示。

+2

使用上述方法時,一定要使用'eventdata.CurrentPoint'來訪問當前的鼠標位置。以這種方式處理'WindowButtonMotionEvent'事件之前,該圖的'CurrentPoint'屬性沒有得到更新。 – 2011-05-25 19:12:18

+0

我不認爲這回答了這個問題,但解決了引發問題的問題。 – janh 2014-03-25 11:30:48

0

您可以通過cellfun和feval做到這一點,Mathworks公司網站作爲回答:http://www.mathworks.com/matlabcentral/answers/10664-multiple-callback-functions

obj = uicontrol(...,'style','popupmenu',... 
    'Callback', @(h,e)(cellfun(@(x)feval(x,h,e), ... 
    {@(h,e)this.myfunc(h), ... 
    @(h,e)this.myfunc2(h), ... 
    @(h,e)this.myfunc2(h)})) 

注意回調使用cellfun來評估每個處理程序設置爲一個匿名函數。

相關問題