Проблема WindowButtonUpFcn: почему он не будет выпущен? - PullRequest
1 голос
/ 04 июля 2010

Я пытаюсь реализовать линию, нарисованную по осям, чтобы при нажатии она следовала за мышью, пока кнопка нажата, а когда кнопка отпущена, линия перестает следовать Короче говоря, переместите линию на графике в новую позицию на основе щелчка и перетаскивания.

Мне удалось установить, что линия следует за указателем мыши, проблема заключается в том, что WindowButtonUpFcn заставляет строку останавливаться после мыши. То есть Как отключить WindowButtonMotionFcn?

Вот код. Это грубо, потому что это всего лишь мини-тестовая программа, так что не критикуйте слишком много.

function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
    x = 0:.1:10;
    y = zeros(size(x))+.5;
    line(x,y, 'Tag', 'newLine');
    set(findobj('Tag', 'newLine'),'ButtonDownFcn',@button_down)
end

function button_down(src,evnt)
% src - the object that is the source of the event
% evnt - empty for this property
 set(src,'Selected','on')
 set(gcf, 'WindowButtonMotionFcn', @button_motion);
end   

function button_motion(src, evnt)
 h = findobj('Tag', 'axes1');
 pos = get(h, 'CurrentPoint');
 disp(pos);
 hndl = findobj('Tag', 'newLine');
    delete(hndl);
    x = 0:.1:10;
    y = zeros(size(x))+pos(3);    
    line(x,y, 'Tag', 'newLine');
    set(gcf, 'WindowButtonUpFcn', @button_up);
end

function button_up(src, evnt)
    %What to do here?    
end

1 Ответ

2 голосов
/ 04 июля 2010

Вот несколько советов:

  • Вместо удаления и повторного построения линии в функции button_motion, вы должны использовать команду SET для изменения'XData' и 'YData' свойства объекта линии с новой позицией линии.Это сделает более плавную анимацию.

  • Вы должны переместить эту строку:

    set(gcf, 'WindowButtonUpFcn', @button_up);
    

    из button_motion в button_down.

  • В вашей функции button_motion вы должны добавить в конец вызов drawnow, чтобы заставить график обновляться немедленно и , что наиболее важно для получения button_up Функционируйте место, где оно может прерываться button_motion.

  • В вашей функции button_up просто установите 'WindowButtonMotionFcn' и 'WindowButtonUpFcn' свойства фигуры до [] и 'Selected' свойства строки до 'off'.

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