matlab:KeyPressFcn 和 WindowKeyPressFcn 的区别

标签 matlab matlab-figure

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

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

据我了解,图形的子项是轴、绘图对象和注释对象等实体。如果其中一个 child 有焦点,那么它的父图形大概也有焦点(至少它的句柄将由 gcf 返回)。因此,除了前者之外,我看不到 KeyPressFcnWindowKeyPressFcn 之间有任何实际区别,暗示其名称缺少术语 Window , 也可能在没有图形处于事件状态时生效,例如在命令窗口中操作时(尽管此猜想与回调定义不一致,后者明确调用了图形窗口的存在)。

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

最佳答案

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

  • 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回调。
  • figure 获得焦点时按任意键评估 wintest 回调。
  • 将窗口回调更改为 WindowKeyPressFcn 并在编辑框具有焦点时按下一个键 - 两个 回调都将被评估(首先是图形回调,然后是编辑框回调).

关于matlab:KeyPressFcn 和 WindowKeyPressFcn 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25174400/

相关文章:

单图中的 MATLAB 多个(平行)箱线图

matlab - 如何在 MATLAB 中显示位于特定角度的箭头?

matlab - 如何有效地从矩阵中的每个重复行中获取最小值和最大值

matlab - 如何使用多个定界符进行文本扫描

Matlab XTickLabels 警告

matlab - 为什么轴在Matlab循环中被删除?

python - Python/Scipy 是否有 firls() 替代品(即加权、最小二乘、FIR 滤波器设计)?

matlab - LIBSVM 是否处理训练中的缺失值?

matlab - 将条形图绘制为表中 for 循环中的子图,以便它在每次迭代时更新行元素

matlab - 如何在 MATLAB 中通过 ROI 放大图像