我想让用户只在按住(按下)控制键时进行缩放。我在WindowKeyPressFcn
回调函数中实现了如下:
function keypress_callback(obj, evd, hZoom)
switch evd.Key
case 'control'
set(hZoom,'Enable','on');
end
%disp(evd); % used for debugging purposes
此函数接受在激活回调函数时从主程序传递的缩放对象句柄(hZoom
)(set(hFigure,'WindowKeyPressFcn',{@keypress_callback,hZoom});
)。我写了一个类似的WindowKeyReleaseFcn
(通过set(hFigure,'WindowKeyReleaseFcn',{@keyrelease_callback,hZoom});
设置)以在释放控件时禁用缩放。
function keyrelease_callback(obj, evd, hZoom)
switch evd.Key
case 'control'
set(hZoom,'Enable','off');
end
%disp(evd); % used for debugging purposes
目标是允许正常缩放行为(单击以放大因子;按住Shift键单击以缩小因子;拖动单击以放大所选区域)仅Ctrl
键为郁闷。释放此修改键后,应禁用缩放功能。
但是,此行为无法正常工作。简单地测试(通过disp(evd)
)是否按下了一个键可以显示任意数量的按键可以用任意键进行;但是,如果按下的键是Ctrl
,则只能进行一次这样的按压,并且忽略所有后续的Ctrl
按下,而所有后续按下任何其他按键都会使按键出现在Matab中命令窗口而不是触发keypress_callback
功能。因此,按Ctrl
似乎会以某种方式使keypress_callback
函数失效,可能是因为焦点从图形转移到缩放对象?作为推论问题,WindowKeyReleaseFcn
似乎适用于非修饰键(evd
显示正确的已释放键),但key
中的evd
为空释放的键是非修饰键。
如果有人能够按照设想展示出与控制相关的缩放行为的正确实现,我将不胜感激。
答案 0 :(得分:1)
更现代的做事方式似乎是:
gca
zoom on
z = zoom(gcf);
set(z, 'ButtonDownFilter', @ZoomGate)
其中ZoomGate.m
包含以下内容:
function inhibitZoom = ZoomGate(varargin)
if ismember('control', get(gcbo,'currentModifier'))
inhibitZoom = 0;
else
inhibitZoom = 1;
end
编辑回应提问者的评论:
我的第一个建议是使用WindowButtonDownFcn
回调,如果它检测到控件修饰符,则会调用zoom
本身。如果您可以控制zoom
实现,这很好。回顾我的代码(我在15年前做过类似的事情)我发现它过去很简单 - zoom
是一个m文件并且有一种明显的方式来调用它:{{1}意思是“按钮刚被按下”。然后,通过这种方式,MathWorks移动了目标帖子并更改了zoom down
。看起来我当时的回答是以较旧,更简单的方式重新实现我自己的zoom
。没有帮助,除非你真的想要那些代码(让我知道)。