Прослушивание нажатия клавиш в режиме масштабирования MATLAB

Я хочу иметь возможность использовать WindowKeyPressFcn, когда фигура находится в режиме масштабирования. Этот вопрос был недавно задан здесь. Переопределение поведения ctrl-z в режиме масштабирования Matlab, но я только что сделал минимальный пример, чтобы продемонстрировать ту же проблему (я написал бы комментарий к их сообщению, но у меня еще недостаточно представителей), Кто-нибудь знает, чего нам не хватает?

function listenWhileZooming

%% Main problem:
% I want any key press to change the color of the plot, even when in Zoom
% mode. I tried to override the mode manager, but don't see any effect.
%%

%% Create and then hide the GUI as it is being constructed
f = figure('Visible','off','units','normalized','Position',[0.1 0.1 0.5 0.5],'windowkeypressfcn',@colorSwap);

%% Override mode manager
hManager = uigetmodemanager(f);
try
    set(hManager.WindowListenerHandles, 'Enable', 'off');  % HG1
catch
    [hManager.WindowListenerHandles.Enabled] = deal(false);  % HG2
end
set(f, 'WindowKeyPressFcn',@colorSwap);

%% Plot something
plot(1,1,'bo')

%% Make the GUI visible
f.Visible = 'on';

%% Key press callback
    function colorSwap(source,eventData)
        myLine = findobj(source,'type','line');
        if all(myLine.Color == [0 0 1])
            plot(1,1,'ro')
        else
            plot(1,1,'bo')
        end
    end

end

1 ответ

Я знаю, что уже поздно, но это твой недостающий кусок.

Я предполагаю (как в вашем коде), что f это ручка фигуры и f.WindowKeyPressFcn был установлен вами.

%% Fix
Button = findall(f, 'Tag', 'Exploration.ZoomIn');
OldClickedCallback = Button.ClickedCallback;
Button.ClickedCallback = @(h, e) FixButton(f, OldClickedCallback, f.WindowKeyPressFcn);

Button = findall(f, 'Tag', 'Exploration.ZoomOut');
OldClickedCallback = Button.ClickedCallback;
Button.ClickedCallback = @(h, e) FixButton(f, OldClickedCallback, f.WindowKeyPressFcn);

function Result = FixButton(Figure, OldCallback, NewCallback)
    eval(OldCallback);
    hManager = uigetmodemanager(Figure); % HG 2 version
    [hManager.WindowListenerHandles.Enabled] = deal(false);
    Figure.KeyPressFcn = [];
    Figure.WindowKeyPressFcn = NewCallback;
    Result = true;
end

После f.WindowKeyPressFcn он установлен вами, он сбрасывается обработчиком масштабирования. Таким образом, мы ударяем обе кнопки зума (вы можете сделать то же самое с Pan или же Rotate) сначала вызвать исходный обратный вызов, а затем повторно применить исправление. Кроме того, не забудьте удалить KeyPressFcn, Это довольно элегантно, так как вы можете использовать тот же FixButton для всех кнопок.

Другие вопросы по тегам