2013-11-12 5 views
1

В этом посте, Matlab: How to get the current mouse position on a click by using callbacks, он показывает что-то выглядит следующим образом:Как получить текущую позицию мыши с помощью щелчка. MATLAB

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(). может кто-нибудь помочь? Благодаря !

ответ

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 структура находится в актуальном состоянии.

+0

Вы могли бы дать простой пример? – tqjustc

+0

Ну, что вы хотите делать с 'pos' в' mytestfunction'? Тогда я могу привести пример. – chappjc

+0

Я понял это. Я использую это: set (f, 'WindowButtonDownFcn', 'pt = mytestcallback()'); Тогда pt - возвращаемое значение, в котором я нуждаюсь.но спасибо @chappjc – tqjustc

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