常用的有两个WindowKeyPressFcn和WindowKeyReleaseFcn,分别表示按下按键和释放按键的响应函数,两者调用形式上是一样的。
以WindowKeyPressFcn为例,按键响应无论当前焦点在figure上还是控件上,这一点和鼠标响应有所不同;它的响应函数也需要至少两个参数,发生按键的figure和以事件数据结构,事件数据结构中包含了按键的各种信息,如下
意义分别为
Character表示按键实际会显示的字符,如shift+k,则此值为K,只按下shift,则此值为空;
Modifier是一个元胞类型,包含所按所有修饰键的名字,如按下ctrl+shift+a,则此值为{‘shift’ ,’control’};
Key表示按键的名称,如k,a,multiply,delete等。
要注意,由于不可能同时按下两个键,所以多按键是挨个响应的,如按下ctrl+shift+a,
************press
evt =
Character: ”
Modifier: {‘control’}
Key: ‘control’
************
************press
evt =
Character: ”
Modifier: {‘shift’ ‘control’}
Key: ‘shift’
************
************press
evt =
Character: ”
Modifier: {‘shift’ ‘control’}
Key: ‘a’
************
************release
evt =
Character: ”
Modifier: {‘shift’ ‘control’}
Key: ‘a’
************
************release
evt =
Character: ”
Modifier: {‘control’}
Key: ‘shift’
************
************release
evt =
Character: ”
Modifier: {1×0 cell}
Key: ‘control’
************
可知按下顺序为control—shift—a,释放顺序为a—shift—control。
简单测试程序为
%% 测试windowkeypressfcn响应函数
function keypress_test
clc
close all
clear all
%%
fig = figure;
plot(1:10)
set(fig,’windowkeypressfcn’,@keypressfcn);
set(fig,’windowkeyreleasefcn’,@keyreleasefcn);
function
keypressfcn(h,evt)
fprintf(‘************press \n’);
evt
fprintf(‘************ \n’);
end
function
keyreleasefcn(h,evt)
fprintf(‘************release \n’);
evt
fprintf(‘************ \n’);
end
end