Matlab 缩放模式和 buttondownfcn



我正在MATLAB中构建一个 gui . 此 gui 有几个不同的axes对象。在其中一个轴中,我使用zoom工具(由图形的工具栏激活)。 在不同的轴对象中,我禁用了缩放:

setAllowAxesZoom(zoom_handle,axes_handle,false)

。并绘制了一些可点击的对象:

text(x,y,string,'buttondownfcn',{@func_handle, value});

这一切都很好用...当鼠标处于不可缩放的绘图中时,将显示正常的箭头光标,如果我单击或单击并拖动,则不会发生缩放。

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

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


编辑:我让这个工作。我已经发布了一个解决方案,但也会对其他解决方案感兴趣,这些解决方案在其他场景中可能效果更好,更强大等。

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

我一起破解了一些适合我的情况的东西; 如果您希望它更通用和健壮,您可以从类似的开始,但通过各种测试变得更漂亮,例如,点击的对象是哪个axes子对象,以及是否实际上安装了回调,它是否有额外的参数, 等。

无论如何,对于我的具体情况,我关心点击的对象是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)

好消息是,这不会干扰缩放工具照常工作,也不会在缩放工具未激活时更改任何内容的行为。

我已经发布了一个相关问题的解决方案,让您让旋转工具与buttondownfcn一起工作......使用缩放工具是相同的理念:

问题/答案 旋转3D 和按钮向下fcn 不兼容

更新

好的,我将扩展并充分回答这个特定情况:

在缩放模式下保持交互性的好方法是使用 Matlab 帮助中所述的 ButtonDownFilter 方法:

function demo
% Allow a line to have its own 'ButtonDownFcn' callback.
hLine = plot(rand(1,10));
hLine.ButtonDownFcn = 'disp(''This executes'')';
hLine.Tag = 'DoNotIgnore';
h = zoom;
h.ButtonDownFilter = @mycallback;
h.Enable = 'on';
% mouse click on the line
%
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

在您的情况下,代码应该是这样的:

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

最新更新