【问题标题】:Is it possible to use multiple callbacks in the WindowButtonMotionFcn?是否可以在 WindowButtonMotionFcn 中使用多个回调?
【发布时间】:2011-09-01 07:09:10
【问题描述】:

我创建了一个类,它为构造图添加了功能。此类为WindowMouseMotion 事件创建一个监听器;但是,要触发此事件,我必须为图形的 WindowButtonMotionFcn 属性添加一个虚拟回调函数。我首先检查此属性是否已被填充。如果不是,那么我将其设置为一个不执行任何操作的虚拟回调函数。

我可以简单地将这个虚拟回调添加到任何现有回调中,而不是检查属性是否已设置?回调属性可以调用多个函数吗?

编辑

当使用handle.listener 方法处理下面给出的WindowButtonMotionEvent 事件时,请务必使用eventdata.CurrentPoint 访问当前鼠标位置。在以这种方式处理WindowButtonMotionEvent 事件之前,图窗的CurrentPoint 属性不会更新。

【问题讨论】:

    标签: matlab user-interface callback event-handling


    【解决方案1】:

    A related article 可以在来自客座博主 Matt Whitaker 的 Yair Altman 的 Undocumented MATLAB 博客上找到。您所指的是回调链,并从博客中引用:

    坦率地说,写过代码 以前处理回调的 锁链,我宁愿戳自己 用叉子在眼睛里!

    幸运的是,在那篇文章中似乎有一个替代解决方案。使用那里发布的代码中的 sn-p,我能够获得一个函数以在鼠标移动时执行 ,而无需设置 'WindowButtonMotionFcn'。我向当前图形添加了一个监听器,如下所示:

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

    当我在窗口中移动鼠标时,会显示消息hello

    【讨论】:

    • 使用上述方法时,请务必使用eventdata.CurrentPoint 访问当前鼠标位置。在以这种方式处理WindowButtonMotionEvent 事件之前,图窗的CurrentPoint 属性不会更新。
    • 我不认为这回答了问题,但解决了提示问题的问题。
    【解决方案2】:

    您可以通过 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 来评估每个处理程序。

    【讨论】:

      猜你喜欢
      • 2019-10-17
      • 2020-12-15
      • 1970-01-01
      • 2021-05-27
      • 2018-10-21
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 2023-01-13
      相关资源
      最近更新 更多