matlab:KeyPressFcn和WindowKeyPressFcn之间的区别

时间:2014-08-07 04:54:55

标签: matlab matlab-figure

KeyPressFcn的Matlab文档定义是“在图形窗口具有焦点时按键调用的回调函数。”

类似地,WindowKeyPressFcn的定义是“按下按键时调用的回调函数,当图形窗口或其任何子窗口具有焦点时发生。”

据我所知,数字的子项是轴,绘图对象和注释对象等实体。如果这些孩子中的一个具有焦点,那么其父图可能也具有焦点(至少其句柄将由gcf返回)。因此,我认为KeyPressFcnWindowKeyPressFcn之间没有任何实际区别,除了前者,由于其名称缺少术语Window,也可能在没有数字时生效活动,例如在命令窗口中操作时(虽然这个猜想与回调定义不一致,后者显式调用了数字窗口的存在)。

是否有人请求解释这两个回调函数之间的区别,以及何时使用其中一个回调函数可能更受欢迎?

1 个答案:

答案 0 :(得分:7)

正如您在问题中所建议的那样,差异在于焦点

  • KeyPressFcn仅在图形具有焦点(但不是其子像素)时进行评估。
  • 另一方面,只要数字或其任何一个孩子有焦点,就会对
  • WindowKeyPressFcn进行评估。

这可以用以下代码说明:

function test_keypress_vs_windowkeypress

h.hf = figure();
h.edit = uicontrol('Style', 'edit', 'Units', 'Normalized',...
    'Position', [0.2, 0.2, 0.6, 0.6]);

% set callbacks
set(h.hf, 'KeyPressFcn', @wintest);
set(h.edit, 'KeyPressFcn', @edittest);

function wintest(h, e)
    disp('window button press');

function edittest(h, e)
    disp('editbox button press');

该函数创建一个带有KeyPressFcn的图形(带有一个丑陋的编辑框)(也有一个KeyPressFcn)。
现在,如果你:

  • 编辑框具有焦点时,按任意键评估edittest回调。
  • 数字具有焦点 时,按任意键评估wintest回调。
  • 将窗口回调更改为WindowKeyPressFcn并在编辑框具有焦点时按键 - 两个回调将被评估(首先是数字回调,然后是编辑框回调)。 / LI>