symbian 系統(tǒng)開發(fā)培訓(xùn)_第1頁
symbian 系統(tǒng)開發(fā)培訓(xùn)_第2頁
symbian 系統(tǒng)開發(fā)培訓(xùn)_第3頁
symbian 系統(tǒng)開發(fā)培訓(xùn)_第4頁
symbian 系統(tǒng)開發(fā)培訓(xùn)_第5頁
已閱讀5頁,還剩73頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

SymbianOS開發(fā)培訓(xùn)InspurCommunicationInformationSystemsCo.,Ltd

SymbianOS概述

1998年6月,諾基亞(NOKIA)、摩托羅拉(MOTOROLA)、愛立信(ERICSSON)、三菱(MITSUBISHI)和Psion在英國倫敦共同投資成立Symbian公司。這個(gè)公司成立的目的是為了能夠設(shè)計(jì)并開發(fā)出一種可以在手機(jī)及其他類似的移動(dòng)通訊終端產(chǎn)品上運(yùn)行的開放性操作系統(tǒng),以此來推動(dòng)高端智能移動(dòng)電話及類似的終端產(chǎn)品盡快進(jìn)入大眾消費(fèi)領(lǐng)域。之后有西門子(SIEMENS)、三星(SAMSUNG)、松下(Panasonic)、索尼愛立信(SonyEricsson)等手機(jī)廠商相繼入資,現(xiàn)如今,Symbian操作系統(tǒng)的智能手機(jī)已經(jīng)占據(jù)了世界智能手機(jī)市場超過80%的份額。SymbianOS概述

Symbian是一個(gè)實(shí)時(shí)性、多任務(wù)的純32位操作系統(tǒng),具有功耗低、內(nèi)存占用少等特點(diǎn),非常適合手機(jī)等移動(dòng)設(shè)備使用,經(jīng)過不斷完善,可以支持GPRS、藍(lán)牙、SyncML、以及3G技術(shù)。Symbian是一個(gè)標(biāo)準(zhǔn)化的開放式平臺(tái),任何人都可以為支持Symbian的設(shè)備開發(fā)軟件。與微軟產(chǎn)品不同的是,Symbian將移動(dòng)設(shè)備的通用技術(shù),也就是操作系統(tǒng)的內(nèi)核,與圖形用戶界面技術(shù)分開,能很好的適應(yīng)不同方式輸入的平臺(tái),也可以使廠商可以為自己的產(chǎn)品制作更加友好的操作界面,符合個(gè)性化的潮流SymbianOS概述

目前SymbianOS手機(jī)有三種開發(fā)SDK:NokiaSeries80:主要機(jī)型有Nokia9200系列NokiaSeries60:主要機(jī)型包括諾基亞7650、6600、西門子SX1等UIQ2、UIQ3:SonyEricssonP800,P900SonyEricssonP900開發(fā)平臺(tái)搭建安裝ActivePerl(x86和x64分別對應(yīng)32位和64位cpu)jre(java的應(yīng)用平臺(tái))SymbianOSSDK(建議安裝在盤符根目錄下)(C++)開發(fā)工具手機(jī)軟件開發(fā)過程:開發(fā)平臺(tái)搭建第一步:安裝開發(fā)軟件,搭建開發(fā)環(huán)境(下面主要介紹series60sdk,其余類似)第二步:在模擬器上開發(fā)調(diào)試(以VC環(huán)境開發(fā)為例)第三步:生成sis文件,在手機(jī)上安裝運(yùn)行幾種開發(fā)環(huán)境:開發(fā)平臺(tái)搭建VisualC++6.0BorlandC++Builder6CarbideC++開發(fā)平臺(tái)搭建Symbian工程aifdatagroupincsrcsis工程基本目錄結(jié)構(gòu):1.aif用來存放程序圖標(biāo)2.data用來存放運(yùn)行所需要的資源文件.rss。3.group中比較重要的幾個(gè)文件:bld.inf、*.mmp。4.inc和src存放工程頭文件和源代碼文件。5.sis用來存放程序打包所需要的pkg文件,打包后生成的安裝文件.sis也存放在此處。bld.inf聲明build的相關(guān)信息通常只包括這次build會(huì)引用到的mmp文件。例如:PRJ_MMPFILES

hello.mmp2..mmp文件保存工程編譯相關(guān)信息,主要內(nèi)容如下

TARGEThello.app//目標(biāo)名稱TARGETTYPEapp//目標(biāo)類型UID0x100039CE0x07B9DE87//UID唯一系統(tǒng)標(biāo)示符TARGETPATH\system\apps\hello//目標(biāo)路徑SOURCEPATH..\src//源代碼存放位置SOURCEhelloApp.cpp//源代碼列表…

開發(fā)平臺(tái)搭建

SOURCEPATH..\data//資源文件路徑RESOURCEhello.rss//資源文件LANGSC//默認(rèn)英語

USERINCLUDE.USERINCLUDE..\inc//頭文件路徑SYSTEMINCLUDE.\epoc32\include//系統(tǒng)包含文件目錄LIBRARYeuser.libapparc.libcone.libeikcore.libLIBRARYeikcoctl.libavkon.lib//庫文件3.UIDUID1-第一個(gè)UID(類型):

UID1用來設(shè)定該應(yīng)用程序是一個(gè)執(zhí)行程序(executablefile)還是一個(gè)數(shù)據(jù)文件(datafile).UIDvalueNumericvalue(Hex)MeaningKExecutableImageUid0x1000007A.exe可執(zhí)行文件KDaynamicLibraryUid0x10000079.dll.app.ldd,.pdd文件KDirectFileStoreLayoutUid0x10000037directfilestoreKPermanentFileStoreLayoutUid0x10000050permanentfilestoreUID2-第第二二個(gè)個(gè)UID((子子類類型型)):UID2-具具體體含含義義取取決決于于UID1的的值值::如果果UID1是是KExecutableImageUid,UID2不不使使用用,,所所以以UID2的的值值可可以以隨隨意意取取。。如果果UID1是是KDynamicLibraryUid,UID2將將會(huì)會(huì)是是::如果果UID1是是KDirectFileStoreLayoutUid或或者者KPermanentFileStoreLayoutUid,那那么么UID2將將是是::UIDvalueNumericvalue(Hex)MeaningKSharedLibraryUid0x1000008D.dllKUidApp0x100039CE.appKLogicalDeviceDriverUid0x100000AFalogicaldecivedriver(.ldd)KPhysicalDeviceDriverUid0x100039D0aphysicaldevicedriver(.pdd)UIDvalueNumericvalue(Hex)MeaningKUidAppDllDoc0x10003A12indicatesthisisafilestorecreatedbyan.apptostoreuserdata(i.e,adocument)KUidAppInfoFile0x10003A38IndicatesthisisanAIFfile(atypeoffilestore)UID3-第第三三個(gè)個(gè)UID(子子子子類類型型)::每個(gè)個(gè)獨(dú)獨(dú)立立的的應(yīng)應(yīng)用用程程序序有有一一個(gè)個(gè)唯唯一一的的UID3值值,,它它也也被被用用作作安安全全I(xiàn)D(secureID),對對于于UIKON應(yīng)應(yīng)用用程程序序而而言言,,用用于于關(guān)關(guān)聯(lián)聯(lián)數(shù)數(shù)據(jù)據(jù)文文件件和和程程序序::1.對對于于dll和和exe文文件件,,它它辯辯識(shí)識(shí)特特定定的的二二進(jìn)進(jìn)制制(itidentifiedtheparticularbinary)。。2.對對于于.app((UIKON應(yīng)應(yīng)用用程程序序)),,它它辯辯識(shí)識(shí)特特定定的的應(yīng)應(yīng)用用程程序序(itidentifiedtheparticularapplicationprogram).3.對對于于由由.apps創(chuàng)創(chuàng)建建的的文文件件存存儲(chǔ)儲(chǔ)(filestores),,它它辯辯識(shí)識(shí)和和該該文文件件相相關(guān)關(guān)的的應(yīng)應(yīng)用用程程序序(itidentifiestheapplicationprogramassociatedwiththisfile).4.對對于于其其他他文文件件存存儲(chǔ)儲(chǔ)(filestores),它它沒沒有有典典型型的的用用途途((但但是是你你可可以以自自定定義義它它的的用用途途))Symbian命命名名約約定定Symbian大大致致分分了了四四種種類類C::C前前綴綴表表示示類類從從CBase派派生生并并應(yīng)應(yīng)該該基基于于堆堆構(gòu)構(gòu)造造。。T::T前前綴綴表表示示一一個(gè)個(gè)簡簡單單類類,,這這種種類類不不擁擁有有任任何何額額外外的的資資源源。。如如Tint、、TReal等等基基本本數(shù)數(shù)據(jù)據(jù)類類型型。。R::R前前綴綴表表示示一一個(gè)個(gè)資資源源類類,,它它包包含含其其它它位位置置擁擁有有資資源源的的句句柄柄。。M::M前前綴綴表表示示一一個(gè)個(gè)接接口口類類,,它它定定義義了了接接口口但但需需要要派派生生類類實(shí)實(shí)現(xiàn)現(xiàn)。。結(jié)構(gòu)構(gòu)(struct)類類型型作作為為T類類對對待待,,因因?yàn)闉樗惨膊徊粨頁碛杏腥稳魏魏晤~額外外的的資資源源,,它它的的前前綴綴通通常常是是T((但但也也有有一一些些以以S開開頭頭))。。enumTColors{ERed,//盡盡量量用用E開開頭頭,,盡盡量量用用枚枚舉舉EGreen}成員員變變量量的的名名字字以以i開開頭頭,,參數(shù)數(shù)名名以以a開開頭頭classTMyClass{TIntiMyValue;voidMyAddFunc(TIntaArg1,TIntaArg2);voidMyAddFunc(TIntaArg1,TIntaArg2);voidMyAddFuncL(TIntaArg1,TIntaArg2);-------->后后綴綴L的的約約定定是是該該函數(shù)數(shù)可可能能產(chǎn)產(chǎn)生生異異常常退退出出;voidMyAddFuncLC(TIntaArg1,TIntaArg2);---------->后后綴綴LC的的約約定定表表示示成成功功完完成成之之后后,,返返回回值值會(huì)會(huì)被被壓壓入入清清理理?xiàng)V兄?((棧棧不不保保存存))};Symbian編編程規(guī)規(guī)范和和基本本框架架Symbian命命名約約定常量應(yīng)應(yīng)加前前綴KconstCIntKMyconstant;宏全部部為大大寫#defineMY_HARDCODED_VALUE(25)Symbian四個(gè)個(gè)主要要的應(yīng)應(yīng)用軟軟件框框架類類針對右右圖Graphics,,UI程程序應(yīng)應(yīng)該具具備的基本本功能能類::視圖圖(View))、文文檔((Document)、、應(yīng)用程程序((Application))、應(yīng)用程程序UI((ApplicationUI)。。所有的的S60UI應(yīng)用用程序序都具具有一一些基基本功功能::提供一一個(gè)用用戶界界面,,用于于顯示示信息息并允允許用用戶進(jìn)進(jìn)行交交互。。響應(yīng)各各種用用戶啟啟動(dòng)的的事件件,比比如用用戶選選擇一一個(gè)菜菜單項(xiàng)項(xiàng)。響應(yīng)系系統(tǒng)啟啟動(dòng)的的不同同事件件,比比如導(dǎo)導(dǎo)致屏屏幕重重繪的的window服務(wù)務(wù)器事事件。。能夠保保存和和恢復(fù)復(fù)應(yīng)用用程序序數(shù)據(jù)據(jù)??梢晕ㄎㄒ恍孕缘南蛳蚩蚣芗軜?biāo)志志自身身。向框架架提供供有關(guān)關(guān)應(yīng)用用程序序的描描述性性信息息,比比如圖圖標(biāo)和和標(biāo)題題等。。Symbian編編程規(guī)規(guī)范和和基本本框架架Symbian四個(gè)個(gè)主要要的應(yīng)應(yīng)用軟軟件框框架類類一個(gè)程程序只只能有有一個(gè)個(gè)文檔檔,可可以有有多個(gè)個(gè)視圖圖。必須創(chuàng)創(chuàng)建下下面的的每個(gè)個(gè)方法法,才才能提提供最最小的的S60應(yīng)應(yīng)用程程序::所有S60UI都都實(shí)現(xiàn)現(xiàn)一個(gè)個(gè)全局局函數(shù)數(shù)E32DLL(),當(dāng)應(yīng)應(yīng)用程程序啟啟動(dòng)時(shí)時(shí),框框架將將首先先調(diào)用用該函函數(shù),,該函函數(shù)也也稱為為DLL入口點(diǎn)點(diǎn),應(yīng)用用程序序必須須存在在該函函數(shù)。??蚣苷{(diào)調(diào)用NewApplication(),,創(chuàng)建建Application類,,其基類是是CAknApplication.Application類創(chuàng)建應(yīng)應(yīng)用程程序類類的Document對象,并返返回它它的指指針,,以后后框架架使用用該指指針完完成應(yīng)應(yīng)用程程序的的創(chuàng)建建。由由框框架調(diào)調(diào)用AppDllUid()返回應(yīng)應(yīng)用程程序的的UID。。該函函數(shù)必必須返返回在在.mmp文件中中指定定的值值。Document基類類是CAknDocument.Document對對象通過CreateAppUiL創(chuàng)建獲取AppUi類的的指針針。AppUi類的的基類類是CAknAppUi或者CAknViewAppUi,,它是用用來處處理應(yīng)用用程序序事件件,如如操作作菜單單,操作視視圖,,切換換視圖圖等等等。View是是控控制類類(c類)),在在屏幕幕上顯示示數(shù)據(jù)據(jù),用用戶與與界面面交互互,傳遞命命令給給AppUi。。Symbian編編程規(guī)規(guī)范和和基本本框架架Symbian處理理內(nèi)存存泄漏漏的手手段1.Trap和和TrapD處處理理異常常TInterr;Trap(err,CreateObject());//需需要先先定義義err變變量TrapD(err,CreateObject());//不需需要定定義err變量量2.CleanupStack它是處處理內(nèi)內(nèi)存泄泄漏的的又一一重要要手段段CFoo*p=new(ELeave)CFoo();CleanupStack::PushL(p)p->SomeFunctionL();//可可能異異常退退出,,使得得deletep得得不到到調(diào)用用CleanupStack::Pop();deletep;Symbian二階階段構(gòu)構(gòu)造在Symbian中中,如如果在在一個(gè)個(gè)類的的構(gòu)造造函數(shù)數(shù)中需需要執(zhí)執(zhí)行某某些比比如申申請內(nèi)內(nèi)存等等操作作,那那么有有可能能會(huì)Leave。如如果Leave的話話,這這個(gè)時(shí)時(shí)候這這個(gè)類類的析析構(gòu)函函數(shù)數(shù)是不不會(huì)被被調(diào)用用,因因?yàn)檫€還沒有有初始始化完完,也也就沒沒法把把自己己加入入CleanupStack,那那么那那些申申請了了的內(nèi)內(nèi)存可可能會(huì)會(huì)因?yàn)闉闆]有有變量量引用用而造造成內(nèi)內(nèi)存泄泄漏。。因此此在在Symbian中中類的的構(gòu)造造函數(shù)數(shù)中不不能有有可能能會(huì)Leave的代代碼。。Symbian編編程規(guī)規(guī)范和和基本本框架架Symbian二階階段構(gòu)構(gòu)造初始化化一個(gè)個(gè)類確確實(shí)需需要執(zhí)執(zhí)行某某些可可能會(huì)會(huì)Leave的的函數(shù)數(shù),這這就是是Symbian中中要求求的兩階階段初初始化化了。。第一一階段段,也也就是是在構(gòu)構(gòu)造函函數(shù)中中執(zhí)行行一些些不會(huì)會(huì)Leave的初初始化化工作。然然后是是第二二階段段,把把這個(gè)個(gè)實(shí)例例推進(jìn)進(jìn)CleanupStack,再再執(zhí)行行第二二階段段的可可能會(huì)會(huì)Leave的代代碼。。當(dāng)然然,在在析構(gòu)構(gòu)函數(shù)數(shù)中,,要能能夠夠處理理部分分初始始化的的情況況,也也就是是實(shí)例例沒有初始始化成成功,,也能能釋放放那些些已經(jīng)經(jīng)申請請的內(nèi)內(nèi)存或或資源源。CGraphicsAppView::CGraphicsAppView(){}CGraphicsAppView*CGraphicsAppView::NewL(constTRect&aRect){CGraphicsAppView*self=NewLC(aRect);CleanupStack::Pop(self);returnself;}CGraphicsAppView*CGraphicsAppView::NewLC(constTRect&aRect){CGraphicsAppView*self=new(ELeave)CGraphicsAppView;CleanupStack::PushL(self);self->ConstructL(aRect);returnself;}voidCGraphicsAppView::ConstructL(constTRect&aRect){CreateWindowL();SetRect(aRect);}Symbian編編程規(guī)規(guī)范和和基本本框架架描述符符描述符符是用用來存存儲(chǔ)文文本和和二進(jìn)進(jìn)制的的基本本類抽象類類(Abstract):(TDes、TDesC、TDes8、TDesC8),描描述符符的基基類,,僅提提供接接口和和基本本功能能,不不能被被實(shí)例例化,,一般般只用用作函函數(shù)的的參數(shù)數(shù)。文字常常量(Literal):(TlitC、_LIT()),用用于存存儲(chǔ)文文字字字符串串(literalstring),即即C中中字符符串常常量,,通常常使用用_LIT()這種方方式,,也有有_L(),_L8()這種方方式。。棧類(Buffer):(TBuf、TBufC、TBuf8、TBufC8),數(shù)數(shù)據(jù)存存儲(chǔ)于于棧上上,最最基本本的描描述符符變量量類型型,大小在在編譯譯時(shí)確確定,包含含描述述符本本身數(shù)數(shù)據(jù),,使用用最為為普遍遍,具具體方方法如如下堆類(Heap):(HBufC、HBufC8),數(shù)數(shù)據(jù)存存儲(chǔ)于于堆上上,大大小在在運(yùn)行行時(shí)確確定,,也就是是用來來處理理動(dòng)態(tài)態(tài)申請請的描描述符符類。。在C/C++中用用過動(dòng)動(dòng)態(tài)內(nèi)內(nèi)存的的都知知道,,動(dòng)態(tài)內(nèi)內(nèi)存是是啥回回事,,這里里堆類類描述述符用用的時(shí)時(shí)候,,也是是差不不多,,由于于堆描描述符符沒有構(gòu)構(gòu)造函函數(shù),,所以以只能能聲明明為指指針類類型,,通過過堆描描述符符類內(nèi)內(nèi)靜態(tài)態(tài)函數(shù)數(shù)NewL方法申申請內(nèi)內(nèi)存,,具體體方法法如下下HBufC*errorTitleCode=HBufC::NewLC(50);HbufC*unUseCode=NULL;指針類類(Pointer):(TPtr、TPtrC、TPtr8、TPtrC8),本本身不不包含含描述述符數(shù)數(shù)據(jù),,但是是包含含長度度數(shù)據(jù)據(jù),而而且還還包含含一個(gè)個(gè)指向向位于于描述述符之之外數(shù)數(shù)據(jù)的的指針針。Symbian基本語語法描述符關(guān)關(guān)系簡圖圖Symbian基本語語法描述符的的使用文字描述述符常量量_LIT(KMyFile,“c:\System\Apps\MyApp\MyFile.jpg”);它可以以在任何何使用TDesC&的地方使使用。。//常用用的通知知函數(shù)NEikonEnvironment::MessageBox(_L("Error:initfilenotfound!"));//數(shù)字字轉(zhuǎn)字符符串TBuf16<20>buf;//TIntiNum=20;buf.Format(_L("%d"),iNum);棧描述符符棧類描述述符聲明明時(shí)必須須指定描描述符的的最大長長度,否否則無法法聲明和和定義,,舉例例如下:://直直接從字字符串中中構(gòu)造_LIT(Ktext,"TestText");TBufC<10>Buf(Ktext);//或或從字符符串賦值值TBufC<10>Buf2;Buf2=Ktext;//從從已有的的對象中中生成新新的TBufCTBufC<10>Buf3(Buf2);Symbian基本語語法描述符的的使用棧描述符符盡管這里里的對象象表示數(shù)數(shù)據(jù)是不不能被修修改的((因?yàn)橛杏袀€(gè)后綴綴C代表表了常量量的意思思),但但仍然有有兩種方方式可以以用來修修改數(shù)據(jù)據(jù)內(nèi)容::這里的的數(shù)據(jù)可可以用賦賦值的方方式替換換掉;使使用Des()函數(shù)構(gòu)構(gòu)造出一一個(gè)TPtr對對象,這這樣就可可以用它它來修改改數(shù)據(jù)。。_LIT(Ktext,"TestText");_LIT(Ktext1,"TestText””);_LIT(KXtraText,"New:");TBufC<10>Buf1(Ktext);//Buf1長長度為9內(nèi)容容“TestText””TBufC<10>Buf2(Ktext1);//Buf2長度度為10內(nèi)容容“Test1Text”//通通過賦值值的方式式改變數(shù)數(shù)據(jù)Buf2=Buf1;//Buf2長長度變?yōu)闉?內(nèi)內(nèi)容““TestText”//通過過使用Des()生成成指針改改變TBufC的數(shù)據(jù)據(jù)TPtrPointer=Buf1.Des();//刪刪除后四四個(gè)字符符Pointer.Delete(Pointer.Length()-4,4);//Buf1長長度變?yōu)闉?內(nèi)內(nèi)容“Test”//增增加新的的數(shù)據(jù)Pointer.Append(KXtraText);//Buf1長長度為9內(nèi)容容為“TestNew:””//也也可以使使用下列列方式改改變數(shù)據(jù)據(jù)TBufC<10>Buf3(NewText);Pointer.Copy(Buf3);//Buf1長度為為4,內(nèi)內(nèi)容為New1//或或直接從從字符串串里獲得得數(shù)據(jù)Pointer.Copy(NewText1);//Buf1長度度為4,,內(nèi)容為為New2Symbian基本語語法描述符的的使用棧描述符符可修改的的描述符符TBuf,TBuf8就就不用通通過那么么復(fù)雜的的方法來來實(shí)現(xiàn)修修改,它它直接可可以用Copy、Delete等方方法,但但是無論論可修改改的還是是不可修修改的,,一旦指指定最大大的數(shù)據(jù)據(jù)長度后后,最大大長度就就不能進(jìn)進(jìn)行修改改了修改改的只是是數(shù)據(jù)內(nèi)內(nèi)容,而而數(shù)據(jù)內(nèi)內(nèi)容修改改的受限限條件是是不能超超過聲明明或定義義時(shí)的最最大長度度。堆描述符符堆描述符符HBufC,HbufC8雖然都都是不可可修改類類型的,,但是它它仍然具具有構(gòu)造造和修改改,與棧棧描述符符不同的的是:首首先對內(nèi)內(nèi)存需要要顯示釋釋放,其其次是堆堆描述符符沒有最最大長度度的限制制,任何何時(shí)候都都可以用用ReAlloc())函數(shù)重重新申請請分配。。有兩種種方式來來生成一一個(gè)堆描描述符示示例://第一一種方式式用New(),NewL(),或或NewLC()HBufC*Buf=HBufC::NewL(15);//第二二種方式式是采用用Alloc(),AllocL()或AllcLC()來處處理_LIT(KText,"TestText");TBufC<10>CBuf=KText;HBufC*Buf1=CBuf.AllocL();CleanupStack::PushL(Buf1);堆描述符符的修改改方式:://1.賦值方方式改變變其數(shù)據(jù)據(jù)的方法法_LIT(KText1,"Text1");*Buf1=KText1;Symbian基本語語法描述符的的使用堆描述符符堆描述符符的修改改方式:://2.通過過可修改改指針來來改變數(shù)數(shù)據(jù)的方方式TPtrPointer=Buf1->Des();Pointer.Delete(Pointer.Length()-2,2);//刪除除數(shù)據(jù)_LIT(KNew,"New:");Pointer.Append(KNew);//添加數(shù)數(shù)據(jù)重新申請請內(nèi)存Buf1=Buf1->ReAllocL(KText().Length()+KNew().Length());CleanupStack::PushL(Buf1);釋放內(nèi)存存deleteBuf;Buf=NULL;指針描述述符不可修改改的指針針TPtrC可可用TBuf和TBufC構(gòu)造出出TPtrC對對象_LIT(KText,"TestCode");TBufC<10>Buf(KText);//或者者為TBuf<10>Buf(KText);TPtrCPtr(Buf);//使使用構(gòu)造造函數(shù)初初始化TPtrCPtr1;Ptr1.Set(Buf);//利用用set函數(shù)初初始化Symbian基本語語法描述符的的使用指針描述述符不可修改改的指針針TPtrC用TText*構(gòu)造TPtrCconstTText*text=_S("HelloWorld\n");TPtrCptr(text);//或或者TPtrCPtr2;Ptr2.Set(text);//如果果要存儲(chǔ)儲(chǔ)TText的的一部分分?jǐn)?shù)據(jù),,我們使使用下列列方法TPtrCptr4(text,5);從另一個(gè)個(gè)TPtrC中中構(gòu)造TPtrCconstTText*text1=_S("HelloWorld\n");TPtrCPtr3(text1);//從從一個(gè)TPtrC中獲獲得另一一個(gè)TPtrCTPtrCp1(Ptr3);//或或TPtrCp2;p2.Set(Ptr3);可修改的的TPtr同同不可修修改的指指針描述述符構(gòu)造造方法基基本類似似,區(qū)別別在于,,不可修修改的指指針描述述符TPtrC的函數(shù)數(shù)始終是是不可修修改的,,因此沒沒有Insert,Delete等等函數(shù),,并且沒沒有Des()函數(shù),,但有Alloc(),Compare(),Find(),Mid(),Size()等函數(shù)數(shù)。Symbian基本語語法動(dòng)態(tài)數(shù)組組在傳統(tǒng)c/c++中經(jīng)常會(huì)會(huì)使用數(shù)數(shù)組來存存儲(chǔ)序列列,它是是具有相相同數(shù)據(jù)據(jù)類型的的數(shù)據(jù)元元素的集集合,通通過數(shù)組可以很很方便的的實(shí)現(xiàn)數(shù)數(shù)據(jù)元素素的訪問問等相關(guān)關(guān)操作。。動(dòng)態(tài)數(shù)數(shù)組是一一個(gè)類的的模板,,可以接接受各種種各樣的數(shù)據(jù)類類型,SymbianOS主要提供供了3類動(dòng)態(tài)數(shù)數(shù)組:RArray<classT>,RPointerArray<classT>,CArray<classT>活動(dòng)對象象在symbianos中中活動(dòng)對對象是一一種非搶搶先式多多任務(wù)處處理的機(jī)機(jī)制,是是symbianos中中一個(gè)十分重重要的概概念??煽捎糜谔嫣娲鶶ymbianOS中中的多線線程。。使用活活動(dòng)對象象可獲得得的好處處是:在在同一個(gè)線程程中運(yùn)行行的活動(dòng)動(dòng)對象之之間進(jìn)行行切換的的代價(jià)要要比線程程上下文文的切換換代價(jià)低低,這使使得對于于各種資源比較較緊張的的SymbianOS來說說,使得得活動(dòng)對對象更適適合事件件驅(qū)動(dòng)多多任務(wù)。。概念:一一個(gè)活動(dòng)動(dòng)對象必必須派生生自基類類CActiveclassCActive:publicCBase{

public:enumTpriority

{EPriorityIdle=-100;EPriorityLow=-20;EPriorityStandard=0;EPriorityUserInput=10;EPriorityHigh=20;}Symbian基本語語法活動(dòng)對象象public:IMPORT_C~CActive();IMPORT_CvoidCancel();//刪除未未完成請請求的函函數(shù)………IMPORT_CvoidSetPriority(TIntaPriority);InlineTBoolIsActive()const;…………

protected:IMPORT_CCActive(TIntaPriority);IMPORT_CvoidSetActive();virtualvoidDoCancel()=0;//兩個(gè)個(gè)純虛函函數(shù),繼繼承類必必須實(shí)現(xiàn)現(xiàn)它們virtualvoidRunL()=0;//處理理函數(shù)IMPORT_CvirtualTIntRunError(TIntaError);public:TrequestStatusiStatus;//代表請請求狀態(tài)態(tài)……….private:TBooliActive;……….}構(gòu)造時(shí)也會(huì)有有一個(gè)優(yōu)先級級值來決定它它們?nèi)绾伪徽{(diào)調(diào)度Cancel和DoCancel用來取消發(fā)發(fā)出的請求,,Docancel是一一個(gè)純虛函數(shù)數(shù),需要由派派生類實(shí)現(xiàn)。。Cancel的功能就就是調(diào)用DoCancel,如果用用戶取消當(dāng)前前請求調(diào)用Cancel而不是DoCancel,但在代代碼中要實(shí)現(xiàn)現(xiàn)DocancelSymbian基本語法法活動(dòng)對象IsActive確定活活動(dòng)對象是否否處于活動(dòng)狀狀態(tài)SetActive激激活活動(dòng)對象象,一般在調(diào)調(diào)用請求后緊緊接著調(diào)用它它。RunL異異步事件處理理函數(shù),當(dāng)一一個(gè)請求完成成時(shí),活動(dòng)對對象調(diào)度器會(huì)會(huì)調(diào)用這個(gè)函函數(shù),進(jìn)行下下一步處理RunError當(dāng)RunL函數(shù)數(shù)出現(xiàn)異常時(shí)時(shí)會(huì)出現(xiàn)RunError函數(shù),它它也是純虛函函數(shù),需要派派生類實(shí)現(xiàn)。。具體例子見文文檔。文件管理symbian系統(tǒng)采用用了C/S(客戶端/服服務(wù)器)的架架構(gòu)。對于文文件操作,系系統(tǒng)有一個(gè)文文件系統(tǒng)管理理的服務(wù)器。程序通通過聯(lián)結(jié)這個(gè)個(gè)文件管理服服務(wù)器來進(jìn)行行文件。在symbianos中,F(xiàn)lash(閃閃存)通常被被定義在c盤盤,symbian智能能手機(jī)中還有有一個(gè)ROM存儲(chǔ)器通常被映射在在z盤,用戶戶的許多文件件也存放在z盤。其他可可移動(dòng)存儲(chǔ)((如存儲(chǔ)卡))則映射在d,e等盤符。symbian開發(fā)環(huán)境境下各盤符對對應(yīng)的映射關(guān)關(guān)系:客戶機(jī)c:盤盤對應(yīng)開開發(fā)平臺(tái)中sdk的\epoc32\wins\c目錄錄客戶機(jī)d:盤盤對應(yīng)開開發(fā)平臺(tái)中sdk的\epoc32\wins\d目錄客戶機(jī)z:盤盤對應(yīng)應(yīng)開發(fā)平臺(tái)中中sdk的\epoc32\release\wins\urel\z目錄或者者\(yùn)epoc32\release\wins\urel\z文件命名規(guī)則則一個(gè)完整的symbianos文文件應(yīng)該包包含以下四個(gè)個(gè)部分1.驅(qū)動(dòng)器名名,即盤符2.路徑,,從根目錄到到或當(dāng)前會(huì)話話目錄起到文文件經(jīng)過的所所有目錄路徑徑3.文件名,,遵循c/c++命名規(guī)規(guī)范4.文件擴(kuò)展名名例如:c:\myfile\data.txt就是合法的的文件名,一一個(gè)完整的文文件名不能超超過255個(gè)個(gè)字符。Symbian基本語法法文件管理文件訪問流程程1.應(yīng)用程序序要進(jìn)行文件件讀寫之前,,必須建立應(yīng)應(yīng)用程序與文文件服務(wù)器的的連接,這種種連接也稱會(huì)會(huì)話(session)),Sysmbianos中提供供RFs類來來實(shí)現(xiàn)這個(gè)功功能,該類提提供了Connect()和Close()函函數(shù)來建立和和關(guān)閉連接。。RFsfsSession;//建建立RFs類類的對象User::LeaveIfError(fsSession.Connect());//建立立連接,為防防止出現(xiàn)異常常放User::LeaveIfError中fsSession.Close();//用完關(guān)閉閉連接2.文件服務(wù)務(wù)器可以實(shí)現(xiàn)現(xiàn)文件的讀、、寫、刪、建建,通過RFile的Open(RFsaFs,constTDesC&aName,TUnitaFileMode)打打開文件。。通過Write()和和Read()可以實(shí)實(shí)現(xiàn)文件的寫寫和讀。RFile的的Create()用用于建立新文文件。刪除文件可以以使用RFs的Delete()。3.另一種比比較重要的文文件讀寫方式式----流(Stream)文件輸出流RWriteStream和文文件輸入流RReadStream文件輸出六主主要使用RWriteStream的派生類類RFileWriteStream將數(shù)據(jù)據(jù)外化為流,,它需要先打打開一個(gè)文件件,打開文件件的兩種方式式:OpenL::當(dāng)文件件不存在會(huì)產(chǎn)產(chǎn)生異常,所所以必須保證證文件存在Replace:文件件存在刪除并并重建新的,,不存在就創(chuàng)創(chuàng)建,因每次次都創(chuàng)建文件件,會(huì)帶來額額外開銷。例子:RFileWriteStreamwriter;writer.PushL();//writeroncleanupstackUser::LeaveIfError(writer.Replace(iCoeEnv->FsSession(),*iFileName,EFileWrite));writer<<*iText; //writethetextwriter.CommitL();CleanupStack::PopAndDestroy();//釋放放資源從存儲(chǔ)中讀取取數(shù)據(jù)的方法法就是將以上上的過程反向向Symbian基本應(yīng)用用數(shù)據(jù)庫管理Symbian系統(tǒng)的DBMS提供供了創(chuàng)建與維維持?jǐn)?shù)據(jù)庫的的功能,通過過本地調(diào)用和和SQL調(diào)用用,其可以對對數(shù)據(jù)庫進(jìn)行安全全可靠的數(shù)據(jù)據(jù)訪問。這種種調(diào)用支持事事務(wù)/回滾機(jī)機(jī)制用以保證證所有數(shù)據(jù)被被寫入或數(shù)據(jù)據(jù)為空的情形獲得支持。。DBMS的管管理結(jié)構(gòu)和元元素任何Symbian系統(tǒng)統(tǒng)的DBMS都采用層次次性的結(jié)構(gòu)——最底層是保保存數(shù)據(jù)庫的的文件倉庫。。Symbian操作系統(tǒng)統(tǒng)的DBMS是一個(gè)功能能強(qiáng)大,或?yàn)闉檩p量集的數(shù)數(shù)據(jù)庫關(guān)系系系統(tǒng)實(shí)現(xiàn)。它它支持普通的的添加/查找//檢索/更新新/刪除功能能,同時(shí)它還還支持基本的的結(jié)構(gòu)化查查詢語言(StructuredQueryLanguage:SQL),數(shù)據(jù)據(jù)定義語言((DataDefinitionLanguage:DDL)和和數(shù)據(jù)建模語語言(DataModelingLanguage:DML)語句處理理。永久文件存儲(chǔ)儲(chǔ)系統(tǒng)和流Symbian系統(tǒng)的的DBMS依依賴于文件服服務(wù)器提供的的資源,Symbian系統(tǒng)所的永永久文件存儲(chǔ)儲(chǔ)和流能提供系統(tǒng)所需要要的底層存儲(chǔ)儲(chǔ)功能。永永久文件系統(tǒng)統(tǒng)通過使用CPermanentFileStore來來獲得,它是是一個(gè)源自CFileStore的具體體類。這些些類在文件件存儲(chǔ)API中定義義,可為DBMS提提供組建模模塊。創(chuàng)建數(shù)據(jù)庫庫(1)RDbStoreDatabase:通通過文件存存儲(chǔ)打開的的數(shù)據(jù)庫,,提供了進(jìn)進(jìn)行數(shù)據(jù)庫庫操作的API,獨(dú)獨(dú)占使用數(shù)數(shù)據(jù)庫,不可可共享使用用。(2)RDbNamedDatabase:通通過文件名名打開的數(shù)數(shù)據(jù)庫,同同樣提供API。使使用C/S模式,可可以共享使使用(3)CDbColSet::數(shù)據(jù)庫字字段的集合合,可用于于在數(shù)據(jù)庫庫中創(chuàng)建表表格。(4)使用用到的庫和和頭文件::ws32.libedbms.libd32dbms.hf32file.hs32file.h創(chuàng)建步驟::(1)數(shù)據(jù)據(jù)庫類的聲聲明:將RFs和RDbStoreDatabase聲聲明為數(shù)據(jù)據(jù)成員。classCMiapSampleDatabase:publicCBase{Symbian基本本應(yīng)用數(shù)據(jù)庫管理理public://SomeFunctionsprivate:

RFsiFsSession;

RDbStoreDatabaseiDb;};(2)創(chuàng)建建數(shù)據(jù)庫::

首先打打開一個(gè)文文件流存儲(chǔ)儲(chǔ)(FileStore),,通過調(diào)用用RDbStoreDatabase::CreateL(CStreamStore*aStore)來來創(chuàng)建數(shù)據(jù)據(jù)庫。最后后將文件流流提交。_LIT(KFileName,"C:\\DataBase.db");

CFileStore*FileStore=CPermanentFileStore::ReplaceL(iFsSession,KFileName,EFileRead|EFileWrite);

CleanupStack::PushL(FileStore);

FileStore->SetTypeL(FileStore->Layout());TStreamIdid=iDb.CreateL(FileStore);

FileStore->SetRootL(id);FileStore->CommitL();

CleanupStack::PopAndDestroy(FileStore);iOpen=ETrue;

iDb.Close();Symbian基本本應(yīng)用數(shù)據(jù)庫管理理(3)創(chuàng)建建表格:通通過文件件流存儲(chǔ)打打開數(shù)據(jù)庫庫:

_LIT(KFileName,"C:\\DataBase.db");CFileStore*FileStore=CPermanentFileStore::OpenLC(iFsSession,KFileName,EFileRead|EFileWrite);FileStore->SetTypeL(FileStore->Layout());

iDb.OpenL(FileStore,FileStore->Root());添加字段::

_LIT(KId,"Id");

_LIT(KText,"Text");_LIT(KTableName,"Table");

TDbColIdCol(KId,EDbColText);TDbColTextCol(KText,EDbColText);CDbColSet*ColSet=CDbColSet::NewLC();ColSet->AddL(IdCol);

ColSet->AddL(TextCol);創(chuàng)創(chuàng)建表表格:User::LeaveIfError(iDb.CreateTable(KTableName,*ColSet));釋放不使用用的內(nèi)存::

CleanupStack::PopAndDestroy(ColSet);

CleanupStack::PopAndDestroy(FileStore);Symbian基本本應(yīng)用數(shù)據(jù)庫管理理(4)創(chuàng)建建索引:TDbKeyColIdKey(KId);CDbKey*key=CDbKey::NewLC();

key->AddL(IdKey);

User::LeaveIfError(iDb.CreateIndex(KTableName,KTableName,*key));

CleanupStack::PopAndDestroy(key);首首先創(chuàng)創(chuàng)建一個(gè)索索引對象,,將其添加加到索引集集合中,通通過調(diào)用RDbStoreDatabase::CreateIndex(constTDesC&aName,constTDesC&aTable,constCDbKey&aKey)創(chuàng)創(chuàng)建表格,,最后清除除不使用的的內(nèi)存。(5)插入入記錄:_LIT(KIdText,"100001");首先打打開數(shù)據(jù)庫庫。打開表表:

RDbTabletable;

CleanupClosePushL(table);User::LeaveIfError(table.Open(iDb,aTableName,table.EUpdatable));獲獲取字段集集合:CDbColSet*ColSet=table.ColSetL();CleanupStack::PushL(ColSet);

添加記記錄:table.Reset();

table.InsertL();table.SetColL(ColSet->ColNo(KId),KIdText);

table.PutL();CleanupStack::PopAndDestroy(2);//清除內(nèi)內(nèi)存:注意:每插插入一條記記錄,就必必須調(diào)用table.InsertL(),設(shè)設(shè)置完值后后,必須調(diào)調(diào)用table.PutL()提交。。Symbian基本本應(yīng)用(6)查詢詢記錄:首首先打開開數(shù)據(jù)庫和和表。TPtrCptrc;for(table.FirstL();table.AtRow();table.NextL())

{table.GetL();

ptrc.Set(table.ColDes(colSet->ColNo(KId)));}

table.FirstL()將焦點(diǎn)設(shè)設(shè)置為第一一條記錄,,table.AtRow()驗(yàn)證下下一條記錄錄是否存在在,table.NextL()將焦焦點(diǎn)移動(dòng)到到下一條記記錄。每每查詢一條條記錄,必必須調(diào)用table.GetL();

使用TPtrC::Set()將將查詢結(jié)果果寫進(jìn)描述述符。(7)執(zhí)行行SQL語語句:首首先打開數(shù)數(shù)據(jù)庫。TBuf<256>SQL;

SQL.Append(_L("http://SomeSQL"));

RDbUpdateDbUpdate;

TIntincStat=DbUpdate.Execute(iDb,SQL,EDbCompareNormal);incStat=DbUpdate.Next();

while(incStat==1){

incStat=DbUpdate.Next();

}DbUpdate.Close();Symbian基本本應(yīng)用SymbianGUI編程程60系列用用戶界面顯顯示器規(guī)范范如下:分辨率:176像素素(寬)××208像像素(高))正方形像素素物理尺寸::約35mm(寬),41mm(高),對對應(yīng)約0.2mm的的象素點(diǎn)距距。顏色數(shù)(4096色色或更多))SymbianGUI編程程SymbianGUI編程程顯示器按照照一定的層層次結(jié)構(gòu)進(jìn)進(jìn)行布局。。布局由被被稱為窗口口(windows)和窗格格(panes)的的組件構(gòu)建建。屏幕(Screen)是最頂頂層的顯示示組件,對對應(yīng)于物理理屏幕的整整個(gè)象素區(qū)區(qū)域。窗口(Window)屏幕(screen)是窗口口的唯一父父組件。一一般情況下下一個(gè)窗口口會(huì)充滿整整個(gè)屏幕,,但有時(shí)也也存在一些些小窗口((臨時(shí)性的的),它們們只占據(jù)屏屏幕的一部部分,環(huán)繞繞其周圍的的部分是可可見的。每個(gè)應(yīng)用程程序都在自自己的窗口口中運(yùn)行。。應(yīng)用程序序也可以調(diào)調(diào)用其它的的臨時(shí)窗口口。窗格(Pane)窗格是窗口口(window)的子組件件。一個(gè)窗口可可以包含多多個(gè)窗格,,而每個(gè)窗窗格又可以以包含多個(gè)個(gè)子窗格,,如此等等等。不含有有子組件的的底層組件件被稱為元元素(element)。應(yīng)用窗口應(yīng)用窗口是是覆蓋整個(gè)個(gè)屏幕的主主窗口。通通常它并不不直接用于于顯示,而而是作為各各種窗格的的父組件。一個(gè)典型的的應(yīng)用窗口口由下幾種種窗格組成成:-狀態(tài)窗窗格-主窗格格-控制窗窗格SymbianGUI編程程GUI應(yīng)用用程序的基基本組成部部分Application負(fù)責(zé)啟動(dòng)方方面的工作作Document負(fù)責(zé)永久保保持的工作作AppUI負(fù)責(zé)接受并并處理用戶戶的命令A(yù)ppView負(fù)責(zé)圖形顯顯示的工作作Model可選:負(fù)責(zé)責(zé)處理數(shù)據(jù)據(jù)view架架構(gòu)view是是一個(gè)執(zhí)行行特定任務(wù)務(wù)的一屏同一時(shí)刻,,view管理系統(tǒng)統(tǒng)只允許一一個(gè)view處于激激活狀態(tài)每個(gè)view都有一一個(gè)ID每個(gè)view必須到到viewserver上上去登記調(diào)用ActiveViewL()還能能夠激活其其它應(yīng)用程程序的views在view之之間間能能夠夠傳傳遞遞消消息息classCMyView:publicCAknViewCCoeControl框框架架主要要內(nèi)內(nèi)容容簡單單控控件件CCoeControl概概述述控件件的的初初始始化化控件件的的重重繪繪用戶戶輸輸入入處處理理((按按鍵鍵事事件件))復(fù)合合控控件件常用用控控件件對話話框框表格格資源源菜單單軟鍵鍵熱鍵鍵CCoeControl框框架架WINDOWSserverCCoeControl框框架架WINDOWSserverCoeControl可以以作作為為視視圖圖的的基基類類傳統(tǒng)統(tǒng)的的EIKON視視圖圖架架構(gòu)構(gòu)--containerdialog負(fù)責(zé)責(zé)應(yīng)應(yīng)用用程程序序視視圖圖區(qū)區(qū)域域的的顯顯示示工工作作一個(gè)個(gè)應(yīng)應(yīng)用用程程序序的的界界面面分分為為三三部部分分標(biāo)題題欄欄軟鍵鍵區(qū)區(qū)域域應(yīng)用用程程序序視視圖圖區(qū)區(qū)域域((右右圖圖的的黑黑框框部部分分))使用用CGraphicsContext進(jìn)進(jìn)行行畫畫圖圖在UI平平臺(tái)臺(tái)能能力力范范圍圍內(nèi)內(nèi)工工作作((如如::60系系列列))系統(tǒng)統(tǒng)提提供供的的常常用用控控件件有有按鈕鈕編輯輯器器文本本標(biāo)標(biāo)簽簽列表表框框可以以內(nèi)內(nèi)嵌嵌其其它它控控件件((又又稱稱定定制制控控件件,,或或者者復(fù)復(fù)合合控控件件))CoeControl所有有對對屏屏幕幕的的操操作作都都是是在在控控件件上上進(jìn)進(jìn)行行控件件從從CCoeControl繼繼承承而而來來控件件是是屏屏幕幕上上的的一一個(gè)個(gè)矩矩形形區(qū)區(qū)域域控件件占占據(jù)據(jù)窗窗口口的的全全部部或或者者部部分分應(yīng)用用程程序序的的視視圖圖使使用用至至少少一一個(gè)個(gè)控控件件控件件可可以以處處理理用用戶戶的的輸輸入入事事件件鍵盤盤事事件件鼠標(biāo)標(biāo)事事件件CoeControl是所所有有控控件件的的基基類類被派派生生類類直直接接調(diào)調(diào)用用的的函函數(shù)數(shù)SetRect(())CreateWindowL(())被派派生生類類重重載載的的函函數(shù)數(shù)OfferKeyEventL()Draw()所擁擁有有的的函函數(shù)數(shù)可可以以分分為為以以下下三三類類初始始化化Drawing用戶戶輸輸入入處處理理初始始化化classCAbcContainer:publicCCoeControl{public://ConstructorsanddestructorvoidConstructL(constTRect&aRect);~CAbcContainer();private://FunctionsfrombaseclassesvoidSizeChanged();voidDraw(constTRect&aRect)const;};voidCAbcContainer::ConstructL(constTRect&aRect){CreateWindowL();SetRect(aRect);ActivateL();}初始化classCAbcContainer:publicCCoeControl{public://ConstructorsanddestructorvoidConstructL(constTRect&aRect);~CAbcContainer();private://FunctionsfrombaseclassesvoidSizeChanged();voidDraw(constTRect&aRect)const;};voidCAbcContainer::ConstructL(constTRect&aRect){CreateWindowL();SetRect(aRect);ActivateL();}DrawingvirtualvoidDraw(constTRect&aRect)const;負(fù)責(zé)產(chǎn)生控件件的圖形化外外觀重要提示基類中的該函函數(shù)為空,在在派生類中如如果不實(shí)現(xiàn)該該函數(shù)的話控控件將不可見見該方法由應(yīng)用用程序框架調(diào)調(diào)用,不要自自己調(diào)用該函函數(shù)方法是const,意味味著你在Draw()中中不能更改任任何成員變量量,或者調(diào)用用任何不是const的的函數(shù)。該函數(shù)不允許許leave,因此你必必須用TRAP封裝可能能leave的函數(shù)Draw()voidCAbcContainer::Draw(constTRect&aRect)const{CWindowGc&gc=SystemGc();gc.SetPenStyle(CGraphicsContext::ENullPen);gc.SetBrushColor(KRgbDarkBlue);gc.SetBrushStyle(CGraphicsContext::ESolidBrush);gc.DrawRect(aRect);//gc.Clear()}圖形設(shè)備接口口GDI抽象類CGraphicsContext(圖圖形上下文))定義了一致致的接口派生類CWindowGc和CFbsBitGc具體實(shí)現(xiàn)現(xiàn)了這些接口口可以直接使用用CFbsBitGc繪繪圖,但不推推薦:推薦的繪圖方方式建議在程序中中使用CWindowGc提供的接接口圖形上下文CWindowGc&SystemGc())const用來獲取取當(dāng)前的圖形形上下文提供了許多有有用的繪圖函函數(shù)畫點(diǎn)、線、橢橢圓、矩形、、位圖等等改變畫筆/畫畫刷的顏色和和風(fēng)格改變字體設(shè)置裁剪區(qū)域域,原點(diǎn)在某一時(shí)刻CWindowGc只能能由一個(gè)窗口口激活voidActivate(RDrawableWindow&aWindow)voidDeactivate()控件的重繪(redraw)更新在屏幕上上的顯示兩種類型系統(tǒng)發(fā)起的windowserver我們“必須””重繪控件應(yīng)用程序發(fā)起起的內(nèi)部狀態(tài)改變變我們“想要””重繪控件系統(tǒng)發(fā)起的重重繪當(dāng)windowserver檢測測到可能使一一個(gè)區(qū)域無效效的事件對話框/菜單單不再需要時(shí)時(shí)啟動(dòng)一個(gè)GUI程序時(shí)發(fā)送redraw消息給給擁有窗口的的應(yīng)用程序應(yīng)用程序通過過CONE發(fā)發(fā)送消息給相相關(guān)的控件調(diào)用控件的Draw()函數(shù)應(yīng)用發(fā)起的重重繪通常是某個(gè)內(nèi)內(nèi)部狀態(tài)改變變的結(jié)果實(shí)現(xiàn)方法有以以下幾種:Invalidate控控件窗口的某某部分,讓windowserver發(fā)送一一個(gè)redraw消息請求CONE立即重繪整整個(gè)控件立即重繪控件件的某個(gè)部分分所有的實(shí)現(xiàn)方方法最終都是是調(diào)用Draw()函數(shù)數(shù)redraw的類型立即重繪整個(gè)個(gè)控件CCoeControl::DrawNow()在程序初始化化時(shí)采用一旦有機(jī)會(huì)就就重繪整個(gè)窗口:voidCCoeControl::DrawDeferred()const部分窗口:voidRWindow::Invalidate(constTRect&)立即重繪已知知無效的部分分voidCSemView::DrawSunNow()const{Window().Invalidate(iSunArea);ActivateGc();Window().BeginRedraw(iSunArea);DrawSun();Window().EndRedraw();DeactivateGc();}更多Draw()的信息息參數(shù)aRect指定重繪的區(qū)區(qū)域相對于控件的的原點(diǎn)(左上上角)對于簡單控件件,通常重繪繪整個(gè)控件對于復(fù)合控件件,只重繪部部分控件防止屏幕閃爍爍只重繪位于無無效區(qū)域的部部分不要短時(shí)間內(nèi)內(nèi)多次重繪某某個(gè)區(qū)域盡量避免大面面積的重繪處理按鍵事件件控件能夠檢測測并處理按鍵鍵事件按鍵事件的處處理是獨(dú)立于于資源文件定定義的熱鍵處處理之外的UI框架已經(jīng)經(jīng)實(shí)現(xiàn)了大部部分的按鍵處處理典型應(yīng)用導(dǎo)航鍵選擇鍵CONE控件件堆棧按鍵事件由系系統(tǒng)通告給對對其感興趣的的控件在一個(gè)特殊的的數(shù)據(jù)結(jié)構(gòu)((CONE控控件堆棧)中中登記感興趣趣的控件系統(tǒng)給控件發(fā)發(fā)送OfferKeyEventL事件CONE控件件堆棧中的控控件被一一通通告事件的發(fā)發(fā)生,直至某某個(gè)控件宣稱稱接收了該事事件控件按優(yōu)先級級被通告事件件的發(fā)生控件必須告知知系統(tǒng)是否接接收了該事件件如果沒有任何何控件宣稱接接收一個(gè)事件件,則最后將將由AppUi在它的CMyAppUi::HandleKeyEventL()中處理該該事件AppUi對對按鍵事件的的處理在CONE控控件堆棧中登登記控件voidCtestAppUi::ConstructL(){BaseConstructL();iAppContainer=new(ELeave)CtestContainer;iAppContainer->SetMopParent(this);iAppContainer->ConstructL(ClientRect());AddToStackL(iAppContainer);iAppContainer2=new(ELeave)CtestContainer2;iAppContainer2->SetMopParent(this);iAppContainer2->ConstructL(ClientRect());AddToStackL(iAppContainer2);}在析構(gòu)的時(shí)候候?qū)⒖丶腃ONE控件件堆棧中注銷銷CtestAppUi::~CtestAppUi(){if(iAppContainer){RemoveFromStack(iAppContainer);deleteiAppContainer;}}CCoeControl對按鍵事件件的處理TKeyResponseOfferKeyEventL(constTKeyEvent&aEvent,TEventCodeaType)TKeyResponseCMyGameView::OfferKeyEventL(constTKeyEvent&aKeyEvent,TEventCodeaType){switch(aType){caseEEventKey:if(aKeyEvent.iScanCode==EStdKeyNkp5||aKeyEvent.iScanCode==EStdKeyDevice3){iMyGameEngine->Fire();returnEKeyWasConsume

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論