常用的有两个WindowKeyPressFcn和WindowKeyReleaseFcn,分别表示按下按键和释放按键的响应函数,两者调用形式上是一样的。

以WindowKeyPressFcn为例,按键响应无论当前焦点在figure上还是控件上,这一点和鼠标响应有所不同;它的响应函数也需要至少两个参数,发生按键的figure和以事件数据结构,事件数据结构中包含了按键的各种信息,如下

a4c26d1e5885305701be709a3d33442f.png

意义分别为

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