(2009-02-23 19:58:44)转载标签:杂谈
const TKeyEvent& aKeyEvent ------------记录了按键的具体信息:
iCode(键盘码)
iScanCode(扫描码) 上面这两个是重点,后面会重点介绍。
iModifier(修饰键....暂且这么叫吧)
iRepeats(是个标记,告诉你产生的这个按键事件是你重复按键还是长按一个键时周期产生的按键事件)。
TKeyEvent 还是要看下e32keys.h头文件(epoc32/include),定义都在里面。
TEventCode aType -------记录键盘事件类型:
EEventKeyDown (接收按键按下时的信息),
EEventKey(在按键按下后,到按键松开前,周期性的收集信息.键盘连击
率,RWsSession::SetKeyboardRepeatRate方法设置时间间隔.),
EEventKeyUp(收集按键释放信息).
而每次按键时,都会依次产生上面三个按键事件(其实也不完全是这样,后面会
说到),根据不同的应用需求做处理,在很多基本的应用时,我们不太关心键按
下或松开的时刻,而只关心我们按的是什么键,比如在对话框里输入一些,我们
只关心按的是a还是b,而合适按下a或b对我们来说并不重要,那么我们在
OfferKeyEventL或HandleKeyEventL中,只需对 aTyep == EEvenKey 时做处理。
而另外一种情况,比如游戏,一个键的按下或释放的时刻就显得很重要了,这时
需要对 aTyep == EEvenKeyDown 或 aTyep == EEvenKeyUp时进行处理,比如我
们可以在aTyep == EEvenKeyDown 时移动一个物体,在aTyep == EEvenKeyUp时停
止移动。
好了,大概的把这些简单的说完了,下面就开始我们的重头戏----aKeyEvent
aKeyEvent 记录了我们按键的详细信息,我们先从最简单的两个iRepeats和
iModifier开始。
iRepeats
w32std.h里是这样定义iRepeats的:
TInt iRepeats;
说的很清楚了,你按键时不是先产生个aTyep=EEvenKeyDown的事件嘛,紧接着产
生aTyep= EEvenKey的事件,如果你按下那个键(比如a)的时间足够长(也不需
要太长,呵呵),超过了系统默认时间间隔(如果你没有用
RWsSession::SetKeyboardRepeatRate设置的时间间隔)的话,那么经历那个系统
默认时间间隔后,会再次产生aTyep= EEvenKey 的事件,而这两次aTyep=
EEvenKey事件的唯一区别就是前一个的aKeyEvent.iRepeats =0,而之后的
aKeyEvent.iRepeats =1。所以aTyep= EEvenKey(且aKeyEvent.iRepeats =1)的
事件每隔一定时间间隔就会自动产生,直到你松开按键。而后产生aTyep=
EEvenKeyUp事件。
iModifier
w32std.h里是这样定义iModifier的:
TUint iModifiers;
那么我们再看看TEventModifier 的定义(e32keys.h中)
enum TEventModifier
{
EModifierAutorepeatable=0x00000001,
EModifierKeypad=0x00000002,
EModifierLeftAlt=0x00000004,
EModifierRightAlt=0x00000008,
EModifierAlt=0x00000010,
EModifierLeftCtrl=0x00000020,
EModifierRightCtrl=0x00000040,
EModifierCtrl=0x00000080,
EModifierLeftShift=0x00000100,
EModifierRightShift=0x00000200,
EModifierShift=0x00000400,
EModifierLeftFunc=0x00000800,
EModifierRightFunc=0x00001000,
EModifierFunc=0x00002000,
EModifierCapsLock=0x00004000,
EModifierNumLock=0x00008000,
EModifierScrollLock=0x00010000,
EModifierKeyUp=0x00020000,
EModifierSpecial=0x00040000,
EModifierDoubleClick=0x00080000,
EModifierPureKeycode=0x00100000,
EModifierKeyboardExtend=0x00200000,
EModifierCancelRotation=0x00000000,
EModifierRotateBy90=0x00400000,
EModifierRotateBy180=0x00800000,
EModifierRotateBy270=0x01000000,
EModifierPointer3DButton1=0x02000000,
EModifierPointer3DButton2=0x04000000,
EModifierPointer3DButton3=0x08000000,
EAllModifiers=0x0fffffff
};
定义虽然有点多,但是很容易看出,iModifier就是指shift alt ctrl等这种修饰
键有没有被按下。想想也很容易理解,我们单独按一个a,和shift+ a(产生的是
A,大写)结果是不一样的,总得有个参数标记一下,这个参数就是iModifier了
。另外,从定义中不知道你发现没,他们都是单字节位定义的,比如
EModifierAutorepeatable=0x00000001 对应的二进制是 0001
EModifierKeypad=0x00000002 对应的二进制是 0010
EModifierLeftAlt=0x00000004 对应的二进制是 0100
这样做是因为有时候我们可能按下不只一个的修饰键,比如两个(shift + alt)
,而把这样同时两个或者更多修饰键被按下的情况一一枚举出来是不科学和不实
用的,使用这种单字节位定义的好处就是我们在判断某个修饰键有没有被按下时
,只需要按位与(&)一下就行了,比如,如果没有其他修饰键,一般按a时产生
的iModifer是3(对应的二进制是 0011),那么
if(aKeyEvent.iModifier & EModifierAutorepeatable)和
if(aKeyEvent.iModifier & EModifierKeypad)时都为真,
而if(aKeyEvent.iModifier & EModifierLeftAlt)就为假,
这样我们在处理按键事件时就能方便的判断出来那些修饰键被按下了。
另外需要注意的就是,我测试时发现按下修饰键时只产生EEvenKeyDown和
EEvenKeyUp事件,而无EEvenKey。