版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Symbian OS 開發(fā)培訓Inspur Communication Information Systems Co.,Ltd Symbian OS 概述1998年6月,諾基亞(NOKIA)、摩托羅拉(MOTOROLA)、愛立信(ERICSSON)、三菱(MITSUBISHI)和Psion在英國倫敦共同投資成立Symbian公司。這個公司成立的目的是為了能夠設計并開發(fā)出一種可以在手機及其他類似的移動通訊終端產(chǎn)品上運行的開放性操作系統(tǒng),以此來推動高端智能移動電話及類似的終端產(chǎn)品盡快進入大眾消費領域。之后有西門子(SIEMENS)、三星(SAMSUNG)、松下(Panasonic)、索尼愛立信(S
2、ony Ericsson)等手機廠商相繼入資,現(xiàn)如今,Symbian操作系統(tǒng)的智能手機已經(jīng)占據(jù)了世界智能手機市場超過80%的份額。 Symbian OS 概述Symbian是一個實時性、多任務的純32位操作系統(tǒng),具有功耗低、內存占用少等特點,非常適合手機等移動設備使用,經(jīng)過不斷完善,可以支持GPRS、藍牙、SyncML、以及3G技術。Symbian是一個標準化的開放式平臺,任何人都可以為支持Symbian的設備開發(fā)軟件 。與微軟產(chǎn)品不同的是,Symbian將移動設備的通用技術,也就是操作系統(tǒng)的內核,與圖形用戶界面技術分開,能很好的適應不同方式輸入的平臺,也可以使廠商可以為自己的產(chǎn)品制作更加友好
3、的操作界面,符合個性化的潮流Symbian OS 概述目前Symbian OS手機有三種開發(fā)SDK: Nokia Series 80: 主要機型有Nokia9200 系列Nokia Series 60: 主要機型包括諾基亞7650、 6600、西門子SX1 等UIQ2、UIQ3: Sony Ericsson P800,P900Sony Ericsson P900開發(fā)平臺搭建安裝ActivePerl(x86和x64分別對應32位和64位cpu )jre (java的應用平臺)Symbian OS SDK (建議安裝在 盤符根目錄下 )(C+)開發(fā)工具 手機軟件開發(fā)過程:開發(fā)平臺搭建第一步:安裝開
4、發(fā)軟件,搭建開發(fā)環(huán)境(下面主要介紹series 60 sdk, 其余類似)第二步:在模擬器上開發(fā)調試(以VC環(huán)境開發(fā)為例)第三步:生成sis文件,在手機上安裝運行幾種開發(fā)環(huán)境:開發(fā)平臺搭建Visual C+ 6.0Borland C+ Builder 6Carbide C+開發(fā)平臺搭建Symbian工程aifdatagroupincsrcsis工程基本目錄結構:1.aif用來存放程序圖標2.data用來存放運行所需要的資源文件 .rss。3.group中比較重要的幾個文件:bld.inf、*.mmp。4.inc 和src 存放工程頭文件和源代 碼文件。5.sis 用來存放 程序打包所需要的pk
5、g文件,打包后生成的安裝文件 .sis也存放在此處。bld.inf聲明build的相關信息 通常只包括這次build會引用到的mmp文件。例如: PRJ_MMPFILES hello.mmp 2.mmp文件保存工程 編譯相關信息,主要內容如下 TARGET hello.app /目標名稱 TARGETTYPE app /目標類型 UID 0 x100039CE 0 x07B9DE87 /UID 唯一系統(tǒng)標示符 TARGETPATH systemappshello /目標路徑 SOURCEPATH .src /源代碼存放位置 SOURCE helloApp.cpp /源代碼列表 開發(fā)平臺搭建 S
6、OURCEPATH .data /資源文件路徑 RESOURCE hello.rss /資源文件 LANG SC /默認英語 USERINCLUDE . USERINCLUDE .inc /頭文件路徑 SYSTEMINCLUDE . epoc32include /系統(tǒng)包含文件目錄 LIBRARY euser.lib apparc.lib cone.lib eikcore.lib LIBRARY eikcoctl.lib avkon.lib /庫文件3. UID UID1-第一個UID(類型): UID1用來設定該應用程序是一個執(zhí)行程序(executable file)還是一個數(shù)據(jù)文件(data
7、 file). UID value Numeric value (Hex) Meaning KExecutableImageUid 0 x1000007A .exe 可執(zhí)行文件 KDaynamicLibraryUid 0 x10000079 .dll .app .ldd, .pdd 文件 KDirectFileStoreLayoutUid 0 x10000037direct file store KPermanentFileStoreLayoutUid 0 x10000050permanent file store UID2-第二個UID(子類型): UID2-具體含義取決于UID1的值: 如
8、果UID1是KExecutableImageUid, UID2不使用,所以UID2的值可以隨意取。 如果UID1是KDynamicLibraryUid, UID2將會是: 如果UID1是KDirectFileStoreLayoutUid或者KPermanentFileStoreLayoutUid,那么UID2將是: UID value Numeric value (Hex) Meaning KSharedLibraryUid 0 x1000008D .dll KUidApp 0 x100039CE .app KLogicalDeviceDriverUid 0 x100000AF a logic
9、al decive driver (.ldd) KPhysicalDeviceDriverUid 0 x100039D0 a physical device driver(.pdd) UID value Numeric value (Hex) Meaning KUidAppDllDoc 0 x10003A12 indicates this is a file store created by an .app to store user data (i.e, a document) KUidAppInfoFile 0 x10003A38 Indicates this is an AIF file
10、 (a type of file store) UID3-第三個UID(子子類型):每個獨立的應用程序有一個唯一的UID3值,它也被用作安全ID(secure ID),對于UIKON應用程序而言,用于關聯(lián)數(shù)據(jù)文件和程序:1. 對于dll和exe文件,它辯識特定的二進制(it identified the particular binary)。2.對于.app(UIKON應用程序),它辯識特定的應用程序(it identified the particular application program).3.對于由.apps創(chuàng)建的文件存儲(file stores),它辯識和該文件相關的應用程序(i
11、t identifies the application program associated with this file).4. 對于其他文件存儲(file stores), 它沒有典型的用途(但是你可以自定義它的用途) Symbian 命名約定 Symbian大致分了四種類 C:C前綴表示類從CBase派生并應該基于堆構造。 T:T前綴表示一個簡單類,這種類不擁有任何額外的資源。 如Tint、 TReal等基本數(shù)據(jù)類型。 R:R前綴表示一個資源類,它包含其它位置擁有資源的句柄。 M:M前綴表示一個接口類,它定義了接口但需要派生類實現(xiàn)。結構(struct)類型作為T類對待,因為它也不擁有任
12、何額外的資源,它的前綴通常是T(但也有一些以S開頭)。 enum TColorsERed, /盡量用E開頭 ,盡量用枚舉EGreen成員變量的名字以i開頭 ,參數(shù)名以a開頭 class TMyClass TInt iMyValue; void MyAddFunc(TInt aArg1,TInt aArg2); void MyAddFunc(TInt aArg1,TInt aArg2); void MyAddFuncL(TInt aArg1,TInt aArg2);-后綴L的約定是該 函數(shù)可 能產(chǎn)生異常退出; void MyAddFuncLC(TInt aArg1,TInt aArg2);-后綴
13、LC的約定表示 成功完成之后,返回值會被壓入清理棧中; (棧不保存); Symbian 編程規(guī)范和基本框架Symbian 命名約定常量應加前綴K const CInt KMyconstant;宏全部為大寫 #define MY_HARDCODED_VALUE (25) Symbian四個主要的應用軟件框架類 針對右圖Graphics ,UI程序應該具備的基本功能類:視圖(View)、文檔(Document)、應用程序(Application)、應用程序UI(Application UI)。 所有的S60 UI應用程序都具有一些基本功能: 提供一個用戶界面,用于顯示信息并允許用戶進行交互。 響應
14、各種用戶啟動的事件,比如用戶選擇一個菜單項。 響應系統(tǒng)啟動的不同事件,比如導致屏幕重繪的window服務器事件。能夠保存和恢復應用程序數(shù)據(jù)。 可以唯一性的向框架標志自身。 向框架提供有關應用程序的描述性信息,比如圖標和標題等。Symbian 編程規(guī)范和基本框架Symbian四個主要的應用軟件框架類 一個程序只能有一個文檔,可以有多個視圖。必須創(chuàng)建下面的每個方法,才能提供最小的S60應用程序:所有S60 UI都實現(xiàn)一個全局函數(shù)E32DLL(),當應用程序啟動時,框架將首先調用該函數(shù),該函數(shù)也稱為DLL入口點,應用程序必須存在該函數(shù)。 框架調用NewApplication(),創(chuàng)建Applicat
15、ion類,其基類是CAknApplication. Application類創(chuàng)建應用程序類的Document對象 ,并返回它的指針,以后框架使用該指針完成應用程序的創(chuàng)建。由框架調用AppDllUid()返回應用程序的UID。該函數(shù)必須返回在.mmp文件中指定的值。 Document基類是CAknDocument. Document對象通過CreateAppUiL創(chuàng)建獲取AppUi類的指針。AppUi類的基類是CAknAppUi 或者 CAknViewAppUi ,它是用來處理應用程序事件,如操作菜單,操作視圖,切換視圖等等。View 是控制類(c類),在屏幕上顯示數(shù)據(jù),用戶與界面交互,傳遞命令
16、給AppUi。Symbian 編程規(guī)范和基本框架Symbian處理內存泄漏的手段 1.Trap和TrapD 處理異常 TInt err; Trap(err,CreateObject(); /需要先定義err變量 TrapD(err,CreateObject(); /不需要定義err變量 2.CleanupStack 它是處理內存泄漏的又一重要手段 CFoo *p = new (ELeave) CFoo(); CleanupStack:PushL(p) p-SomeFunctionL(); /可能異常退出,使得delete p 得不到調用 CleanupStack:Pop(); delete p
17、; Symbian二階段構造 在Symbian中,如果在一個類的構造函數(shù)中需要執(zhí)行某些比如申請內存等操作,那么有可能會Leave。如果Leave的話,這個時候這個類的析構 函數(shù)是不會被調用,因為還沒有初始化完,也就沒法把自己加入CleanupStack,那么那些申請了的內存可能會因為沒有變量引用而造成內存泄漏。因此 在Symbian中類的構造函數(shù)中不能有可能會Leave的代碼。 Symbian 編程規(guī)范和基本框架Symbian二階段構造初始化一個類確實需要執(zhí)行某些可能會Leave的函數(shù),這就是Symbian中要求的兩階段初始化了。第一階段,也就是在構造函數(shù)中執(zhí)行一些不會 Leave的初始化工作
18、。然后是第二階段,把這個實例推進CleanupStack,再執(zhí)行第二階段的可能會Leave的代碼。當然,在析構函數(shù)中,要能 夠處理部分初始化的情況,也就是實例沒有初始化成功,也能釋放那些已經(jīng)申請的內存或資源。 CGraphicsAppView:CGraphicsAppView()CGraphicsAppView* CGraphicsAppView:NewL( const TRect& aRect ) CGraphicsAppView* self = NewLC( aRect ); CleanupStack:Pop( self ); return self; CGraphicsAppView*
19、CGraphicsAppView:NewLC( const TRect& aRect ) CGraphicsAppView* self = new ( ELeave ) CGraphicsAppView; CleanupStack:PushL( self ); self-ConstructL( aRect ); return self; void CGraphicsAppView:ConstructL( const TRect& aRect ) CreateWindowL(); SetRect( aRect ); Symbian 編程規(guī)范和基本框架描述符 描述符是用來存儲文本和二進制的基本類抽
20、象類(Abstract): ( TDes、TDesC、TDes8、TDesC8),描述符的基類,僅提供接口和基本功能,不能被實例化,一般只用作函數(shù)的參數(shù)。文字常量( Literal):(TlitC、_LIT(),用于存儲文字字符串(literal string),即C中字符串常量,通常使用_LIT()這種方式,也有_L(),_L8()這種方式。 棧類( Buffer):(TBuf、TBufC、 TBuf8、TBufC8),數(shù)據(jù)存儲于棧上,最基本的描述符變量類型,大小在編譯時確定,包含描述符本身數(shù)據(jù),使用最為普遍,具體方法如下堆類( Heap):(HBufC、HBufC8),數(shù)據(jù)存儲于堆上,大小
21、在運行時確定 , 也就是用來處理動態(tài)申請的描述符類。在C/C+中用過動態(tài)內存的都知道, 動態(tài)內存是啥回事,這里堆類描述符用的時候,也是差不多,由于堆描述符 沒有構造函數(shù),所以只能聲明為指針類型,通過堆描述符類內靜態(tài)函數(shù)NewL 方法申請內存,具體方法如下 HBufC* errorTitleCode = HBufC:NewLC(50); HbufC* unUseCode = NULL;指針類(Pointer):(TPtr、TPtrC、TPtr8、TPtrC8),本身不包含描述符數(shù)據(jù),但是包含長度數(shù)據(jù),而且還包含一個指向位于描述符之外數(shù)據(jù)的指針。 Symbian基本語法描述符關系簡圖 Symbia
22、n基本語法描述符的使用 文字描述符常量 _LIT(KMyFile, “c:SystemAppsMyAppMyFile.jpg”);它可以在任何使用TDesC& 的地方使用 。 /常用的通知函數(shù) NEikonEnvironment:MessageBox(_L(Error: init file not found!); /數(shù)字轉字符串 TBuf16 buf;/ TInt iNum = 20; buf.Format( _L( %d ) , iNum ); 棧描述符 棧類描述符聲明時必須指定描述符的最大長度,否則無法聲明和定義 ,舉例如下: / 直接從字符串中構造 _LIT(Ktext, TestTe
23、xt); TBufC Buf (Ktext); / 或從字符串賦值 TBufC Buf2; Buf2 = Ktext; / 從已有的對象中生成新的TBufC TBufC Buf3(Buf2);Symbian基本語法描述符的使用 棧描述符 盡管這里的對象表示數(shù)據(jù)是不能被修改的(因為有個后綴C代表了常量的意思),但仍然有兩種方式可以用來修改數(shù)據(jù)內容:這里的數(shù)據(jù)可以用賦值的方式替換掉;使用Des()函數(shù)構造出一個TPtr對象,這樣就可以用它來修改數(shù)據(jù)。 _LIT(Ktext , Test Text); _LIT(Ktext1 , Test Text”); _LIT(KXtraText , New:)
24、; TBufC Buf1 ( Ktext ); /Buf1長度為9 內容 “Test Text”TBufC Buf2 ( Ktext1 ); /Buf2長度為10 內容 “Test1 Text”/ 通過賦值的方式改變數(shù)據(jù)Buf2 = Buf1; /Buf2長度變?yōu)? 內容 “Test Text”/通過使用Des()生成指針改變TBufC的數(shù)據(jù)TPtr Pointer = Buf1.Des();/ 刪除后四個字符Pointer.Delete(Pointer.Length()-4, 4 ); /Buf1長度變?yōu)? 內容“Test ”/ 增加新的數(shù)據(jù)Pointer.Append(KXtraText)
25、; /Buf1長度為9 內容為“Test New:”/ 也可以使用下列方式改變數(shù)據(jù) TBufC Buf3(NewText);Pointer.Copy(Buf3);/Buf1長度為4,內容為New1/ 或直接從字符串里獲得數(shù)據(jù)Pointer.Copy(NewText1);/Buf1長度為4,內容為New2Symbian基本語法描述符的使用 棧描述符 可修改的描述符TBuf, TBuf8就不用通過那么復雜的方法來實現(xiàn)修改,它直接可以用Copy、Delete等方法,但是無論可修改的還是不可修改的,一旦指定最大的數(shù)據(jù)長度后,最大長度就不能進行修改了修改的只是數(shù)據(jù)內容,而數(shù)據(jù)內容修改的受限條件是不能超過
26、聲明或定義時的最大長度。 堆描述符 堆描述符HBufC,HbufC8雖然都是不可修改類型的,但是它仍然具有構造和修改,與棧描述符不同的是:首先對內存需要顯示釋放,其次是堆描述符沒有最大長度的限制,任何時候都可以用ReAlloc()函數(shù)重新申請分配。有兩種方式來生成一個堆描述符示例: /第一種方式用New(),NewL(),或NewLC() HBufC * Buf = HBufC:NewL(15); /第二種方式是采用Alloc(),AllocL()或AllcLC()來處理 _LIT (KText , Test Text); TBufC CBuf = KText; HBufC * Buf1 =
27、CBuf.AllocL(); CleanupStack:PushL(Buf1);堆描述符的修改方式: /1.賦值方式改變其數(shù)據(jù)的方法 _LIT ( KText1 , Text1); *Buf1 = KText1; Symbian基本語法描述符的使用堆描述符堆描述符的修改方式: / 2.通過可修改指針來改變數(shù)據(jù)的方式 TPtr Pointer = Buf1-Des(); Pointer.Delete(Pointer.Length() - 2, 2); /刪除數(shù)據(jù) _LIT ( KNew, New:); Pointer.Append(KNew); /添加數(shù)據(jù)重新申請內存 Buf1 = Buf1-R
28、eAllocL(KText().Length() + KNew().Length(); CleanupStack:PushL(Buf1);釋放內存 delete Buf; Buf = NULL;指針描述符不可修改的指針TPtrC 可用TBuf和TBufC構造出TPtrC對象 _LIT(KText , Test Code); TBufC Buf ( KText ); /或者為 TBuf Buf ( KText );TPtrC Ptr (Buf); /使用構造函數(shù)初始化TPtrC Ptr1;Ptr1.Set(Buf); /利用set函數(shù)初始化 Symbian基本語法描述符的使用指針描述符不可修改的
29、指針TPtrC 用TText*構造TPtrC const TText* text = _S(Hello Worldn); TPtrC ptr(text); / 或者 TPtrC Ptr2; Ptr2.Set(text); /如果要存儲TText的一部分數(shù)據(jù),我們使用下列方法 TPtrC ptr4(text, 5); 從另一個TPtrC中構造TPtrC const TText * text1 = _S(Hello Worldn); TPtrC Ptr3(text1); / 從一個TPtrC中獲得另一個TPtrC TPtrC p1(Ptr3); / 或 TPtrC p2; p2.Set(Ptr3)
30、;可修改的TPtr 同不可修改的指針描述符構造方法基本類似,區(qū)別在于,不可修改的指針描述符TPtrC的函數(shù)始終是不可修改的,因此沒有Insert,Delete等函數(shù),并且沒有Des()函數(shù),但有Alloc(),Compare(),Find(),Mid(),Size()等函數(shù)。Symbian基本語法動態(tài)數(shù)組 在傳統(tǒng)c/c+中經(jīng)常會使用數(shù)組來存儲序列,它是具有相同數(shù)據(jù)類型的數(shù)據(jù)元素的集合,通過數(shù)組可以很方便的實現(xiàn)數(shù)據(jù)元素的訪問等相關操作。動態(tài)數(shù)組是一個類的模板,可以接受各種各樣的數(shù)據(jù)類型,Symbian OS主要提供了3類動態(tài)數(shù)組: RArray , RPointerArray, CArray活動
31、對象 在symbian os 中活動對象是一種非搶先式多任務處理的機制,是symbian os 中一個十分重要的概念??捎糜谔娲鶶ymbian OS中的多線程 。使用活動對象可獲得的好處是:在同一個線程中運行的活動對象之間進行切換的代價要比線程上下文的切換代價低,這使得對于各種資源比較緊張的Symbian OS來說,使得活動對象更適合事件驅動多任務。 概念:一個活動對象必須派生自基類CActive class CActive : public CBasepublic: enum Tpriority EPriorityIdle = -100; EPriorityLow = -20; EPrior
32、ityStandard = 0; EPriorityUserInput = 10; EPriorityHigh = 20;Symbian基本語法活動對象 public: IMPORT_C CActive (); IMPORT_C void Cancel ();/刪除未完成請求的函數(shù) IMPORT_C void SetPriority (TInt aPriority); Inline TBool IsActive () const; protected: IMPORT_C CActive (TInt aPriority); IMPORT_C void SetActive (); virtual
33、void DoCancel () = 0;/兩個純虛函數(shù),繼承類必須實現(xiàn)它們 virtual void RunL () = 0;/處理函數(shù) IMPORT_C virtual TInt RunError (TInt aError);public: TrequestStatus iStatus;/代表請求狀態(tài) .private: TBool iActive; . 構造時也會有一個優(yōu)先級值來決定它們如何被調度 Cancel 和DoCancel用來取消發(fā)出的請求,Docancel是一個純虛函數(shù),需要由派生類實現(xiàn)。Cancel的功能就是調用DoCancel,如果用戶取消當前請求調用Cancel而不是Do
34、Cancel,但在代碼中要實現(xiàn)DocancelSymbian基本語法活動對象IsActive確定活動對象是否處于活動狀態(tài)SetActive 激活活動對象,一般在調用請求后緊接著調用它。RunL 異步事件處理函數(shù),當一個請求完成時,活動對象調度器會調用這個函數(shù),進行下一步處理RunError 當RunL函數(shù)出現(xiàn)異常時會出現(xiàn)RunError函數(shù),它也是純虛函數(shù),需要派生類實現(xiàn)。 具體例子見文檔。文件管理 symbian系統(tǒng)采用了C/S(客戶端/服務器)的架構。對于文件操作,系統(tǒng)有一個文件系統(tǒng)管理的服務器。程序通過聯(lián)結這個文件管理服務器來進行文件 。 在symbian os 中,F(xiàn)lash(閃存)通
35、常被定義在c盤,symbian智能手機中還有一個ROM存儲器通常被映射在z盤,用戶的許多文件也存放在z盤。其他可移動存儲(如存儲卡)則映射在d,e等盤符。 symbian開發(fā)環(huán)境下各盤符對應的映射關系: 客戶機c:盤 對應開發(fā)平臺中sdk的 epoc32winsc目錄 客戶機d:盤 對應開發(fā)平臺中sdk的epoc32winsd目錄 客戶機z:盤 對應開發(fā)平臺中sdk的epoc32releasewinsurelz目錄或者 epoc32releasewinsurelz文件命名規(guī)則 一個完整的symbian os 文件應該包含以下四個部分 1.驅動器名,即盤符 2. 路徑,從根目錄到或當前會話目錄起
36、到文件經(jīng)過的所有目錄路徑 3.文件名,遵循c/c+命名規(guī)范 4.文件擴展名 例如:c:myfiledata.txt就是合法的文件名,一個完整的文件名不能超過255個字符。Symbian基本語法文件管理文件訪問流程 1.應用程序要進行文件讀寫之前,必須建立應用程序與文件服務器的連接,這種連接也稱會話(session),Sysmbian os中提供RFs類來實現(xiàn)這個功能,該類提供了Connect()和Close()函數(shù)來建立和關閉連接。 RFs fsSession; /建立RFs類的對象 User:LeaveIfError(fsSession.Connect(); /建立連接,為防止出現(xiàn)異常放 U
37、ser:LeaveIfError中 fsSession.Close(); /用完關閉連接 2.文件服務器可以實現(xiàn)文件的讀、寫、刪、建, 通過 RFile的Open(RFs aFs, const TDesC& aName, TUnit aFileMode) 打開文件 。 通過Write( )和Read( )可以實現(xiàn)文件的寫和讀。 RFile的Create( )用于建立新文件。 刪除文件可以使用RFs的Delete( )。 3.另一種比較重要的文件讀寫方式 -流(Stream) 文件輸出流 RWriteStream 和文件輸入流RReadStream 文件輸出六主要使用RWriteStream 的
38、派生類RFileWriteStream 將數(shù)據(jù)外化為流,它需要先打開一個文件,打開文件的兩種方式: OpenL : 當文件不存在會產(chǎn)生異常,所以必須保證文件存在 Replace: 文件存在刪除并重建新的,不存在就創(chuàng)建,因每次都創(chuàng)建文件,會帶來額外開銷。 例子:RFileWriteStream writer;writer.PushL(); / writer on cleanup stackUser:LeaveIfError(writer.Replace(iCoeEnv-FsSession(), *iFileName, EFileWrite);writer SetTypeL(FileStore-L
39、ayout();TStreamId id = iDb.CreateL(FileStore);FileStore-SetRootL(id);FileStore-CommitL();CleanupStack:PopAndDestroy( FileStore );iOpen = ETrue;iDb.Close(); Symbian基本應用數(shù)據(jù)庫管理 (3)創(chuàng)建表格:通過文件流存儲打開數(shù)據(jù)庫:_LIT( KFileName, C:DataBase.db );CFileStore* FileStore = CPermanentFileStore:OpenLC( iFsSession, KFileName
40、, EFileRead|EFileWrite);FileStore-SetTypeL(FileStore-Layout();iDb.OpenL( FileStore, FileStore-Root() );添加字段:_LIT(KId, Id);_LIT(KText, Text);_LIT(KTableName, Table);TDbCol IdCol( KId, EDbColText );TDbCol TextCol( KText, EDbColText );CDbColSet* ColSet = CDbColSet:NewLC();ColSet-AddL(IdCol);ColSet-AddL
41、(TextCol);創(chuàng)建表格:User:LeaveIfError( iDb.CreateTable( KTableName, *ColSet ) ); 釋放不使用的內存:CleanupStack:PopAndDestroy(ColSet);CleanupStack:PopAndDestroy( FileStore ); Symbian基本應用數(shù)據(jù)庫管理 (4)創(chuàng)建索引:TDbKeyCol IdKey( KId );CDbKey* key=CDbKey:NewLC();key-AddL( IdKey );User:LeaveIfError( iDb.CreateIndex( KTableName
42、, KTableName, *key);CleanupStack:PopAndDestroy(key);首 先創(chuàng)建一個索引對象,將其添加到索引集合中,通過調用RDbStoreDatabase:CreateIndex(const TDesC& aName,const TDesC& aTable,const CDbKey& aKey)創(chuàng)建表格,最后清除不使用的內存。 (5)插入記錄:_LIT(KIdText, 100001); 首先打開數(shù)據(jù)庫。打開表:RDbTable table;CleanupClosePushL(table);User:LeaveIfError( table.Open(iDb,
43、 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
44、基本應用(6)查詢記錄:首先打開數(shù)據(jù)庫和表。TPtrC ptrc;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ù)據(jù)庫。TBuf SQL;SQL
45、.Append( _L(/Some SQL) );RDbUpdate DbUpdate;TInt incStat = DbUpdate.Execute(iDb, SQL, EDbCompareNormal);incStat = DbUpdate.Next();while( incStat = 1 )incStat = DbUpdate.Next();DbUpdate.Close(); Symbian基本應用 Symbian GUI編程60系列用戶界面顯示器規(guī)范如下: 分辨率:176像素(寬)208像素(高)正方形像素 物理尺寸:約35mm(寬),41mm(高), 對應約0.2mm的象素點距。
46、顏色數(shù)(4096色或更多) Symbian GUI編程Symbian GUI編程顯示器按照一定的層次結構進行布局。布局由被稱為窗口(windows)和窗格(panes)的組件構建。 屏幕(Screen)是最頂層的顯示組件,對應于物理屏幕的整個象素區(qū)域。 窗口(Window)屏幕(screen)是窗口的唯一父組件。一般情況下一個窗口會充滿整個屏幕,但有時也存在一些小窗口(臨時性的),它們只占據(jù)屏幕的一部分,環(huán)繞其周圍的部分是可見的。 每個應用程序都在自己的窗口中運行。應用程序也可以調用其它的臨時窗口。 窗格(Pane) 窗格是窗口(window)的子組件。 一個窗口可以包含多個窗格,而每個窗格又
47、可以包含多個子窗格,如此等等。不含有子組件的底層組件被稱為元素(element)。 應用窗口 應用窗口是覆蓋整個屏幕的主窗口。通常它并不直接用于顯示,而是作為各種窗格的父組件。 一個典型的應用窗口由下幾種窗格組成: - 狀態(tài)窗格 - 主窗格 - 控制窗格 Symbian GUI編程GUI應用程序的基本組成部分Application負責啟動方面的工作Document負責永久保持的工作AppUI負責接受并處理用戶的命令AppView負責圖形顯示的工作Model可選:負責處理數(shù)據(jù)view架構view是一個執(zhí)行特定任務的一屏同一時刻,view管理系統(tǒng)只允許一個view處于激活狀態(tài)每個view都有一個I
48、D每個view必須到view server上去登記調用ActiveViewL()還能夠激活其它應用程序的views在view之間能夠傳遞消息class CMyView : public CAknViewCCoeControl框架主要內容簡單控件CCoeControl概述控件的初始化控件的重繪用戶輸入處理(按鍵事件)復合控件常用控件對話框表格資源菜單軟鍵熱鍵CCoeControl框架WINDOWS serverCCoeControl框架WINDOWS serverCoeControl可以作為視圖的基類傳統(tǒng)的EIKON視圖架構containerdialog負責應用程序視圖區(qū)域的顯示工作一個應用程序
49、的界面分為三部分標題欄軟鍵區(qū)域應用程序視圖區(qū)域(右圖的黑框部分)使用CGraphicsContext進行畫圖在UI平臺能力范圍內工作(如:60系列)系統(tǒng)提供的常用控件有按鈕編輯器文本標簽列表框可以內嵌其它控件(又稱定制控件,或者復合控件)CoeControl所有對屏幕的操作都是在控件上進行控件從CCoeControl繼承而來控件是屏幕上的一個矩形區(qū)域控件占據(jù)窗口的全部或者部分應用程序的視圖使用至少一個控件控件可以處理用戶的輸入事件鍵盤事件鼠標事件CoeControl是所有控件的基類被派生類直接調用的函數(shù)SetRect()CreateWindowL()被派生類重載的函數(shù)OfferKeyEvent
50、L()Draw()所擁有的函數(shù)可以分為以下三類初始化Drawing用戶輸入處理初始化class CAbcContainer : public CCoeControl public: / Constructors and destructor void ConstructL(const TRect& aRect); CAbcContainer(); private: / Functions from base classes void SizeChanged(); void Draw(const TRect& aRect) const;void CAbcContainer:ConstructL(
51、const TRect& aRect) CreateWindowL();SetRect(aRect); ActivateL(); 初始化class CAbcContainer : public CCoeControl public: / Constructors and destructor void ConstructL(const TRect& aRect); CAbcContainer(); private: / Functions from base classes void SizeChanged(); void Draw(const TRect& aRect) const;void
52、 CAbcContainer:ConstructL(const TRect& aRect) CreateWindowL();SetRect(aRect); ActivateL(); Drawingvirtual void Draw(const TRect& aRect) const;負責產(chǎn)生控件的圖形化外觀重要提示基類中的該函數(shù)為空,在派生類中如果不實現(xiàn)該函數(shù)的話控件將不可見該方法由應用程序框架調用,不要自己調用該函數(shù)方法是const,意味著你在Draw()中不能更改任何成員變量,或者調用任何不是const的函數(shù)。該函數(shù)不允許leave,因此你必須用TRAP封裝可能leave的函數(shù)Draw()
53、void CAbcContainer:Draw(const TRect& aRect) const CWindowGc& gc = SystemGc(); gc.SetPenStyle( CGraphicsContext:ENullPen ); gc.SetBrushColor( KRgbDarkBlue ); gc.SetBrushStyle( CGraphicsContext:ESolidBrush ); gc.DrawRect( aRect ); /gc.Clear() 圖形設備接口GDI抽象類CGraphicsContext(圖形上下文)定義了一致的接口派生類CWindowGc和CFb
54、sBitGc具體實現(xiàn)了這些接口可以直接使用CFbsBitGc繪圖,但不推薦:推薦的繪圖方式建議在程序中使用CWindowGc提供的接口圖形上下文 CWindowGc& SystemGc() const用來獲取當前的圖形上下文提供了許多有用的繪圖函數(shù)畫點、線、橢圓、矩形、位圖等等改變畫筆/畫刷的顏色和風格改變字體設置裁剪區(qū)域,原點在某一時刻CWindowGc只能由一個窗口激活void Activate(RDrawableWindow& aWindow)void Deactivate()控件的重繪(redraw) 更新在屏幕上的顯示兩種類型系統(tǒng)發(fā)起的window server我們“必須”重繪控件應
55、用程序發(fā)起的內部狀態(tài)改變我們“想要”重繪控件系統(tǒng)發(fā)起的重繪當window server檢測到可能使一個區(qū)域無效的事件對話框/菜單不再需要時啟動一個GUI程序時發(fā)送redraw消息給擁有窗口的應用程序應用程序通過CONE發(fā)送消息給相關的控件調用控件的Draw()函數(shù)應用發(fā)起的重繪通常是某個內部狀態(tài)改變的結果實現(xiàn)方法有以下幾種:Invalidate控件窗口的某部分,讓window server發(fā)送一個redraw消息請求CONE立即重繪整個控件立即重繪控件的某個部分所有的實現(xiàn)方法最終都是調用Draw()函數(shù)redraw的類型立即重繪整個控件CCoeControl:DrawNow()在程序初始化時采
56、用一旦有機會就重繪整個窗口: void CCoeControl:DrawDeferred() const部分窗口: void RWindow:Invalidate(const TRect&)立即重繪已知無效的部分void CSemView:DrawSunNow() const Window().Invalidate(iSunArea); ActivateGc(); Window().BeginRedraw(iSunArea); DrawSun(); Window().EndRedraw(); DeactivateGc();更多Draw()的信息參數(shù)aRect指定重繪的區(qū)域相對于控件的原點(左上
57、角)對于簡單控件,通常重繪整個控件對于復合控件,只重繪部分控件防止屏幕閃爍只重繪位于無效區(qū)域的部分不要短時間內多次重繪某個區(qū)域盡量避免大面積的重繪處理按鍵事件控件能夠檢測并處理按鍵事件按鍵事件的處理是獨立于資源文件定義的熱鍵處理之外的UI框架已經(jīng)實現(xiàn)了大部分的按鍵處理典型應用導航鍵選擇鍵CONE控件堆棧按鍵事件由系統(tǒng)通告給對其感興趣的控件在一個特殊的數(shù)據(jù)結構(CONE控件堆棧)中登記感興趣的控件系統(tǒng)給控件發(fā)送OfferKeyEventL事件CONE控件堆棧中的控件被一一通告事件的發(fā)生,直至某個控件宣稱接收了該事件控件按優(yōu)先級被通告事件的發(fā)生控件必須告知系統(tǒng)是否接收了該事件如果沒有任何控件宣稱接
58、收一個事件,則最后將由AppUi在它的CMyAppUi:HandleKeyEventL()中處理該事件AppUi對按鍵事件的處理在CONE控件堆棧中登記控件void CtestAppUi:ConstructL() BaseConstructL(); iAppContainer = new (ELeave) CtestContainer; iAppContainer-SetMopParent( this ); iAppContainer-ConstructL( ClientRect() ); AddToStackL( iAppContainer );iAppContainer2 = new (E
59、Leave) CtestContainer2; iAppContainer2-SetMopParent( this ); iAppContainer2-ConstructL( ClientRect() ); AddToStackL( iAppContainer2 ); 在析構的時候將控件從CONE控件堆棧中注銷CtestAppUi:CtestAppUi() if (iAppContainer) RemoveFromStack( iAppContainer ); delete iAppContainer; CCoeControl對按鍵事件的處理TKeyResponse OfferKeyEvent
60、L(const TKeyEvent& aEvent, TEventCode aType)TKeyResponse CMyGameView:OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType) switch(aType) case EEventKey: if(aKeyEvent.iScanCode = EStdKeyNkp5 | aKeyEvent.iScanCode = EStdKeyDevice3) iMyGameEngine-Fire(); return EKeyWasConsumed; break; case EEvent
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版金融理財產(chǎn)品銷售合同細則4篇
- 二零二五年度農(nóng)業(yè)科技創(chuàng)新合作合同4篇
- 二零二五年度醫(yī)院院長任期公共衛(wèi)生服務合同4篇
- 二零二五年度時尚服飾連鎖加盟合同協(xié)議3篇
- 二零二五年度公積金提取與個人住房貸款一體化合同
- 二零二五年度新能源發(fā)電項目并網(wǎng)接入合同4篇
- 2025年環(huán)境監(jiān)測技術的創(chuàng)新與應用
- 二零二五年度寧德監(jiān)獄行政區(qū)生態(tài)園林景觀養(yǎng)護協(xié)議4篇
- 2025年度個人租車車輛故障應急處理合同4篇
- 二零二五年度高端論壇組織策劃合同協(xié)議書4篇
- 河南省濮陽市2024-2025學年高一上學期1月期末考試語文試題(含答案)
- 割接方案的要點、難點及采取的相應措施
- 2025年副護士長競聘演講稿(3篇)
- 2024年08月北京中信銀行北京分行社會招考(826)筆試歷年參考題庫附帶答案詳解
- 原發(fā)性腎病綜合征護理
- (一模)株洲市2025屆高三教學質量統(tǒng)一檢測 英語試卷
- 蘇教版二年級數(shù)學下冊全冊教學設計
- 職業(yè)技術學院教學質量監(jiān)控與評估處2025年教學質量監(jiān)控督導工作計劃
- 金字塔原理與結構化思維考核試題及答案
- 基礎護理學導尿操作
- DB11∕T 1028-2021 民用建筑節(jié)能門窗工程技術標準
評論
0/150
提交評論