我希望能够在图形处于缩放模式时使用WindowKeyPressFcn。这个问题最近在这里被问到在matlab缩放模式下重写ctrl-z行为,但我刚刚做了一个最小的例子来演示同样的问题(我会在他们的帖子上写一个评论,但还没有足够的代表)。有人知道我们错过了什么吗?
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
我知道很晚了,但这是你缺失的部分。
我假设(和你的代码一样)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
为所有按钮