2015-08-11 2 views
0

Я знаю, что этот вопрос задан раньше, но я не могу найти никаких хороших ответов. Я продолжаю спотыкаться о WindowButtonMotionFcn, но я действительно не понимаю, как его использовать. В моей программе я хочу иметь возможность щелкнуть и сохранить координаты ТОЛЬКО, когда пользователь находится над определенными осями, так что нормальная мышь появится для остальной части графического интерфейса, и они могут играть с другими кнопками. Спасибо за понимание.Как определить, находится ли мышь над осями, используя MATLAB GUIDE

ответ

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 

печатает координаты каждый раз, когда вы щелкаете внутри осей, но ничего не делает, когда вы щелкаете где-нибудь еще.

EDIT:

Поскольку это 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.

+0

Спасибо за помощь, так или иначе, вы могли бы немного объяснить этот код? Я потерян. Кроме того, в моем графическом интерфейсе у меня есть функция, которая получает координаты от кликов: спасибо за помощь, так или иначе, вы могли бы немного объяснить этот код? Я потерян. Кроме того, в моем графическом интерфейсе у меня есть функция, которая получает координаты от кликов: 'function clickerCall (handle) [handles.markedFrames (handles.markedIndex) .x, handleles.markedFrames (handles.markedIndex) .y] = getpts (handle. axes1) handles.markedIndex = handles.markedIndex + 1 disp ([handles.markedFrames.x]) updateAxes (handles); 'и он должен идеально работать только тогда, когда над осями, спасибо! – sam

+0

Кроме того, любая идея, как хранить данные из .IntersectionPoint в массив? Я пробовал что-то вроде x = eventData.IntersectionPoint (1) безрезультатно – sam

+0

Итак, я попробовал это: 'handles.output = hObject; handles.axesPos = get (handleles.axes1, 'Position'); handles.myaxes = axes (... 'Units', 'Normalized', ... 'Position', [handleles.axesPos], ... 'ButtonDownFcn', @myclick ... ); 'в попытке использовать эту функцию в моем графическом интерфейсе, но ее невосприимчивость к какой-либо идее? извините за тонну вопросов – sam

Смежные вопросы