Обратный вызов Windowbuttonmotionfcn не видит новое поле в дескрипторе

Я создаю графический интерфейс в Matlab, используя GUIDE. Я хочу создать новое поле в дескрипторах, когда левая кнопка мыши нажата, изменить поле, когда мышь движется, и удалить его, когда кнопка будет отпущена. Но обратный вызов Windowbuttonmotionfcn не видит это новое поле. Итак, вот пример кода:

function fig_OpeningFcn(hObject, eventdata, handles, varargin)

   handles.output = hObject;
   guidata(hObject, handles);

   set(hObject,'windowbuttonmotionfcn',{@fh_wbmfcn,handles});
   set(hObject, 'windowbuttondownfcn',{@fh_wbdfcn, handles});
   set(hObject, 'windowbuttonupfcn',{@fh_wbufcn, handles});

function fh_wbmfcn(hObject, eventdata, handles)
   isfield(handles, 'new_field') % it is always 0, but should be 1 when button is down

function fh_wbdfcn(hObject, eventdata, handles)
   handles.new_field=1;
   guidata(hObject, handles);

function fh_wbufcn(hObject, eventdata, handles)
   if isfield(handles, 'new_field')
   handles=rmfield(handles,'new_field');
   guidata(hObject, handles);
   end

person lnk    schedule 18.12.2013    source источник


Ответы (1)


Когда вы указываете обратный вызов следующим образом:

set(hObject,'windowbuttonmotionfcn',{@fh_wbmfcn,handles});

Значение handles всегда будет тем, которое вы установили в этот момент, поскольку вы передаете только значение переменной handles.

В качестве альтернативы должно работать следующее:

set(hObject,'windowbuttonmotionfcn', @(obj,evt) fh_wbmfc(obj,evt, guidata(gcbo));

Это всегда будет оценивать guidata(gcbo) во время выполнения обратного вызова и, следовательно, даст вам текущее значение handles.

Альтернативный номер 2 (мое личное предпочтение):

% remove handles from callback definition
set(hObject,'windowbuttonmotionfcn', @fh_wbmfc);

% and get current handle value in the callback function:
def fh_wbmfc(object, evt)
    handles = guidata(object);
    ...
person sebastian    schedule 18.12.2013