Symbian中的iScanCode和iCode
来源:互联网 发布:arcgis for js 动画 编辑:程序博客网 时间:2024/05/15 21:14
我们知道在Symbian的按键事件处理中使用以下方法:
TKeyResponse CMegajoyContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType)
这个方法是在CCoeControl(Control base class from which all other controls are derived)中定义的虚函数,其定义如下:
OfferKeyEventL()
virtual TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType);
Description
Handles key events.
If a control wishes to process key events, it should implement this function. The implementation must ensure that the function returns EKeyWasNotConsumed
if it does not do anything in response to a key event — otherwise, other controls or dialogs may be prevented from receiving the key event. If it is able to process the event it should return EKeyWasConsumed
.
注释:
如果一个控件希望处理按键事件,那么它就应该实现这个函数。如果对一个按键事件,控件并没做任何事情,那么函数的实现中必须确保函数返回EKeyWasNotConsumed。否则,(控件栈中的)其它控件或对话框可能会接收不到按键事件。如果此控件能够处理按键事件,那么它应该返回EKeyWasConsumed。
When a key event occurs, the control framework calls this function for each control on the control stack, until one of them can process the key event (and returns EKeyWasConsumed
).
注释:
当一个按键事件发生时,控件框架调用控件栈上的每个控件的OfferKeyEventL方法,直到它们中的一个能够处理这个按键事件(并且返回EKeyWasConsumed)。
Parameters
const TKeyEvent& aKeyEvent
The key event.
TEventCode aType
The type of key event: EEventKey
, EEventKeyUp
or EEventKeyDown
.
Return value
TKeyResponse
Indicates whether or not the key event was used by this control.
Notes:
- Each keyboard key press results in three separate events: EEventKeyDown, EEventKey, and EEventKeyUp, in that order.
每个键被按下时会顺序产生三个独立的事件:EEventKeyDown、EEventKey、EEventKeyUp。
- To receive key events, which can be processed by this function, the application should call CCoeAppUi::AddToStackL() to add the control to the stack. This only applies, however, to controls which are not components of a compound control. Compound controls should pass key events to their components as necessary: the components themselves do not go on the stack.
为了接收到按键事件,应用程序应该调用CCoeAppUi::AddToStackL() 方法把控件增加到栈上。尽管这个规则仅仅用在非混合控件。混合控件应该传递按键事件给其组件:组件自己并不在控件栈上。
- Classes that override CCoeControl::OfferKeyEventL() should also override the InputCapabilities() virtual function, returning a TCoeInputCapabilities object whose attributes correspond to the behaviour of the OfferKeyEventL() function. Note that it is not necessary to call InputCapabilities() on any component controls from inside a class' InputCapabilities() function — this is done automatically by the UI Control Framework.
重载CCoeControl::OfferKeyEventL()的类也应该重载虚函数InputCapabilities() ,它会返回一个TCoeInputCapabilities 对象,这个对象的属性和OfferKeyEventL()方法的行为吻合。注意,在控件中并不是必须要调用InputCapabilities() 方法,因为这个过程自动被UI Control Framework完成了。
virtual TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType);
中的第二个参数没什么好说的,它就代表三种按键事件中的一种,我们重点来看看TKeyEvent:
Struct TKeyEvent
TKeyEvent
Support
Supported from 5.0
Description
Key event details.
When processing a TKeyEvent
, the TStdScanCode
in iScanCode
should usually be ignored in favour of the TKeyCode
in iCode
. Using iScanCode
would bypass the keyboard mapping and any FEP that happens to be installed. The exceptions to this general rule are games where the positions of the keys are more important than their translations, and FEPs that are implementing keyboard maps themselves. In these cases, if the iCode
is used rather than iScanCode
to determine the key pressed, there will be two unfortunate consequences. Firstly, the low-level keyboard mapping might re-arrange the mapping that you are trying to impose. Secondly, you will subvert the CTRL+number method of entering Unicode literals.
注释:
当处理一个TKeyEvent时,TStdScanCode中的iScanCode通常应该被忽略而赞成用TKeyCode中的iCode。用iScanCode可以绕过键盘映射和任何已经安装的FEP(A front-end processor)。这个规则的例外情况是游戏,因为游戏中键盘的方位比它们实际的值更重要,还有FEP中,它们已经实现了键盘映射。在这些情况下,用iCode去决定按键,会有两个意外的后果。首先,底层的键盘映射机制可能会重新布置键盘映射。其次,你会破坏输入Unicode字符的CTRL+number方法。
Members
Defined in TKeyEvent
: iCode
, iModifiers
, iRepeats
, iScanCode
Member data
iCode
TUint iCode
Description
The character code generated for an EEventKey
, or 0 for a down or up event.
Key codes for special keys are defined in TKeyCode
.
对应一个EEventKey产生的字符码,当按下或释放按键的时候值为0(这点需要注意,我测试的时候,没按键的时候屏幕上值为0,只有当键被按超过几s时才会有相应的值产生,当释放按键的时候值也为0,所以你如果写成下面的代码值就始终为0,测试不出来实际的值:
if( aType == EEventKeyDown ){
TBuf<40> scanCode;
scanCode.AppendNum(aKeyEvent.iCode);
scanCode.operator +=_L(" iScanCode is pressed down!");
CEikonEnv::Static()->InfoMsg(scanCode);
}
所以应该写成下面这样:
if( aType == EEventKey ){
TBuf<40> scanCode;
scanCode.AppendNum(aKeyEvent.iCode);
scanCode.operator +=_L(" iScanCode is pressed down!");
CEikonEnv::Static()->InfoMsg(scanCode);
}
当aType为EEventKeyDown或EEventKeyUp时,iCode的值均为0
)。
特定按键的Key codes在TKeyCode中定义。
iModifiers
TUint iModifiers
Description
State of modifier keys and pointing device. Modifier keys are defined in TEventModifier
.
iRepeats
TInt iRepeats
Description
Count of auto repeats generated.
0 means an event without repeats. 1 or more means "this many auto repeat events". It is normal to ignore this value and treat it as a single event.
iScanCode
TInt iScanCode
Description
The scan code of the key that caused the event.
Standard scan codes are defined in TStdScanCode
.
所以,从上面的SDK HELP可以看出来:iScanCode这个值是实际键盘的扫描码,也就是一个键对应一个数字。而iCode是键的一些映射,比如EKeyLeftArrow
、EKeyRightArrow
、EKeyUpArrow
、EKeyDownArrow
、EKeyDevice3分别代表左、右、上、下、Fire键,而63554、63555分别代表左右软键等。
所以用iCode具有更强的通用性,不会出现下面的问题:
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1683061
- Symbian中的iScanCode和iCode
- Symbian中的iScanCode和iCode
- Symbian中的iScanCode和iCode
- Symbian中的iScanCode和iCode
- Symbian中的iScanCode和iCode
- Symbian中的iScanCode和iCode
- Symbian中的iScanCode和iCode
- Symbian中的iScanCode和iCode
- Symbian中的iScanCode和iCode
- Symbian中的iScanCode和iCode
- Symbian中的iScanCode和iCode
- Symbian中的iScanCode和iCode
- Symbian中的iScanCode和iCode
- Symbian中的iScanCode和iCode(转)
- Symbian中的进程和线程
- Symbian中的String和Descriptors(zt)
- Symbian中的String和Descriptors(zt)
- Symbian操作系统中的线程和进程
- seo优化:把百度放进数据库
- 版本控制软件SubVersion 入门
- 一个活动对象的测试例子
- c++笔试题汇总
- DSA and RBackupWindow
- Symbian中的iScanCode和iCode
- c++笔试题汇总
- 使用C++模板和不使用C++模板两种情况中的执行代码大小近似估计
- 编写安全的Symbian C++游戏代码
- DSA and RBackupWindow
- 遍历Symbian某目录下的所有文件
- 时间条控件制作简明教程
- Symbian程序图标问题
- Symbian程序图标问题