Matlab 为什么我的Axis对象的ButtonDownFcn回调在打印某些内容后停止工作?

Matlab 为什么我的Axis对象的ButtonDownFcn回调在打印某些内容后停止工作?,matlab,callback,plot,axes,Matlab,Callback,Plot,Axes,我正在图形中创建一组轴,并为其'ButtonDownFcn'属性分配回调,如下所示: HRaxes = axes('Parent', Figure, 'Position', [.05 .60 .9 .35],... 'XLimMode', 'manual', 'ButtonDownFcn', @HR_ButtonDown); 其中回调函数定义如下: function HR_ButtonDown(hObject, eventData) %# Do some stu

我正在图形中创建一组轴,并为其
'ButtonDownFcn'
属性分配回调,如下所示:

HRaxes = axes('Parent', Figure, 'Position', [.05 .60 .9 .35],...
              'XLimMode', 'manual', 'ButtonDownFcn', @HR_ButtonDown);
其中回调函数定义如下:

function HR_ButtonDown(hObject, eventData)
  %# Do some stuff here when the axes is clicked on...
end
回调工作正常,直到我在轴上绘制出如下内容:

plot(HRaxes, data.HR_X, data.HR_Y, 'b');

之后,当我单击轴时,回调不再触发。出了什么问题以及如何修复它?

这里的主要问题是该函数是一个高级打印函数,这意味着它将向打印添加对象并修改现有打印设置。如果查看,将看到它有三个设置,用于确定高级打印功能如何影响轴对象:

  • 添加
    -使用现有轴绘制图形对象

  • replace
    -将除
    位置
    以外的所有轴属性重置为默认值,并在显示图形之前删除所有轴子项(相当于
    cla Reset

  • replacechildren
    -删除所有子对象,但不重置轴属性(相当于
    cla

由于
'replace'
是默认设置,因此在调用时,为
'ButtonDownFcn'
回调设置的句柄将重置为零,从而关闭按钮单击行为。有两种方法可以避免这种情况:

  • 在调用之前,将轴的
    'NextPlot'
    属性设置为
    'add'
    (添加到现有打印对象)或
    'replacechildren'
    (替换现有打印对象但保留当前轴属性设置)

  • 使用不修改现有打印特性的较低级别打印例程(例如):

    HRaxes = axes('Parent', Figure, 'Position', [.05 .60 .9 .35],...
                  'XLimMode', 'manual', 'ButtonDownFcn', @HR_ButtonDown);
    line(data.HR_X, data.HR_Y, 'Parent', HRaxes, 'Color', 'b');
    

    • @David Snyder,请注意,
      图像
      对象也可以具有
      按钮downfcn
      回调属性。然后,在回调中,您可以通过
      父属性
      父属性
      函数访问相应的
      属性。例如,假设您希望在ButtonDownFcn回调中使用像素的位置和单击的按钮。 打印图像时,请使用

      imh = image(some_image);
      set(imh,'ButtonDownFcn',@position_and_button);
      
      在其他地方定义回调的位置

      function position_and_button(hObject,eventdata)
         Position = get( ancestor(hObject,'axes'), 'CurrentPoint' );
         Button = get( ancestor(hObject,'figure'), 'SelectionType' );
         %# do stuff with Position and Button
      

      不幸的是,这个解决方案并不能完全解决问题。即使正确定义了ButtonDownFcn,它也仅在单击不包含任何子对象(线、面片等)的轴区域时才起作用。如果意外单击子对象,该子对象将截获该操作,并且不会调用axes按钮DOWNFCN。例如,如果轴包含位图图像,则无法单击轴,因为它完全由子对象填充。我仍在寻找此问题的解决方案。@user945685:您可以通过将子对象(例如图像)中的“hittest”参数设置为“off”来解决此问题。
      function position_and_button(hObject,eventdata)
         Position = get( ancestor(hObject,'axes'), 'CurrentPoint' );
         Button = get( ancestor(hObject,'figure'), 'SelectionType' );
         %# do stuff with Position and Button