Matlab缩放模式和按钮DOWNFCN

Matlab缩放模式和按钮DOWNFCN,matlab,Matlab,我正在MATLAB中构建gui。此gui有几个不同的轴对象。在其中一个轴中,我使用zoom工具(由地物工具栏激活)。在另一个Axis对象中,我已禁用缩放: setAllowAxesZoom(zoom_handle,axes_handle,false) …并绘制了一些可单击的对象: text(x,y,string,'buttondownfcn',{@func_handle, value}); 这一切都很好。。。当鼠标位于不可缩放的绘图中时,将显示一个普通箭头光标,如果单击或单击并拖动,则不会发

我正在
MATLAB
中构建gui。此gui有几个不同的
对象。在其中一个轴中,我使用
zoom
工具(由地物工具栏激活)。在另一个Axis对象中,我已禁用缩放:

setAllowAxesZoom(zoom_handle,axes_handle,false)
…并绘制了一些可单击的对象:

text(x,y,string,'buttondownfcn',{@func_handle, value});
这一切都很好。。。当鼠标位于不可缩放的绘图中时,将显示一个普通箭头光标,如果单击或单击并拖动,则不会发生缩放

然而!我希望能解决一个不方便的问题。我发现当缩放工具被激活时,点击文本对象不会触发
按钮downfcn
回调。现在我需要返回工具栏来切换缩放模式;我更愿意在不同的轴之间移动鼠标,并以编程方式激活相应的行为

解决这个问题的最佳方法是什么?当鼠标进入我的一个轴时,是否可以使用回调?如果是这样,我可以在该回调中打开缩放工具,并在相应的“离开事件”回调中再次关闭它。或者有没有办法在不可缩放的绘图上传播鼠标单击事件,以便找到要触发的适当回调?或者其他我没有考虑的可能性



编辑:这是我的工作。我已经发布了一个解决方案,但我也对其他解决方案感兴趣,这些解决方案可能在其他场景中工作得更好,更健壮,等等。

我一起开发了一些适合我的情况的解决方案;如果您想让它更通用、更健壮,您可以从类似的方式开始,但可以通过各种测试来获得更丰富的知识,例如,关于单击的对象是哪个轴的子对象,以及是否实际安装了回调,是否有额外参数等

无论如何,在我的特定情况下,我关心的单击对象是
text
对象,并且每个text对象都安装了一个回调函数,它只需要一个额外的参数

下面是启用缩放工具时允许我与这些文本对象交互的代码:

function result = zoomtest(handle,eventdata)
    result=false;
    if strcmp(get(handle,'type'),'text')
        callback=get(handle,'buttondownfcn');
        callback{1}(handle,eventdata,callback{2})
    end
end

set(zoom_handle,'buttondownfilter',@zoomtest)

好的是,这不会干扰缩放工具的正常工作,如果缩放工具未激活,也不会改变任何行为。

我意识到这是一个老问题,但您可以控制缩放工具的
状态。因此,您可以通过编程方式打开和关闭它,而无需将鼠标返回工具栏。您可以使用
overobj
来测试您是否在
轴上

我发布了一个相关问题的解决方案,该解决方案可以让旋转工具与
按钮DOWNFCN
一起工作。。。使用缩放工具的原理相同:

问题/答复

更新

好的,我将对这个具体案例展开并给出充分的答案:

在缩放模式下保持交互性的一个好方法是使用
按钮DownFilter
方法,如中所述:

在您的情况下,代码应该类似于:

function demo2
%
% Allow a text element to have its own 'ButtonDownFcn' callback.
% And taging it for interaction
text(x,y,string,'buttondownfcn',{@func_handle, value}, 'tag', 'DoNotIgnore');
%
h = zoom;
h.ButtonDownFilter = @mycallback;
h.Enable = 'on';
%
% mouse click on the text element
%
function [flag] = mycallback(obj,event_obj)
% If the tag of the object is 'DoNotIgnore', then return true.
objTag = obj.Tag;
if strcmpi(objTag,'DoNotIgnore')
   flag = true;
else
   flag = false;
end

请查看
hittest
属性,当激活缩放时,该属性可能已停用。然后,
按钮DOWNFCN
也将被禁用。@thewaywewalk感谢您的想法;结果是,即使在缩放模式下,
hittest
属性仍保持启用状态。如果你好奇的话,我已经为这个问题添加了一个有效的解决方案作为答案。虽然我这里的解决方案确实解决了这个问题,但我现在将保留这个问题“未回答”,以防有人提出更好/更干净/更健壮的解决方案!
function demo2
%
% Allow a text element to have its own 'ButtonDownFcn' callback.
% And taging it for interaction
text(x,y,string,'buttondownfcn',{@func_handle, value}, 'tag', 'DoNotIgnore');
%
h = zoom;
h.ButtonDownFilter = @mycallback;
h.Enable = 'on';
%
% mouse click on the text element
%
function [flag] = mycallback(obj,event_obj)
% If the tag of the object is 'DoNotIgnore', then return true.
objTag = obj.Tag;
if strcmpi(objTag,'DoNotIgnore')
   flag = true;
else
   flag = false;
end