KeyPressFcn
的 Matlab 文档定义是“图形窗口具有焦点时发生的按键调用的回调函数。”
类似地,WindowKeyPressFcn
的定义是“当图形窗口或其任何子窗口具有焦点时发生的按键调用的回调函数。”
据我了解,图形的子项是轴、绘图对象和注释对象等实体。如果其中一个 child 有焦点,那么它的父图形大概也有焦点(至少它的句柄将由 gcf
返回)。因此,除了前者之外,我看不到 KeyPressFcn
和 WindowKeyPressFcn
之间有任何实际区别,暗示其名称缺少术语 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/