0

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

setAllowAxesZoom(zoom_handle,axes_handle,false)

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

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

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

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

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


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

4

3 回答 3

1

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

于 2016-03-23T20:06:43.697 回答
0

我一起破解了一些适合我的情况的东西;如果您希望它更通用和更健壮,您可以类似地开始,但是通过各种测试来获得更多关于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)

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

于 2013-11-13T16:32:13.110 回答
-2

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

关于rotate3D和buttondownfcn不兼容的问题/解答

更新

好的,我将扩展并充分回答这个具体案例:

在缩放模式下保持交互性的一个好方法是使用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
于 2016-05-25T11:01:13.810 回答