我正在MATLAB
建立一个gui。这个gui有几个不同的axes
个对象。在其中一个轴中,我使用zoom
工具(由图的工具栏激活)。在不同的轴对象中,我禁用了缩放:
setAllowAxesZoom(zoom_handle,axes_handle,false)
...并绘制了一些可点击的对象:
text(x,y,string,'buttondownfcn',{@func_handle, value});
这一切都很好......当鼠标位于不可缩放的绘图中时会显示正常的箭头光标,如果单击或单击并拖动则不会进行缩放。
然而!我希望解决一个不方便的问题。我发现当激活缩放工具时,单击文本对象不会触发buttondownfcn
回调。现在我需要返回工具栏来切换缩放模式;我宁愿只是在不同的轴之间移动鼠标,并以编程方式激活相应的行为。
解决这个问题的最佳方法是什么?当鼠标进入我的一个轴时,我可以使用回调吗?如果是这样,我可以打开该回调中的缩放工具,并在相应的“离开事件”回调中再次将其关闭。或者有没有办法在非缩放图上传播鼠标单击事件,以便找到适当的回调来触发?或者其他一些我不考虑的可能性?
编辑:我让这个工作了。我已经发布了一个解决方案,但也会对其他解决方案感兴趣,这些解决方案可能在其他方案中效果更好,更强大等等。
答案 0 :(得分:1)
我意识到这是一个老问题,但您可以控制缩放工具的State
。因此,您可以以编程方式打开和关闭它,而无需将鼠标返回到工具栏。您可以使用overobj
来测试您是否超过axes
。
答案 1 :(得分:0)
我一起攻击了一些适合我情况的东西;如果你想要它更通用和更强大你可以开始类似但是通过各种测试得到更好的关于例如,哪个axes
被点击的对象是孩子,以及是否实际上安装了回调,是否有额外的论据等。
无论如何,对于我的特定情况,我关心点击的对象是text
个对象,而每个文本对象都安装了一个回调,它只需要一个额外的参数 / em>的
以下代码允许我在启用缩放工具时与这些文本对象进行交互:
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)
好消息是,这不会影响缩放工具照常工作,如果缩放工具不活动,也不会改变任何行为。
答案 2 :(得分:-2)
我已经发布了一个相关问题的解决方案,让你让旋转工具与buttondownfcn
一起工作......使用缩放工具是相同的理念:
问题/答案rotate3D and buttondownfcn incompatibility
<强>更新强>
好的,我将扩展并填写这个具体案例的答案:
在缩放模式下保持交互性的一种好方法是使用Matlab's help中所述的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