版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
SymbianOS開發(fā)培訓InspurCommunicationInformationSystemsCo.,Ltd
SymbianOS概述
1998年6月,諾基亞(NOKIA)、摩托羅拉(MOTOROLA)、愛立信(ERICSSON)、三菱(MITSUBISHI)和Psion在英國倫敦共同投資成立Symbian公司。這個公司成立的目的是為了能夠設計并開發(fā)出一種可以在手機及其他類似的移動通訊終端產品上運行的開放性操作系統(tǒng),以此來推動高端智能移動電話及類似的終端產品盡快進入大眾消費領域。之后有西門子(SIEMENS)、三星(SAMSUNG)、松下(Panasonic)、索尼愛立信(SonyEricsson)等手機廠商相繼入資,現(xiàn)如今,Symbian操作系統(tǒng)的智能手機已經占據了世界智能手機市場超過80%的份額。SymbianOS概述
Symbian是一個實時性、多任務的純32位操作系統(tǒng),具有功耗低、內存占用少等特點,非常適合手機等移動設備使用,經過不斷完善,可以支持GPRS、藍牙、SyncML、以及3G技術。Symbian是一個標準化的開放式平臺,任何人都可以為支持Symbian的設備開發(fā)軟件。與微軟產品不同的是,Symbian將移動設備的通用技術,也就是操作系統(tǒng)的內核,與圖形用戶界面技術分開,能很好的適應不同方式輸入的平臺,也可以使廠商可以為自己的產品制作更加友好的操作界面,符合個性化的潮流SymbianOS概述
目前SymbianOS手機有三種開發(fā)SDK:NokiaSeries80:主要機型有Nokia9200系列NokiaSeries60:主要機型包括諾基亞7650、6600、西門子SX1等UIQ2、UIQ3:SonyEricssonP800,P900SonyEricssonP900開發(fā)平臺搭建安裝ActivePerl(x86和x64分別對應32位和64位cpu)jre(java的應用平臺)SymbianOSSDK(建議安裝在盤符根目錄下)(C++)開發(fā)工具手機軟件開發(fā)過程:開發(fā)平臺搭建第一步:安裝開發(fā)軟件,搭建開發(fā)環(huán)境(下面主要介紹series60sdk,其余類似)第二步:在模擬器上開發(fā)調試(以VC環(huán)境開發(fā)為例)第三步:生成sis文件,在手機上安裝運行幾種開發(fā)環(huán)境:開發(fā)平臺搭建VisualC++6.0BorlandC++Builder6CarbideC++開發(fā)平臺搭建Symbian工程aifdatagroupincsrcsis工程基本目錄結構:1.aif用來存放程序圖標2.data用來存放運行所需要的資源文件.rss。3.group中比較重要的幾個文件:bld.inf、*.mmp。4.inc和src存放工程頭文件和源代碼文件。5.sis用來存放程序打包所需要的pkg文件,打包后生成的安裝文件.sis也存放在此處。bld.inf聲明build的相關信息通常只包括這次build會引用到的mmp文件。例如:PRJ_MMPFILES
hello.mmp2..mmp文件保存工程編譯相關信息,主要內容如下
TARGEThello.app//目標名稱TARGETTYPEapp//目標類型UID0x100039CE0x07B9DE87//UID唯一系統(tǒng)標示符TARGETPATH\system\apps\hello//目標路徑SOURCEPATH..\src//源代碼存放位置SOURCEhelloApp.cpp//源代碼列表…
開發(fā)平臺搭建
SOURCEPATH..\data//資源文件路徑RESOURCEhello.rss//資源文件LANGSC//默認英語
USERINCLUDE.USERINCLUDE..\inc//頭文件路徑SYSTEMINCLUDE.\epoc32\include//系統(tǒng)包含文件目錄LIBRARYeuser.libapparc.libcone.libeikcore.libLIBRARYeikcoctl.libavkon.lib//庫文件3.UIDUID1-第一個UID(類型):
UID1用來設定該應用程序是一個執(zhí)行程序(executablefile)還是一個數(shù)據文件(datafile).UIDvalueNumericvalue(Hex)MeaningKExecutableImageUid0x1000007A.exe可執(zhí)行文件KDaynamicLibraryUid0x10000079.dll.app.ldd,.pdd文件KDirectFileStoreLayoutUid0x10000037directfilestoreKPermanentFileStoreLayoutUid0x10000050permanentfilestoreUID2-第第二二個個UID((子子類類型型)):UID2-具具體體含含義義取取決決于于UID1的的值值::如果果UID1是是KExecutableImageUid,UID2不不使使用用,,所所以以UID2的的值值可可以以隨隨意意取取。。如果果UID1是是KDynamicLibraryUid,UID2將將會會是是::如果果UID1是是KDirectFileStoreLayoutUid或或者者KPermanentFileStoreLayoutUid,那那么么UID2將將是是::UIDvalueNumericvalue(Hex)MeaningKSharedLibraryUid0x1000008D.dllKUidApp0x100039CE.appKLogicalDeviceDriverUid0x100000AFalogicaldecivedriver(.ldd)KPhysicalDeviceDriverUid0x100039D0aphysicaldevicedriver(.pdd)UIDvalueNumericvalue(Hex)MeaningKUidAppDllDoc0x10003A12indicatesthisisafilestorecreatedbyan.apptostoreuserdata(i.e,adocument)KUidAppInfoFile0x10003A38IndicatesthisisanAIFfile(atypeoffilestore)UID3-第第三三個個UID(子子子子類類型型)::每個個獨獨立立的的應應用用程程序序有有一一個個唯唯一一的的UID3值值,,它它也也被被用用作作安安全全ID(secureID),對對于于UIKON應應用用程程序序而而言言,,用用于于關關聯(lián)聯(lián)數(shù)數(shù)據據文文件件和和程程序序::1.對對于于dll和和exe文文件件,,它它辯辯識識特特定定的的二二進進制制(itidentifiedtheparticularbinary)。。2.對對于于.app((UIKON應應用用程程序序)),,它它辯辯識識特特定定的的應應用用程程序序(itidentifiedtheparticularapplicationprogram).3.對對于于由由.apps創(chuàng)創(chuàng)建建的的文文件件存存儲儲(filestores),,它它辯辯識識和和該該文文件件相相關關的的應應用用程程序序(itidentifiestheapplicationprogramassociatedwiththisfile).4.對對于于其其他他文文件件存存儲儲(filestores),它它沒沒有有典典型型的的用用途途((但但是是你你可可以以自自定定義義它它的的用用途途))Symbian命命名名約約定定Symbian大大致致分分了了四四種種類類C::C前前綴綴表表示示類類從從CBase派派生生并并應應該該基基于于堆堆構構造造。。T::T前前綴綴表表示示一一個個簡簡單單類類,,這這種種類類不不擁擁有有任任何何額額外外的的資資源源。。如如Tint、、TReal等等基基本本數(shù)數(shù)據據類類型型。。R::R前前綴綴表表示示一一個個資資源源類類,,它它包包含含其其它它位位置置擁擁有有資資源源的的句句柄柄。。M::M前前綴綴表表示示一一個個接接口口類類,,它它定定義義了了接接口口但但需需要要派派生生類類實實現(xiàn)現(xiàn)。。結構構(struct)類類型型作作為為T類類對對待待,,因因為為它它也也不不擁擁有有任任何何額額外外的的資資源源,,它它的的前前綴綴通通常常是是T((但但也也有有一一些些以以S開開頭頭))。。enumTColors{ERed,//盡盡量量用用E開開頭頭,,盡盡量量用用枚枚舉舉EGreen}成員員變變量量的的名名字字以以i開開頭頭,,參數(shù)數(shù)名名以以a開開頭頭classTMyClass{TIntiMyValue;voidMyAddFunc(TIntaArg1,TIntaArg2);voidMyAddFunc(TIntaArg1,TIntaArg2);voidMyAddFuncL(TIntaArg1,TIntaArg2);-------->后后綴綴L的的約約定定是是該該函數(shù)數(shù)可可能能產產生生異異常常退退出出;voidMyAddFuncLC(TIntaArg1,TIntaArg2);---------->后后綴綴LC的的約約定定表表示示成成功功完完成成之之后后,,返返回回值值會會被被壓壓入入清清理理棧棧中中;((棧棧不不保保存存))};Symbian編編程規(guī)規(guī)范和和基本本框架架Symbian命命名約約定常量應應加前前綴KconstCIntKMyconstant;宏全部部為大大寫#defineMY_HARDCODED_VALUE(25)Symbian四個個主要要的應應用軟軟件框框架類類針對右右圖Graphics,,UI程程序應應該具具備的基本本功能能類::視圖圖(View))、文文檔((Document)、、應用程程序((Application))、應用程程序UI((ApplicationUI)。。所有的的S60UI應用用程序序都具具有一一些基基本功功能::提供一一個用用戶界界面,,用于于顯示示信息息并允允許用用戶進進行交交互。。響應各各種用用戶啟啟動的的事件件,比比如用用戶選選擇一一個菜菜單項項。響應系系統(tǒng)啟啟動的的不同同事件件,比比如導導致屏屏幕重重繪的的window服務務器事事件。。能夠保保存和和恢復復應用用程序序數(shù)據據??梢晕ㄎㄒ恍孕缘南蛳蚩蚣芗軜酥局咀陨砩?。向框架架提供供有關關應用用程序序的描描述性性信息息,比比如圖圖標和和標題題等。。Symbian編編程規(guī)規(guī)范和和基本本框架架Symbian四個個主要要的應應用軟軟件框框架類類一個程程序只只能有有一個個文檔檔,可可以有有多個個視圖圖。必須創(chuàng)創(chuàng)建下下面的的每個個方法法,才才能提提供最最小的的S60應應用程程序::所有S60UI都都實現(xiàn)現(xiàn)一個個全局局函數(shù)數(shù)E32DLL(),當應應用程程序啟啟動時時,框框架將將首先先調用用該函函數(shù),,該函函數(shù)也也稱為為DLL入口點點,應用用程序序必須須存在在該函函數(shù)。??蚣苷{調用NewApplication(),,創(chuàng)建建Application類,,其基類是是CAknApplication.Application類創(chuàng)建應應用程程序類類的Document對象,并返返回它它的指指針,,以后后框架架使用用該指指針完完成應應用程程序的的創(chuàng)建建。由由框框架調調用AppDllUid()返回應應用程程序的的UID。。該函函數(shù)必必須返返回在在.mmp文件中中指定定的值值。Document基類類是CAknDocument.Document對對象通過CreateAppUiL創(chuàng)建獲取AppUi類的的指針針。AppUi類的的基類類是CAknAppUi或者CAknViewAppUi,,它是用用來處處理應用用程序序事件件,如如操作作菜單單,操作視視圖,,切換換視圖圖等等等。View是是控控制類類(c類)),在在屏幕幕上顯示示數(shù)據據,用用戶與與界面面交互互,傳遞命命令給給AppUi。。Symbian編編程規(guī)規(guī)范和和基本本框架架Symbian處理理內存存泄漏漏的手手段1.Trap和和TrapD處處理理異常常TInterr;Trap(err,CreateObject());//需需要先先定義義err變變量TrapD(err,CreateObject());//不需需要定定義err變量量2.CleanupStack它是處處理內內存泄泄漏的的又一一重要要手段段CFoo*p=new(ELeave)CFoo();CleanupStack::PushL(p)p->SomeFunctionL();//可可能異異常退退出,,使得得deletep得得不到到調用用CleanupStack::Pop();deletep;Symbian二階階段構構造在Symbian中中,如如果在在一個個類的的構造造函數(shù)數(shù)中需需要執(zhí)執(zhí)行某某些比比如申申請內內存等等操作作,那那么有有可能能會Leave。如如果Leave的話話,這這個時時候這這個類類的析析構函函數(shù)數(shù)是不不會被被調用用,因因為還還沒有有初始始化完完,也也就沒沒法把把自己己加入入CleanupStack,那那么那那些申申請了了的內內存可可能會會因為為沒有有變量量引用用而造造成內內存泄泄漏。。因此此在在Symbian中中類的的構造造函數(shù)數(shù)中不不能有有可能能會Leave的代代碼。。Symbian編編程規(guī)規(guī)范和和基本本框架架Symbian二階階段構構造初始化化一個個類確確實需需要執(zhí)執(zhí)行某某些可可能會會Leave的的函數(shù)數(shù),這這就是是Symbian中中要求求的兩階階段初初始化化了。。第一一階段段,也也就是是在構構造函函數(shù)中中執(zhí)行行一些些不會會Leave的初初始化化工作。然然后是是第二二階段段,把把這個個實例例推進進CleanupStack,再再執(zhí)行行第二二階段段的可可能會會Leave的代代碼。。當然然,在在析構構函數(shù)數(shù)中,,要能能夠夠處理理部分分初始始化的的情況況,也也就是是實例例沒有初始始化成成功,,也能能釋放放那些些已經經申請請的內內存或或資源源。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ī)范和和基本本框架架描述符符描述符符是用用來存存儲文文本和和二進進制的的基本本類抽象類類(Abstract):(TDes、TDesC、TDes8、TDesC8),描描述符符的基基類,,僅提提供接接口和和基本本功能能,不不能被被實例例化,,一般般只用用作函函數(shù)的的參數(shù)數(shù)。文字常常量(Literal):(TlitC、_LIT()),用用于存存儲文文字字字符串串(literalstring),即即C中中字符符串常常量,,通常常使用用_LIT()這種方方式,,也有有_L(),_L8()這種方方式。。棧類(Buffer):(TBuf、TBufC、TBuf8、TBufC8),數(shù)數(shù)據存存儲于于棧上上,最最基本本的描描述符符變量量類型型,大小在在編譯譯時確確定,包含含描述述符本本身數(shù)數(shù)據,,使用用最為為普遍遍,具具體方方法如如下堆類(Heap):(HBufC、HBufC8),數(shù)數(shù)據存存儲于于堆上上,大大小在在運行行時確確定,,也就是是用來來處理理動態(tài)態(tài)申請請的描描述符符類。。在C/C++中用用過動動態(tài)內內存的的都知知道,,動態(tài)內內存是是啥回回事,,這里里堆類類描述述符用用的時時候,,也是是差不不多,,由于于堆描描述符符沒有構構造函函數(shù),,所以以只能能聲明明為指指針類類型,,通過過堆描描述符符類內內靜態(tài)態(tài)函數(shù)數(shù)NewL方法申申請內內存,,具體體方法法如下下HBufC*errorTitleCode=HBufC::NewLC(50);HbufC*unUseCode=NULL;指針類類(Pointer):(TPtr、TPtrC、TPtr8、TPtrC8),本本身不不包含含描述述符數(shù)數(shù)據,,但是是包含含長度度數(shù)據據,而而且還還包含含一個個指向向位于于描述述符之之外數(shù)數(shù)據的的指針針。Symbian基本語語法描述符關關系簡圖圖Symbian基本語語法描述符的的使用文字描述述符常量量_LIT(KMyFile,“c:\System\Apps\MyApp\MyFile.jpg”);它可以以在任何何使用TDesC&的地方使使用。。//常用用的通知知函數(shù)NEikonEnvironment::MessageBox(_L("Error:initfilenotfound!"));//數(shù)字字轉字符符串TBuf16<20>buf;//TIntiNum=20;buf.Format(_L("%d"),iNum);棧描述符符棧類描述述符聲明明時必須須指定描描述符的的最大長長度,否否則無法法聲明和和定義,,舉例例如下:://直直接從字字符串中中構造_LIT(Ktext,"TestText");TBufC<10>Buf(Ktext);//或或從字符符串賦值值TBufC<10>Buf2;Buf2=Ktext;//從從已有的的對象中中生成新新的TBufCTBufC<10>Buf3(Buf2);Symbian基本語語法描述符的的使用棧描述符符盡管這里里的對象象表示數(shù)數(shù)據是不不能被修修改的((因為有有個后綴綴C代表表了常量量的意思思),但但仍然有有兩種方方式可以以用來修修改數(shù)據據內容::這里的的數(shù)據可可以用賦賦值的方方式替換換掉;使使用Des()函數(shù)構構造出一一個TPtr對對象,這這樣就可可以用它它來修改改數(shù)據。。_LIT(Ktext,"TestText");_LIT(Ktext1,"TestText””);_LIT(KXtraText,"New:");TBufC<10>Buf1(Ktext);//Buf1長長度為9內容容“TestText””TBufC<10>Buf2(Ktext1);//Buf2長度度為10內容容“Test1Text”//通通過賦值值的方式式改變數(shù)數(shù)據Buf2=Buf1;//Buf2長長度變?yōu)闉?內內容““TestText”//通過過使用Des()生成成指針改改變TBufC的數(shù)據據TPtrPointer=Buf1.Des();//刪刪除后四四個字符符Pointer.Delete(Pointer.Length()-4,4);//Buf1長長度變?yōu)闉?內內容“Test”//增增加新的的數(shù)據Pointer.Append(KXtraText);//Buf1長長度為9內容容為“TestNew:””//也也可以使使用下列列方式改改變數(shù)據據TBufC<10>Buf3(NewText);Pointer.Copy(Buf3);//Buf1長度為為4,內內容為New1//或或直接從從字符串串里獲得得數(shù)據Pointer.Copy(NewText1);//Buf1長度度為4,,內容為為New2Symbian基本語語法描述符的的使用棧描述符符可修改的的描述符符TBuf,TBuf8就就不用通通過那么么復雜的的方法來來實現(xiàn)修修改,它它直接可可以用Copy、Delete等方方法,但但是無論論可修改改的還是是不可修修改的,,一旦指指定最大大的數(shù)據據長度后后,最大大長度就就不能進進行修改改了修改改的只是是數(shù)據內內容,而而數(shù)據內內容修改改的受限限條件是是不能超超過聲明明或定義義時的最最大長度度。堆描述符符堆描述符符HBufC,HbufC8雖然都都是不可可修改類類型的,,但是它它仍然具具有構造造和修改改,與棧棧描述符符不同的的是:首首先對內內存需要要顯示釋釋放,其其次是堆堆描述符符沒有最最大長度度的限制制,任何何時候都都可以用用ReAlloc())函數(shù)重重新申請請分配。。有兩種種方式來來生成一一個堆描描述符示示例://第一一種方式式用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ù)據據的方法法_LIT(KText1,"Text1");*Buf1=KText1;Symbian基本語語法描述符的的使用堆描述符符堆描述符符的修改改方式:://2.通過過可修改改指針來來改變數(shù)數(shù)據的方方式TPtrPointer=Buf1->Des();Pointer.Delete(Pointer.Length()-2,2);//刪除除數(shù)據_LIT(KNew,"New:");Pointer.Append(KNew);//添加數(shù)數(shù)據重新申請請內存Buf1=Buf1->ReAllocL(KText().Length()+KNew().Length());CleanupStack::PushL(Buf1);釋放內存存deleteBuf;Buf=NULL;指針描述述符不可修改改的指針針TPtrC可可用TBuf和TBufC構造出出TPtrC對對象_LIT(KText,"TestCode");TBufC<10>Buf(KText);//或者者為TBuf<10>Buf(KText);TPtrCPtr(Buf);//使使用構造造函數(shù)初初始化TPtrCPtr1;Ptr1.Set(Buf);//利用用set函數(shù)初初始化Symbian基本語語法描述符的的使用指針描述述符不可修改改的指針針TPtrC用TText*構造TPtrCconstTText*text=_S("HelloWorld\n");TPtrCptr(text);//或或者TPtrCPtr2;Ptr2.Set(text);//如果果要存儲儲TText的的一部分分數(shù)據,,我們使使用下列列方法TPtrCptr4(text,5);從另一個個TPtrC中中構造TPtrCconstTText*text1=_S("HelloWorld\n");TPtrCPtr3(text1);//從從一個TPtrC中獲獲得另一一個TPtrCTPtrCp1(Ptr3);//或或TPtrCp2;p2.Set(Ptr3);可修改的的TPtr同同不可修修改的指指針描述述符構造造方法基基本類似似,區(qū)別別在于,,不可修修改的指指針描述述符TPtrC的函數(shù)數(shù)始終是是不可修修改的,,因此沒沒有Insert,Delete等等函數(shù),,并且沒沒有Des()函數(shù),,但有Alloc(),Compare(),Find(),Mid(),Size()等函數(shù)數(shù)。Symbian基本語語法動態(tài)數(shù)組組在傳統(tǒng)c/c++中經常會會使用數(shù)數(shù)組來存存儲序列列,它是是具有相相同數(shù)據據類型的的數(shù)據元元素的集集合,通通過數(shù)組可以很很方便的的實現(xiàn)數(shù)數(shù)據元素素的訪問問等相關關操作。。動態(tài)數(shù)數(shù)組是一一個類的的模板,,可以接接受各種種各樣的數(shù)據類類型,SymbianOS主要提供供了3類動態(tài)數(shù)數(shù)組:RArray<classT>,RPointerArray<classT>,CArray<classT>活動對象象在symbianos中中活動對對象是一一種非搶搶先式多多任務處處理的機機制,是是symbianos中中一個十分重重要的概概念??煽捎糜谔嫣娲鶶ymbianOS中中的多線線程。。使用活活動對象象可獲得得的好處處是:在在同一個線程程中運行行的活動動對象之之間進行行切換的的代價要要比線程程上下文文的切換換代價低低,這使使得對于于各種資源比較較緊張的的SymbianOS來說說,使得得活動對對象更適適合事件件驅動多多任務。。概念:一一個活動動對象必必須派生生自基類類CActiveclassCActive:publicCBase{
public:enumTpriority
{EPriorityIdle=-100;EPriorityLow=-20;EPriorityStandard=0;EPriorityUserInput=10;EPriorityHigh=20;}Symbian基本語語法活動對象象public:IMPORT_C~CActive();IMPORT_CvoidCancel();//刪除未未完成請請求的函函數(shù)………IMPORT_CvoidSetPriority(TIntaPriority);InlineTBoolIsActive()const;…………
protected:IMPORT_CCActive(TIntaPriority);IMPORT_CvoidSetActive();virtualvoidDoCancel()=0;//兩個個純虛函函數(shù),繼繼承類必必須實現(xiàn)現(xiàn)它們virtualvoidRunL()=0;//處理理函數(shù)IMPORT_CvirtualTIntRunError(TIntaError);public:TrequestStatusiStatus;//代表請請求狀態(tài)態(tài)……….private:TBooliActive;……….}構造時也會有有一個優(yōu)先級級值來決定它它們如何被調調度Cancel和DoCancel用來取消發(fā)發(fā)出的請求,,Docancel是一一個純虛函數(shù)數(shù),需要由派派生類實現(xiàn)。。Cancel的功能就就是調用DoCancel,如果用用戶取消當前前請求調用Cancel而不是DoCancel,但在代代碼中要實現(xiàn)現(xiàn)DocancelSymbian基本語法法活動對象IsActive確定活活動對象是否否處于活動狀狀態(tài)SetActive激激活活動對象象,一般在調調用請求后緊緊接著調用它它。RunL異異步事件處理理函數(shù),當一一個請求完成成時,活動對對象調度器會會調用這個函函數(shù),進行下下一步處理RunError當RunL函數(shù)數(shù)出現(xiàn)異常時時會出現(xiàn)RunError函數(shù),它它也是純虛函函數(shù),需要派派生類實現(xiàn)。。具體例子見文文檔。文件管理symbian系統(tǒng)采用用了C/S(客戶端/服服務器)的架架構。對于文文件操作,系系統(tǒng)有一個文文件系統(tǒng)管理理的服務器。程序通通過聯(lián)結這個個文件管理服服務器來進行行文件。在symbianos中,F(xiàn)lash(閃閃存)通常被被定義在c盤盤,symbian智能能手機中還有有一個ROM存儲器通常被映射在在z盤,用戶戶的許多文件件也存放在z盤。其他可可移動存儲((如存儲卡))則映射在d,e等盤符。symbian開發(fā)環(huán)境境下各盤符對對應的映射關關系:客戶機c:盤盤對應開開發(fā)平臺中sdk的\epoc32\wins\c目錄錄客戶機d:盤盤對應開開發(fā)平臺中sdk的\epoc32\wins\d目錄客戶機z:盤盤對應應開發(fā)平臺中中sdk的\epoc32\release\wins\urel\z目錄或者者\epoc32\release\wins\urel\z文件命名規(guī)則則一個完整的symbianos文文件應該包包含以下四個個部分1.驅動器名名,即盤符2.路徑,,從根目錄到到或當前會話話目錄起到文文件經過的所所有目錄路徑徑3.文件名,,遵循c/c++命名規(guī)規(guī)范4.文件擴展名名例如:c:\myfile\data.txt就是合法的的文件名,一一個完整的文文件名不能超超過255個個字符。Symbian基本語法法文件管理文件訪問流程程1.應用程序序要進行文件件讀寫之前,,必須建立應應用程序與文文件服務器的的連接,這種種連接也稱會會話(session)),Sysmbianos中提供供RFs類來來實現(xiàn)這個功功能,該類提提供了Connect()和Close()函函數(shù)來建立和和關閉連接。。RFsfsSession;//建建立RFs類類的對象User::LeaveIfError(fsSession.Connect());//建立立連接,為防防止出現(xiàn)異常常放User::LeaveIfError中fsSession.Close();//用完關閉閉連接2.文件服務務器可以實現(xiàn)現(xiàn)文件的讀、、寫、刪、建建,通過RFile的Open(RFsaFs,constTDesC&aName,TUnitaFileMode)打打開文件。。通過Write()和和Read()可以實實現(xiàn)文件的寫寫和讀。RFile的的Create()用用于建立新文文件。刪除文件可以以使用RFs的Delete()。3.另一種比比較重要的文文件讀寫方式式----流(Stream)文件輸出流RWriteStream和文文件輸入流RReadStream文件輸出六主主要使用RWriteStream的派生類類RFileWriteStream將數(shù)據據外化為流,,它需要先打打開一個文件件,打開文件件的兩種方式式:OpenL::當文件件不存在會產產生異常,所所以必須保證證文件存在Replace:文件件存在刪除并并重建新的,,不存在就創(chuàng)創(chuàng)建,因每次次都創(chuàng)建文件件,會帶來額額外開銷。例子:RFileWriteStreamwriter;writer.PushL();//writeroncleanupstackUser::LeaveIfError(writer.Replace(iCoeEnv->FsSession(),*iFileName,EFileWrite));writer<<*iText; //writethetextwriter.CommitL();CleanupStack::PopAndDestroy();//釋放放資源從存儲中讀取取數(shù)據的方法法就是將以上上的過程反向向Symbian基本應用用數(shù)據庫管理Symbian系統(tǒng)的DBMS提供供了創(chuàng)建與維維持數(shù)據庫的的功能,通過過本地調用和和SQL調用用,其可以對對數(shù)據庫進行安全全可靠的數(shù)據據訪問。這種種調用支持事事務/回滾機機制用以保證證所有數(shù)據被被寫入或數(shù)據據為空的情形獲得支持。。DBMS的管管理結構和元元素任何Symbian系統(tǒng)統(tǒng)的DBMS都采用層次次性的結構——最底層是保保存數(shù)據庫的的文件倉庫。。Symbian操作系統(tǒng)統(tǒng)的DBMS是一個功能能強大,或為為輕量集的數(shù)數(shù)據庫關系系系統(tǒng)實現(xiàn)。它它支持普通的的添加/查找//檢索/更新新/刪除功能能,同時它還還支持基本的的結構化查查詢語言(StructuredQueryLanguage:SQL),數(shù)據據定義語言((DataDefinitionLanguage:DDL)和和數(shù)據建模語語言(DataModelingLanguage:DML)語句處理理。永久文件存儲儲系統(tǒng)和流Symbian系統(tǒng)的的DBMS依依賴于文件服服務器提供的的資源,Symbian系統(tǒng)所的永永久文件存儲儲和流能提供系統(tǒng)所需要要的底層存儲儲功能。永永久文件系統(tǒng)統(tǒng)通過使用CPermanentFileStore來來獲得,它是是一個源自CFileStore的具體體類。這些些類在文件件存儲API中定義義,可為DBMS提提供組建模模塊。創(chuàng)建數(shù)據庫庫(1)RDbStoreDatabase:通通過文件存存儲打開的的數(shù)據庫,,提供了進進行數(shù)據庫庫操作的API,獨獨占使用數(shù)數(shù)據庫,不可可共享使用用。(2)RDbNamedDatabase:通通過文件名名打開的數(shù)數(shù)據庫,同同樣提供API。使使用C/S模式,可可以共享使使用(3)CDbColSet::數(shù)據庫字字段的集合合,可用于于在數(shù)據庫庫中創(chuàng)建表表格。(4)使用用到的庫和和頭文件::ws32.libedbms.libd32dbms.hf32file.hs32file.h創(chuàng)建步驟::(1)數(shù)據據庫類的聲聲明:將RFs和RDbStoreDatabase聲聲明為數(shù)據據成員。classCMiapSampleDatabase:publicCBase{Symbian基本本應用數(shù)據庫管理理public://SomeFunctionsprivate:
RFsiFsSession;
RDbStoreDatabaseiDb;};(2)創(chuàng)建建數(shù)據庫::
首先打打開一個文文件流存儲儲(FileStore),,通過調用用RDbStoreDatabase::CreateL(CStreamStore*aStore)來來創(chuàng)建數(shù)據據庫。最后后將文件流流提交。_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基本本應用數(shù)據庫管理理(3)創(chuàng)建建表格:通通過文件件流存儲打打開數(shù)據庫庫:
_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));釋放不使用用的內存::
CleanupStack::PopAndDestroy(ColSet);
CleanupStack::PopAndDestroy(FileStore);Symbian基本本應用數(shù)據庫管理理(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)建一個索索引對象,,將其添加加到索引集集合中,通通過調用RDbStoreDatabase::CreateIndex(constTDesC&aName,constTDesC&aTable,constCDbKey&aKey)創(chuàng)創(chuàng)建表格,,最后清除除不使用的的內存。(5)插入入記錄:_LIT(KIdText,"100001");首先打打開數(shù)據庫庫。打開表表:
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);//清除內內存:注意:每插插入一條記記錄,就必必須調用table.InsertL(),設設置完值后后,必須調調用table.PutL()提交。。Symbian基本本應用(6)查詢詢記錄:首首先打開開數(shù)據庫和和表。TPtrCptrc;for(table.FirstL();table.AtRow();table.NextL())
{table.GetL();
ptrc.Set(table.ColDes(colSet->ColNo(KId)));}
table.FirstL()將焦點設設置為第一一條記錄,,table.AtRow()驗證下下一條記錄錄是否存在在,table.NextL()將焦焦點移動到到下一條記記錄。每每查詢一條條記錄,必必須調用table.GetL();
使用TPtrC::Set()將將查詢結果果寫進描述述符。(7)執(zhí)行行SQL語語句:首首先打開數(shù)數(shù)據庫。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基本本應用SymbianGUI編程程60系列用用戶界面顯顯示器規(guī)范范如下:分辨率:176像素素(寬)××208像像素(高))正方形像素素物理尺寸::約35mm(寬),41mm(高),對對應約0.2mm的的象素點距距。顏色數(shù)(4096色色或更多))SymbianGUI編程程SymbianGUI編程程顯示器按照照一定的層層次結構進進行布局。。布局由被被稱為窗口口(windows)和窗格格(panes)的的組件構建建。屏幕(Screen)是最頂頂層的顯示示組件,對對應于物理理屏幕的整整個象素區(qū)區(qū)域。窗口(Window)屏幕(screen)是窗口口的唯一父父組件。一一般情況下下一個窗口口會充滿整整個屏幕,,但有時也也存在一些些小窗口((臨時性的的),它們們只占據屏屏幕的一部部分,環(huán)繞繞其周圍的的部分是可可見的。每個應用程程序都在自自己的窗口口中運行。。應用程序序也可以調調用其它的的臨時窗口口。窗格(Pane)窗格是窗口口(window)的子組件件。一個窗口可可以包含多多個窗格,,而每個窗窗格又可以以包含多個個子窗格,,如此等等等。不含有有子組件的的底層組件件被稱為元元素(element)。應用窗口應用窗口是是覆蓋整個個屏幕的主主窗口。通通常它并不不直接用于于顯示,而而是作為各各種窗格的的父組件。一個典型的的應用窗口口由下幾種種窗格組成成:-狀態(tài)窗窗格-主窗格格-控制窗窗格SymbianGUI編程程GUI應用用程序的基基本組成部部分Application負責啟動方方面的工作作Document負責永久保保持的工作作AppUI負責接受并并處理用戶戶的命令AppView負責圖形顯顯示的工作作Model可選:負責責處理數(shù)據據view架架構view是是一個執(zhí)行行特定任務務的一屏同一時刻,,view管理系統(tǒng)統(tǒng)只允許一一個view處于激激活狀態(tài)每個view都有一一個ID每個view必須到到viewserver上上去登記調用ActiveViewL()還能能夠激活其其它應用程程序的views在view之之間間能能夠夠傳傳遞遞消消息息classCMyView:publicCAknViewCCoeControl框框架架主要要內內容容簡單單控控件件CCoeControl概概述述控件件的的初初始始化化控件件的的重重繪繪用戶戶輸輸入入處處理理((按按鍵鍵事事件件))復合合控控件件常用用控控件件對話話框框表格格資源源菜單單軟鍵鍵熱鍵鍵CCoeControl框框架架WINDOWSserverCCoeControl框框架架WINDOWSserverCoeControl可以以作作為為視視圖圖的的基基類類傳統(tǒng)統(tǒng)的的EIKON視視圖圖架架構構--containerdialog負責責應應用用程程序序視視圖圖區(qū)區(qū)域域的的顯顯示示工工作作一個個應應用用程程序序的的界界面面分分為為三三部部分分標題題欄欄軟鍵鍵區(qū)區(qū)域域應用用程程序序視視圖圖區(qū)區(qū)域域((右右圖圖的的黑黑框框部部分分))使用用CGraphicsContext進進行行畫畫圖圖在UI平平臺臺能能力力范范圍圍內內工工作作((如如::60系系列列))系統(tǒng)統(tǒng)提提供供的的常常用用控控件件有有按鈕鈕編輯輯器器文本本標標簽簽列表表框框可以以內內嵌嵌其其它它控控件件((又又稱稱定定制制控控件件,,或或者者復復合合控控件件))CoeControl所有有對對屏屏幕幕的的操操作作都都是是在在控控件件上上進進行行控件件從從CCoeControl繼繼承承而而來來控件件是是屏屏幕幕上上的的一一個個矩矩形形區(qū)區(qū)域域控件件占占據據窗窗口口的的全全部部或或者者部部分分應用用程程序序的的視視圖圖使使用用至至少少一一個個控控件件控件件可可以以處處理理用用戶戶的的輸輸入入事事件件鍵盤盤事事件件鼠標標事事件件CoeControl是所所有有控控件件的的基基類類被派派生生類類直直接接調調用用的的函函數(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;負責產生控件件的圖形化外外觀重要提示基類中的該函函數(shù)為空,在在派生類中如如果不實現(xiàn)該該函數(shù)的話控控件將不可見見該方法由應用用程序框架調調用,不要自自己調用該函函數(shù)方法是const,意味味著你在Draw()中中不能更改任任何成員變量量,或者調用用任何不是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()}圖形設備接口口GDI抽象類CGraphicsContext(圖圖形上下文))定義了一致致的接口派生類CWindowGc和CFbsBitGc具體實現(xiàn)現(xiàn)了這些接口口可以直接使用用CFbsBitGc繪繪圖,但不推推薦:推薦的繪圖方方式建議在程序中中使用CWindowGc提供的接接口圖形上下文CWindowGc&SystemGc())const用來獲取取當前的圖形形上下文提供了許多有有用的繪圖函函數(shù)畫點、線、橢橢圓、矩形、、位圖等等改變畫筆/畫畫刷的顏色和和風格改變字體設置裁剪區(qū)域域,原點在某一時刻CWindowGc只能能由一個窗口口激活voidActivate(RDrawableWindow&aWindow)voidDeactivate()控件的重繪(redraw)更新在屏幕上上的顯示兩種類型系統(tǒng)發(fā)起的windowserver我們“必須””重繪控件應用程序發(fā)起起的內部狀態(tài)改變變我們“想要””重繪控件系統(tǒng)發(fā)起的重重繪當windowserver檢測測到可能使一一個區(qū)域無效效的事件對話框/菜單單不再需要時時啟動一個GUI程序時發(fā)送redraw消息給給擁有窗口的的應用程序應用程序通過過CONE發(fā)發(fā)送消息給相相關的控件調用控件的Draw()函數(shù)應用發(fā)起的重重繪通常是某個內內部狀態(tài)改變變的結果實現(xiàn)方法有以以下幾種:Invalidate控控件窗口的某某部分,讓windowserver發(fā)送一一個redraw消息請求CONE立即重繪整整個控件立即重繪控件件的某個部分分所有的實現(xiàn)方方法最終都是是調用Draw()函數(shù)數(shù)redraw的類型立即重繪整個個控件CCoeControl::DrawNow()在程序初始化化時采用一旦有機會就就重繪整個窗口: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ū)域相對于控件的的原點(左上上角)對于簡單控件件,通常重繪繪整個控件對于復合控件件,只重繪部部分控件防止屏幕閃爍爍只重繪位于無無效區(qū)域的部部分不要短時間內內多次重繪某某個區(qū)域盡量避免大面面積的重繪處理按鍵事件件控件能夠檢測測并處理按鍵鍵事件按鍵事件的處處理是獨立于于資源文件定定義的熱鍵處處理之外的UI框架已經經實現(xiàn)了大部部分的按鍵處處理典型應用導航鍵選擇鍵CONE控件件堆棧按鍵事件由系系統(tǒng)通告給對對其感興趣的的控件在一個特殊的的數(shù)據結構((CONE控控件堆棧)中中登記感興趣趣的控件系統(tǒng)給控件發(fā)發(fā)送OfferKeyEventL事件CONE控件件堆棧中的控控件被一一通通告事件的發(fā)發(fā)生,直至某某個控件宣稱稱接收了該事事件控件按優(yōu)先級級被通告事件件的發(fā)生控件必須告知知系統(tǒng)是否接接收了該事件件如果沒有任何何控件宣稱接接收一個事件件,則最后將將由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);}在析構的時候候將控件從CONE控件件堆棧中注銷銷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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年沈陽北軟信息職業(yè)技術學院高職單招語文2018-2024歷年參考題庫頻考點含答案解析
- 2025年無錫南洋職業(yè)技術學院高職單招語文2018-2024歷年參考題庫頻考點含答案解析
- 2025年曲阜遠東職業(yè)技術學院高職單招語文2018-2024歷年參考題庫頻考點含答案解析
- 專題05 名句名篇默寫(第1期)
- 專題05 青春時光(第1期)
- 全新承包公寓合同下載
- 幼兒園指紋教育活動策劃方案五篇
- 總經理聘用合同的范文
- 金融合同保險業(yè)務居間合約
- 生活垃圾清運服務合同年
- 【人教版化學】必修1 知識點默寫小紙條(答案背誦版)
- 江蘇省無錫市2023-2024學年八年級上學期期末數(shù)學試題(原卷版)
- 全國第三屆職業(yè)技能大賽(無人機駕駛(植保)項目)選拔賽理論考試題庫(含答案)
- 《奧特萊斯業(yè)態(tài)淺析》課件
- 2022年湖南省公務員錄用考試《申論》真題(縣鄉(xiāng)卷)及答案解析
- 小學語文中段整本書閱讀的指導策略研究 中期報告
- 浙教版2023-2024學年數(shù)學八年級上冊期末復習卷(含答案)
- 運動訓練與康復治療培訓資料
- 小班繪本教學《藏在哪里了》課件
- 老師呀請你別生氣教學反思
評論
0/150
提交評論