Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
matlab:KeyPressFcn和WindowKeyPressFcn之间的差异_Matlab_Matlab Figure - Fatal编程技术网

matlab:KeyPressFcn和WindowKeyPressFcn之间的差异

matlab:KeyPressFcn和WindowKeyPressFcn之间的差异,matlab,matlab-figure,Matlab,Matlab Figure,的Matlab文档定义是“当图形窗口具有焦点时,按键调用的回调函数。” 类似地,的定义是“当图形窗口或其任何子窗口具有焦点时,按键调用的回调函数。” 据我所知,图形的子对象是轴、打印对象和注释对象等实体。如果其中一个子图形具有焦点,则其父图形可能也具有焦点(至少其句柄将由gcf返回)。因此,我看不出KeyPressFcn和WindowKeyPressFcn之间有任何实际区别,除了前者,由于其名称没有术语Window,在没有图形处于活动状态时,例如在命令窗口中操作时,也可能生效(尽管这一推测与回调

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

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

据我所知,图形的子对象是轴、打印对象和注释对象等实体。如果其中一个子图形具有焦点,则其父图形可能也具有焦点(至少其句柄将由
gcf
返回)。因此,我看不出
KeyPressFcn
WindowKeyPressFcn
之间有任何实际区别,除了前者,由于其名称没有术语
Window
,在没有图形处于活动状态时,例如在命令窗口中操作时,也可能生效(尽管这一推测与回调定义不一致,回调定义明确地调用了图形窗口的存在)


有人能解释一下这两个回调函数之间的区别,以及什么时候最好使用一个回调函数而不是另一个吗?

正如您在问题中所建议的,区别在于焦点

  • KeyPressFcn
    仅当图形具有焦点(但不包括其子对象)时才进行计算
  • 另一方面,每当图形或其任何子图形有焦点时,都会对其进行计算
这可以用以下代码来说明:

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
    ,并在编辑框有焦点时按一个键-将计算两个回调(首先是图形回调,然后是编辑框回调)