用于保存密钥的matlab KeyPressFcn

时间:2014-08-07 06:05:05

标签: matlab

我想让用户只在按住(按下)控制键时进行缩放。我在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为空释放的键是非修饰键。

如果有人能够按照设想展示出与控制相关的缩放行为的正确实现,我将不胜感激。

1 个答案:

答案 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。没有帮助,除非你真的想要那些代码(让我知道)。