Symbian學(xué)習(xí)筆記(8)——再嘗試著做一個(gè)數(shù)獨(dú)游戲
這次我主要談?wù)勗谧鲞@個(gè) Symbian版本中遇到的幾個(gè)問題,希望以后自己不要再犯同樣的錯(cuò)誤了。
1、多視圖的應(yīng)用程序框架的問題
我用的是Carbide C++ IDE環(huán)境,不知道為什么不能生成多視圖的架子,所以只能在HelloWorld框架的代碼上自己手工改寫,結(jié)果就弄出一個(gè)Panic折騰了我很久,問題出在千萬不要在析構(gòu)函數(shù)中去刪除創(chuàng)建的CAknView,如下代碼(注掉是正確的,否則就在退出應(yīng)用時(shí)會(huì)出錯(cuò)):
...{
// if(iAppCtrol!=NULL){
// this->RemoveView(iAppCtrol->Id());
// delete iAppCtrol;
// iAppCtrol=NULL;
//
// RDebug::Printf("delete iAppCtrol");
// }
// RDebug::Printf("delete Ui");
}
我們需要負(fù)責(zé)清除對(duì)象的地方是在CAknView中負(fù)責(zé)刪掉CCoeControl,因?yàn)樵谒腄oActivateL/DoDeactivateL兩個(gè)函數(shù)中負(fù)責(zé)創(chuàng)建和刪除CoeControl,但是如果退出時(shí)這個(gè)DoDeactivateL是不會(huì)主動(dòng)調(diào)用的,因此在析構(gòu)時(shí)可以調(diào)用一下它:
...{
iFs.Close();
iList.Close();
DoDeactivate();
RDebug::Printf("delete Ctrol");
}
2、關(guān)于顯示字體的問題
在調(diào)用CWindowGc的DrawText方法時(shí),必須要設(shè)置一下字體否則不會(huì)有東西顯示出來,而設(shè)置字體有一段標(biāo)準(zhǔn)代碼可以參考(來源于網(wǎng)上):
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、關(guān)于SVG圖像的顯示
我將所有的數(shù)字小圖片都做成SVG格式,在顯示SVG圖像的時(shí)候必須設(shè)置它的尺寸,否則也無法顯示。另外,因?yàn)橹谱鲿r(shí)它的背景色為白色,所以要顯示為透明則需要用到它的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是兩個(gè)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、關(guān)于按鍵處理
我仍是按BREW手機(jī)的模式,左軟鍵菜單,右軟鍵切換模式,*#則用來切換題目。在Symbian中對(duì)鍵值的定義比其它平臺(tái)要復(fù)雜一些,讓人有點(diǎn)摸不著頭腦,比如數(shù)字健沒有定義在頭文件中(不是那個(gè)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、關(guān)于消息對(duì)話框
在顯示“解題成功”的對(duì)話框時(shí),記得不要畫蛇添足地去消除對(duì)話框,如下面代碼中注掉的代碼是多余的:
...{
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;
}
暫時(shí)就這些吧。
【編輯推薦】