这次我主要谈谈在做这个 Symbian版本中遇到的几个问题,希望以后自己不要再犯同样的错误了。
1、多视图的应用程序框架的问题
我用的是Carbide C++ IDE环境,不知道为什么不能生成多视图的架子,所以只能在HelloWorld框架的代码上自己手工改写,结果就弄出一个Panic折腾了我很久,问题出在千万不要在析构函数中去删除创建的CAknView,如下代码(注掉是正确的,否则就在退出应用时会出错):
...{
// if(iAppCtrol!=NULL){
// this->RemoveView(iAppCtrol->Id());
// delete iAppCtrol;
// iAppCtrol=NULL;
//
// RDebug::Printf("delete iAppCtrol");
// }
// RDebug::Printf("delete Ui");
}
我们需要负责清除对象的地方是在CAknView中负责删掉CCoeControl,因为在它的DoActivateL/DoDeactivateL两个函数中负责创建和删除CoeControl,但是如果退出时这个DoDeactivateL是不会主动调用的,因此在析构时可以调用一下它:
...{
iFs.Close();
iList.Close();
DoDeactivate();
RDebug::Printf("delete Ctrol");
}
2、关于显示字体的问题
在调用CWindowGc的DrawText方法时,必须要设置一下字体否则不会有东西显示出来,而设置字体有一段标准代码可以参考(来源于网上):
CFont *font = NULL;
TFontSpec fontSpec = iEikonEnv->LegendFont()->FontSpecInTwips();
fontSpec.iHeight -= fontSpec.iHeight / 6;
iCoeEnv->ScreenDevice()->GetNearestFontInTwips( font, fontSpec );
gc.UseFont( font );
// do sth.
gc.DiscardFont();
iCoeEnv->ScreenDevice()->ReleaseFont( font );
3、关于SVG图像的显示
我将所有的数字小图片都做成SVG格式,在显示SVG图像的时候必须设置它的尺寸,否则也无法显示。另外,因为制作时它的背景色为白色,所以要显示为透明则需要用到它的MASK了。
CFbsBitmap * b=NULL;
CFbsBitmap * c=NULL;
AknIconUtils::CreateIconL(b,c,iMFileName,EMbmSudoscY1+j,EMbmSudoscY1+j+1);
AknIconUtils::SetSize(b, TSize(22, 22));
AknIconUtils::SetSize(c, TSize(22, 22));
iThumbNormal.AppendL(b);
iThumbNormalMask.AppendL(c);
}
iThumbNormal和iThumbNormalMask是两个RPointerArray
gc.BitBltMasked(TPoint(xx,yy),iThumbNormal[iGrid[i].value-1],r,iThumbNormalMask[iGrid[i].value-1], EFalse);
else
gc.BitBltMasked(TPoint(xx,yy),iThumbError[iGrid[i].value-1],r,iThumbErrorMask[iGrid[i].value-1], EFalse);
4、关于按键处理
我仍是按BREW手机的模式,左软键菜单,右软键切换模式,*#则用来切换题目。在Symbian中对键值的定义比其它平台要复杂一些,让人有点摸不着头脑,比如数字健没有定义在头文件中(不是那个EStdKeyNkp1等枚举),只能自己去尝试一下:
...{
if(aType==EEventKeyUp)
...{
if( aKeyEvent.iScanCode>=EStdKeyLeftArrow && aKeyEvent.iScanCode<=EStdKeyDownArrow)
return TreatNavKey(aKeyEvent,aType);
else if( aKeyEvent.iScanCode>=48 && aKeyEvent.iScanCode<=57)
return TreatNumKey(aKeyEvent,aType);
else if( aKeyEvent.iScanCode==EStdKeyDevice1 || aKeyEvent.iScanCode==EStdKeyHash || aKeyEvent.iScanCode==EStdKeyNkpAsterisk)
return TreatChrKey(aKeyEvent,aType);
}
return EKeyWasConsumed;
}
5、关于消息对话框
在显示“解题成功”的对话框时,记得不要画蛇添足地去消除对话框,如下面代码中注掉的代码是多余的:
...{
if(iState==EGSTATE_WRITE && CSuDoScHelper::CheckSuccess(iGrid))...{
TBuf<32> str;
iCoeEnv->ReadResource(str,R_TEXT_SUCCESS);
CAknInformationNote * dlg = new(ELeave) CAknInformationNote(ETrue);
//CleanupStack::PushL(dlg);
dlg->ExecuteLD(str);
//CleanupStack::PopAndDestroy(1);
return ETrue;
}
return EFalse;
}
暂时就这些吧。
【编辑推荐】