2016-06-20 2 views
1

ユーザがMatlab Guiを使用してクリックした場所に基づいて画像を処理する必要があります。私はこのようなButtonDownFcnを使用することをお勧めの例を発見した:Matlab guiで「ButtonDownFcn」を使用するときにハンドルをサブ関数に渡す

function buttonSelectSuperpixels_Callback(hObject, eventdata, handles) 
h = handles.myCanvas; 
set(h,'ButtonDownFcn',@position_and_button); 

をし、このようにサブファンクションposition_and_buttonでクリックされたポイントを処理する:私はいくつかの他の変数を処理する必要があるだろうしかし

function position_and_button(hObject,eventdata) 
Position = get(ancestor(hObject,'axes'), 'CurrentPoint'); 
Button = get(ancestor(hObject,'figure'), 'SelectionType'); 

その最後のサブ関数。変数handlesposition_and_buttonに渡して更新することはできますか?

私はちょうど引数としてhandlesを渡そうとしましたが、うまくいかないようです。

+0

セットを 'set(h、 'ButtonDownFcn'、@(x、y)position_and_button(x、y、handles));'に変更し、ハンドルを受け入れるようにサブ関数を更新するとどうなるでしょうか?ハンドル構造体は常にサブ関数 'buttonSelectSuperpixels_Callback'に見られるようになります –

答えて

3

あなたはMATLABが通過するということである、しかし匿名関数

set(h, 'ButtonDownFcn', @(src, evnt)position_and_button(src, evnt, handles)) 

またはセル配列

set(h, 'ButtonDownFcn', {@position_and_button, handles}) 

問題のいずれかを使用して、入力として、それを追加することで、コールバックにhandles構造体を渡すことができます変数は、参照ではなく値である。したがって、これらのコールバックを定義すると、コピーhandlesになり、コールバックの作成時に見えます。このコピーは、他の関数に渡されます。さらに、handlesのコールバック内での変更はにもう1つのコピーに行われ、これらの変更は他の機能には表示されません。

この現象を回避するには、コールバック内のguidataからhandles構造体を取得することができます(最新のバージョンがあることを確認してください)。変更を加えた場合は、変更後にguidataを保存する必要があり、他のすべての機能でこれらの変更が表示されます。

function position_and_button(src, evnt) 
    % Get the handles struct 
    handles = guidata(src); 

    % Now use handles struct however you want including changing variables 
    handles.variable2 = 2; 

    % Now save the changes 
    guidata(src, handles) 

    % Update the CData of the image rather than creating a new one 
    set(src, 'CData', newimage) 
end 

この場合、コールバック関数のデフォルトの2つの入力を指定するだけで済みます。

+0

最初のメソッドの場合、コールバックは' handles'のコピーを使用しているので、コールバックに渡される値はそのままですあなたがコールバックを設定したとき。 – excaza

+0

@excazaよろしいですか。私は元の答えでそれを持っていたが、それを取り除いていた。 – Suever

+0

また、 'guidata'は親のFigureを内部的に探しますので、' ancestor'コールは厳密には必要ではありません。 – excaza

関連する問題