1

在这篇文章中,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))]);

但是,我无法posmytestfunction(). 有人可以帮忙吗?谢谢 !

4

1 回答 1

4

如果您没有使用 GUIDE,因此没有handles结构(见底部),您可以利用UserData图形的属性来传递任何信息:

set(gcf,'UserData',pos);

然后,您可以pos通过以下方式从其他任何地方访问:

pos = get(gcf,'UserData');

请参阅此 MathWorksUserData属性描述和此完整示例。从第一页开始:

所有的 GUI 组件,包括菜单和图形本身都有一个UserData属性。您可以将任何有效的 MATLAB 工作区值分配为UserData属性值,但一次只能存在一个值。

作为此限制的解决方法,您可以分配一个structto UserData,它具有存储在不同字段中的程序所需的所有属性。

我在上面的命令中遗漏的一个细节是图形/对象句柄(您可能实际上并不想使用gcf)。在mytestfunction你有它存储在f. 在回调中,您可以找到hObjectby 的父图形:

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);

请注意,处理事件的另一种方法是实现一个侦听器来响应单击事件,但WindowButtonDownFcn回调应该可以正常工作。


最初,我在考虑 GUIDE,您将拥有其中的handles结构。这是该handles结构的目的之一。将位置存储在 的字段中handles,并更新它:

 handles.pos = pos;          % store it
 guidata(hObject,handles);   % update handles in GUI

然后返回mytestfunction或任何其他回调需要访问,如果结构是最新的pos,您可以使用。handles.poshandles

于 2013-11-12T23:15:31.770 回答