如何使用MATLAB GUIDE确定鼠标是否在轴上

时间:2015-08-11 14:32:44

标签: matlab user-interface matlab-guide axes

我知道之前已经问过这个问题,但我找不到任何好的答案。我一直在WindowButtonMotionFcn绊倒,但我真的不明白如何使用它。在我的程序中,我希望能够仅在用户位于特定轴上方时单击并存储坐标,以便在GUI的其余部分显示正常鼠标,并且可以使用其他按钮进行播放。感谢您的任何见解。

1 个答案:

答案 0 :(得分:1)

我建议不要使用WindowButtonMotionFcn而是使用轴对象的ButtonDownFcn。这样MATLAB就可以为您完成命中检测。

例如:

function testcode()
h.myfig = figure;
h.myaxes = axes( ...
    'Parent', h.myfig, ...
    'Units', 'Normalized', ...
    'Position', [0.5 0.1 0.4 0.8], ...
    'ButtonDownFcn', @myclick ...
    );
end

function myclick(~, eventdata)
fprintf('X: %f Y: %f Z: %f\n', eventdata.IntersectionPoint);
% Insert data capture & storage here
end

每次在轴内单击时打印坐标,但在单击其他任何位置时不执行任何操作。

编辑:

由于这是一个GUIDE GUI,最简单的方法是利用getappdata在GUI周围传递数据。首先,您需要将GUI_OpeningFcn修改为以下内容:

function testgui_OpeningFcn(hObject, eventdata, handles, varargin)

% Choose default command line output for testgui
handles.output = hObject;

% Initialize axes click behavior and data storage
set(handles.axes1, 'ButtonDownFcn', {@clickdisplay, handles}); % Set the axes click handling to the clickdisplay function and pass the handles
mydata.clickcoordinates = []; % Initialize data array
setappdata(handles.figure1, 'mydata', mydata); % Save data array to main figure

% Update handles structure
guidata(hObject, handles);

然后在GUI的其他位置添加点击处理功能:

function clickdisplay(~, eventdata, handles)
mydata = getappdata(handles.figure1, 'mydata'); % Pull data from main figure
mydata.clickcoordinates = vertcat(mydata.clickcoordinates, eventdata.IntersectionPoint); % Add coordinates onto the end of existing array
setappdata(handles.figure1, 'mydata', mydata); % Save data back to main figure

然后,您可以使用相同的getappdata调用将数组拉入任何其他回调。