Можно ли использовать несколько обратных вызовов в WindowButtonMotionFcn? - PullRequest
4 голосов
/ 25 мая 2011

Я создал класс, который добавляет функциональность к фигуре на стройке.Этот класс создает прослушиватель для события WindowMouseMotion;однако, чтобы вызвать это событие, мне пришлось добавить фиктивную функцию обратного вызова для свойства WindowButtonMotionFcn фигуры.Сначала я проверяю, заполнено ли это свойство.Если это не так, я устанавливаю ее на фиктивную функцию обратного вызова, которая ничего не делает.

Вместо проверки, установлено ли свойство уже или нет, могу ли я просто добавить этот фиктивный обратный вызов к любым существующим обратным вызовам?Возможно ли для свойства обратного вызова вызывать несколько функций?

EDIT

При использовании подхода handle.listener для обработки события WindowButtonMotionEvent, указанного ниже, убедитесь, чтоиспользовать eventdata.CurrentPoint для доступа к текущей позиции мыши.Свойство CurrentPoint фигуры не обновляется до обработки события WindowButtonMotionEvent таким образом.

Ответы [ 2 ]

3 голосов
/ 25 мая 2011

Соответствующую статью можно найти в недокументированном блоге Яйра Альтмана MATLAB от приглашенного блогера Мэтта Уитакера. То, на что вы ссылаетесь, это обратная связь, цепочка и цитата из блога:

Честно говоря, написав код ранее это обрабатывает обратный вызов цепляясь, я предпочел бы тыкать себя в глаз вилкой!

К счастью, в этой статье есть альтернативное решение. Используя фрагмент из кода, размещенного там, я смог получить функцию для выполнения при перемещении мыши без необходимости устанавливать 'WindowButtonMotionFcn'. Я добавил слушателя к текущей фигуре так:

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

И сообщение hello отображалось, когда я перемещал мышь в окне.

0 голосов
/ 25 марта 2014

Вы можете сделать это через 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 для оценки каждого обработчика.

...