在这篇文章Matlab: How to get the current mouse position on a click by using callbacks中,它显示如下内容:
function mytestfunction()
f=figure;
set(f,'WindowButtonDownFcn',@mytestcallback)
function mytestcallback(hObject,~)
pos=get(hObject,'CurrentPoint');
disp(['You clicked X:',num2str(pos(1)),', Y:',num2str(pos(2))]);
但是,我无法获取pos
并在mytestfunction()
中使用它。
有人可以帮忙吗?谢谢!
答案 0 :(得分:4)
如果您没有使用GUIDE,因此没有handles
结构(参见下图),您可以利用图中的UserData
属性传递任何信息:
set(gcf,'UserData',pos);
然后您可以通过以下任何地方访问pos
pos = get(gcf,'UserData');
请参阅this MathWorks description of the UserData
property和this full example。从第一页开始:
所有GUI组件(包括菜单和图形本身)都具有
UserData
属性。您可以将任何有效的MATLAB工作空间值指定为UserData
属性的值,但一次只能存在一个值。
作为此限制的变通方法,您可以将struct
分配给UserData
,其中包含程序在不同字段中存储所需的所有属性。
我在上面的命令中遗漏的一个细节是图形/对象句柄(你可能实际上并不想使用gcf
)。在mytestfunction
中,您将其存储在f
中。在回调中,您可以找到hObject
的父图:
f = ancestor(hObject,'figure');
使用上述方法的一种方法是简单地等待UserData
属性中的更改:
function mytestfunction()
f=figure; set(f,'WindowButtonDownFcn',@mytestcallback)
maxPos=10; cnt=0;
while cnt<maxPos, waitfor(f,'UserData'); pos=get(gcf,'UserData'), cnt=cnt+1; end
function mytestcallback(hObject,~)
pos=get(hObject,'CurrentPoint');
set(ancestor(hObject,'figure'),'UserData',pos);
请注意,处理事件的另一种方法是实现a listener以响应点击事件,但WindowButtonDownFcn
回调应该可以正常工作。
最初,我在想GUIDE,你将拥有handles
结构。这是handles
结构的一个目的。将该职位存储在handles
字段中,并将其更新:
handles.pos = pos; % store it
guidata(hObject,handles); % update handles in GUI
然后返回mytestfunction
或其他任何需要访问pos
的回调,如果handles.pos
结构是最新的,您可以使用handles
。