Прослушивание нажатия клавиш в режиме масштабирования 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
для всех кнопок.