`

Symbian中左右软键的处理

 
阅读更多
<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>

Autor:孙东风 2007-04-11

我们知道在J2ME游戏开发中经常要处理手机的左右软键问题,主要是在keyPressed(intkeyCode);对左右软键的键盘码进行处理,在一些机器上左右软键值分别是21/22或者-21/-22,而在另外一些机器上左右软键值又变成-6/-7,所以J2ME的移植也主要针对键值和屏幕尺寸来进行的。

当然在Symbian里你也可以进行类似的处理,下面是我写的一段测试Symbian中左右软键键值的代码:

TKeyResponse CSymbian2Container::OfferKeyEventL(
const TKeyEvent& aKeyEvent,TEventCode aType)
{
if( aType == EEventKeyDown ){
TBuf scanCode;
scanCode.AppendNum(aKeyEvent.iScanCode);
scanCode.operator +=_L(" iScanCode is pressed down!");
CEikonEnv::Static()->InfoMsg(scanCode);

}

return EKeyWasNotConsumed;
}

我在PC模拟器上测试的左右软键的值分别为:164/165,也就是说aKeyEvent.iScanCode值为164/165时代表左右软键被按下!

虽然可以这么处理,但这样做俨然不符合Symbian所提倡的"数据"和"显示"高度分离的原则。

Symbian是提倡把一切东西都放在"资源"中进行处理的,这样不用重新编译,程序就可以无缝的进行更新。那么我们是否可以遵循这个原则把左右软键的处理放在资源文件里呢?

答案是肯定的!

我们知道Avkon框架给我们提供了很多预定义的Cba资源对左右软键进行定义,这些定义查看avkon.hrh可以看到,其中有我们经常见到的R_AVKON_SOFTKEYS_OPTIONS_BACK、R_AVKON_SOFTKEYS_OK_BACK等,那么我们就可以这样考虑:我们可以定义一个Cba资源让其为R_AVKON_SOFTKEYS_OK_BACK,这样左键就对应着OK,右键就对应着BACK,再利用我上一篇文章Symbian中所体现的软件编程艺术写的Observer模式,把这个按键事件传递到"引擎类"中,"引擎类"中根据用户按的是OK(左键)还是BACK(右键)进行相应的响应,比如把全局界面ID从一个状态转变到另外一个状态、让用户开始游戏、查看帮助信息等。

下面是*.RSS文件中定义的Cba资源

/*
============================================================================
Name : TestLeftRightSoftKey.rss
Author :
Version :
Copyright : Your copyright notice
Description : This file contains all the resources for the TestLeftRightSoftKey.
============================================================================
*/

// RESOURCE IDENTIFIER
NAME AWIZ // 4 letter ID

// INCLUDES

#include <eikon.rh><br>#include "TestLeftRightSoftKey.hrh"<br>#include "TestLeftRightSoftKey.loc"<br>#include <avkon.rsg><br>#include <avkon.rh><br>#include <avkon.mbg></avkon.mbg></avkon.rh></avkon.rsg></eikon.rh>

// RESOURCE DEFINITIONS

RESOURCE RSS_SIGNATURE { }

RESOURCE TBUF { buf = "TestLeftRightSoftKey"; }

RESOURCE EIK_APP_INFO
{
cba = R_AVKON_SOFTKEYS_OK_BACK;
}
RESOURCE TBUF r_message_text {buf = R_MESSAGE_TEXT_STRING; }

RESOURCE TBUF r_leftbottom_text {buf = qtn_appl_ok;}

RESOURCE TBUF r_rightbottom_text { buf = qtn_appl_back;}

可以看到,*.RSS中我们只定义了cba资源,并没有定义其它的资源(hotkeys、menubar等),那么系统只会加载cba资源,从而我们可以使用下面的代码进行左右软键的响应:

void CMegajoyAppUi::HandleCommandL(TInt aCommand) {
switch ( aCommand ) {
case EAknSoftkeyOk:
iMainEngine->ExternalEvent(EVT_SELECT);
break;
case EAknSoftkeyBack:
iMainEngine->ExternalEvent(EVT_ESCAPE);
break;
case EEikCmdExit:
iMainEngine->ForceQuit();
Exit();
break;

default:
break;
}
}

红色显示的是我们定义的Cba资源对应的响应,可见它把事件传递给了"引擎类",让"引擎类"来做具体的处理。

蓝色显示部分我们需要说明一下:EEikCmdExit按钮是一个系统按钮,它在*.RSS定义R_AVKON_SOFTKEYS_OPTIONS_BACK时会出现在OPTIONS选项最后以让程序可以正常退出。在系统如下定义时也会做为快捷退出键出现但并没有作用:

RESOURCE HOTKEYS r_frozenbubble_hotkeys
{
control =
{
HOTKEY { command = EAknCmdExit; key='e'; }
};
}



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics