symbian 系统开发培训_第1页
symbian 系统开发培训_第2页
symbian 系统开发培训_第3页
symbian 系统开发培训_第4页
symbian 系统开发培训_第5页
已阅读5页,还剩73页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SymbianOS开发培训InspurCommunicationInformationSystemsCo.,Ltd

SymbianOS概述

1998年6月,诺基亚(NOKIA)、摩托罗拉(MOTOROLA)、爱立信(ERICSSON)、三菱(MITSUBISHI)和Psion在英国伦敦共同投资成立Symbian公司。这个公司成立的目的是为了能够设计并开发出一种可以在手机及其他类似的移动通讯终端产品上运行的开放性操作系统,以此来推动高端智能移动电话及类似的终端产品尽快进入大众消费领域。之后有西门子(SIEMENS)、三星(SAMSUNG)、松下(Panasonic)、索尼爱立信(SonyEricsson)等手机厂商相继入资,现如今,Symbian操作系统的智能手机已经占据了世界智能手机市场超过80%的份额。SymbianOS概述

Symbian是一个实时性、多任务的纯32位操作系统,具有功耗低、内存占用少等特点,非常适合手机等移动设备使用,经过不断完善,可以支持GPRS、蓝牙、SyncML、以及3G技术。Symbian是一个标准化的开放式平台,任何人都可以为支持Symbian的设备开发软件。与微软产品不同的是,Symbian将移动设备的通用技术,也就是操作系统的内核,与图形用户界面技术分开,能很好的适应不同方式输入的平台,也可以使厂商可以为自己的产品制作更加友好的操作界面,符合个性化的潮流SymbianOS概述

目前SymbianOS手机有三种开发SDK:NokiaSeries80:主要机型有Nokia9200系列NokiaSeries60:主要机型包括诺基亚7650、6600、西门子SX1等UIQ2、UIQ3:SonyEricssonP800,P900SonyEricssonP900开发平台搭建安装ActivePerl(x86和x64分别对应32位和64位cpu)jre(java的应用平台)SymbianOSSDK(建议安装在盘符根目录下)(C++)开发工具手机软件开发过程:开发平台搭建第一步:安装开发软件,搭建开发环境(下面主要介绍series60sdk,其余类似)第二步:在模拟器上开发调试(以VC环境开发为例)第三步:生成sis文件,在手机上安装运行几种开发环境:开发平台搭建VisualC++6.0BorlandC++Builder6CarbideC++开发平台搭建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唯一系统标示符TARGETPATH\system\apps\hello//目标路径SOURCEPATH..\src//源代码存放位置SOURCEhelloApp.cpp//源代码列表…

开发平台搭建

SOURCEPATH..\data//资源文件路径RESOURCEhello.rss//资源文件LANGSC//默认英语

USERINCLUDE.USERINCLUDE..\inc//头文件路径SYSTEMINCLUDE.\epoc32\include//系统包含文件目录LIBRARYeuser.libapparc.libcone.libeikcore.libLIBRARYeikcoctl.libavkon.lib//库文件3.UIDUID1-第一个UID(类型):

UID1用来设定该应用程序是一个执行程序(executablefile)还是一个数据文件(datafile).UIDvalueNumericvalue(Hex)MeaningKExecutableImageUid0x1000007A.exe可执行文件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应应用用程程序序而而言言,,用用于于关关联联数数据据文文件件和和程程序序::1.对对于于dll和和exe文文件件,,它它辩辩识识特特定定的的二二进进制制(itidentifiedtheparticularbinary)。。2.对对于于.app((UIKON应应用用程程序序)),,它它辩辩识识特特定定的的应应用用程程序序(itidentifiedtheparticularapplicationprogram).3.对对于于由由.apps创创建建的的文文件件存存储储(filestores),,它它辩辩识识和和该该文文件件相相关关的的应应用用程程序序(itidentifiestheapplicationprogramassociatedwiththisfile).4.对对于于其其他他文文件件存存储储(filestores),它它没没有有典典型型的的用用途途((但但是是你你可可以以自自定定义义它它的的用用途途))Symbian命命名名约约定定Symbian大大致致分分了了四四种种类类C::C前前缀缀表表示示类类从从CBase派派生生并并应应该该基基于于堆堆构构造造。。T::T前前缀缀表表示示一一个个简简单单类类,,这这种种类类不不拥拥有有任任何何额额外外的的资资源源。。如如Tint、、TReal等等基基本本数数据据类类型型。。R::R前前缀缀表表示示一一个个资资源源类类,,它它包包含含其其它它位位置置拥拥有有资资源源的的句句柄柄。。M::M前前缀缀表表示示一一个个接接口口类类,,它它定定义义了了接接口口但但需需要要派派生生类类实实现现。。结构构(struct)类类型型作作为为T类类对对待待,,因因为为它它也也不不拥拥有有任任何何额额外外的的资资源源,,它它的的前前缀缀通通常常是是T((但但也也有有一一些些以以S开开头头))。。enumTColors{ERed,//尽尽量量用用E开开头头,,尽尽量量用用枚枚举举EGreen}成员员变变量量的的名名字字以以i开开头头,,参数数名名以以a开开头头classTMyClass{TIntiMyValue;voidMyAddFunc(TIntaArg1,TIntaArg2);voidMyAddFunc(TIntaArg1,TIntaArg2);voidMyAddFuncL(TIntaArg1,TIntaArg2);-------->后后缀缀L的的约约定定是是该该函数数可可能能产产生生异异常常退退出出;voidMyAddFuncLC(TIntaArg1,TIntaArg2);---------->后后缀缀LC的的约约定定表表示示成成功功完完成成之之后后,,返返回回值值会会被被压压入入清清理理栈栈中中;((栈栈不不保保存存))};Symbian编编程规规范和和基本本框架架Symbian命命名约约定常量应应加前前缀KconstCIntKMyconstant;宏全部部为大大写#defineMY_HARDCODED_VALUE(25)Symbian四个个主要要的应应用软软件框框架类类针对右右图Graphics,,UI程程序应应该具具备的基本本功能能类::视图图(View))、文文档((Document)、、应用程程序((Application))、应用程程序UI((ApplicationUI)。。所有的的S60UI应用用程序序都具具有一一些基基本功功能::提供一一个用用户界界面,,用于于显示示信息息并允允许用用户进进行交交互。。响应各各种用用户启启动的的事件件,比比如用用户选选择一一个菜菜单项项。响应系系统启启动的的不同同事件件,比比如导导致屏屏幕重重绘的的window服务务器事事件。。能够保保存和和恢复复应用用程序序数据据。可以唯唯一性性的向向框架架标志志自身身。向框架架提供供有关关应用用程序序的描描述性性信息息,比比如图图标和和标题题等。。Symbian编编程规规范和和基本本框架架Symbian四个个主要要的应应用软软件框框架类类一个程程序只只能有有一个个文档档,可可以有有多个个视图图。必须创创建下下面的的每个个方法法,才才能提提供最最小的的S60应应用程程序::所有S60UI都都实现现一个个全局局函数数E32DLL(),当应应用程程序启启动时时,框框架将将首先先调用用该函函数,,该函函数也也称为为DLL入口点点,应用用程序序必须须存在在该函函数。。框架调调用NewApplication(),,创建建Application类,,其基类是是CAknApplication.Application类创建应应用程程序类类的Document对象,并返返回它它的指指针,,以后后框架架使用用该指指针完完成应应用程程序的的创建建。由由框框架调调用AppDllUid()返回应应用程程序的的UID。。该函函数必必须返返回在在.mmp文件中中指定定的值值。Document基类类是CAknDocument.Document对对象通过CreateAppUiL创建获取AppUi类的的指针针。AppUi类的的基类类是CAknAppUi或者CAknViewAppUi,,它是用用来处处理应用用程序序事件件,如如操作作菜单单,操作视视图,,切换换视图图等等等。View是是控控制类类(c类)),在在屏幕幕上显示示数据据,用用户与与界面面交互互,传递命命令给给AppUi。。Symbian编编程规规范和和基本本框架架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中中,如如果在在一个个类的的构造造函数数中需需要执执行某某些比比如申申请内内存等等操作作,那那么有有可能能会Leave。如如果Leave的话话,这这个时时候这这个类类的析析构函函数数是不不会被被调用用,因因为还还没有有初始始化完完,也也就没没法把把自己己加入入CleanupStack,那那么那那些申申请了了的内内存可可能会会因为为没有有变量量引用用而造造成内内存泄泄漏。。因此此在在Symbian中中类的的构造造函数数中不不能有有可能能会Leave的代代码。。Symbian编编程规规范和和基本本框架架Symbian二阶阶段构构造初始化化一个个类确确实需需要执执行某某些可可能会会Leave的的函数数,这这就是是Symbian中中要求求的两阶阶段初初始化化了。。第一一阶段段,也也就是是在构构造函函数中中执行行一些些不会会Leave的初初始化化工作。然然后是是第二二阶段段,把把这个个实例例推进进CleanupStack,再再执行行第二二阶段段的可可能会会Leave的代代码。。当然然,在在析构构函数数中,,要能能够够处理理部分分初始始化的的情况况,也也就是是实例例没有初始始化成成功,,也能能释放放那些些已经经申请请的内内存或或资源源。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编编程规规范和和基本本框架架描述符符描述符符是用用来存存储文文本和和二进进制的的基本本类抽象类类(Abstract):(TDes、TDesC、TDes8、TDesC8),描描述符符的基基类,,仅提提供接接口和和基本本功能能,不不能被被实例例化,,一般般只用用作函函数的的参数数。文字常常量(Literal):(TlitC、_LIT()),用用于存存储文文字字字符串串(literalstring),即即C中中字符符串常常量,,通常常使用用_LIT()这种方方式,,也有有_L(),_L8()这种方方式。。栈类(Buffer):(TBuf、TBufC、TBuf8、TBufC8),数数据存存储于于栈上上,最最基本本的描描述符符变量量类型型,大小在在编译译时确确定,包含含描述述符本本身数数据,,使用用最为为普遍遍,具具体方方法如如下堆类(Heap):(HBufC、HBufC8),数数据存存储于于堆上上,大大小在在运行行时确确定,,也就是是用来来处理理动态态申请请的描描述符符类。。在C/C++中用用过动动态内内存的的都知知道,,动态内内存是是啥回回事,,这里里堆类类描述述符用用的时时候,,也是是差不不多,,由于于堆描描述符符没有构构造函函数,,所以以只能能声明明为指指针类类型,,通过过堆描描述符符类内内静态态函数数NewL方法申申请内内存,,具体体方法法如下下HBufC*errorTitleCode=HBufC::NewLC(50);HbufC*unUseCode=NULL;指针类类(Pointer):(TPtr、TPtrC、TPtr8、TPtrC8),本本身不不包含含描述述符数数据,,但是是包含含长度度数据据,而而且还还包含含一个个指向向位于于描述述符之之外数数据的的指针针。Symbian基本语语法描述符关关系简图图Symbian基本语语法描述符的的使用文字描述述符常量量_LIT(KMyFile,“c:\System\Apps\MyApp\MyFile.jpg”);它可以以在任何何使用TDesC&的地方使使用。。//常用用的通知知函数NEikonEnvironment::MessageBox(_L("Error:initfilenotfound!"));//数字字转字符符串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基本语语法描述符的的使用栈描述符符尽管这里里的对象象表示数数据是不不能被修修改的((因为有有个后缀缀C代表表了常量量的意思思),但但仍然有有两种方方式可以以用来修修改数据据内容::这里的的数据可可以用赋赋值的方方式替换换掉;使使用Des()函数构构造出一一个TPtr对对象,这这样就可可以用它它来修改改数据。。_LIT(Ktext,"TestText");_LIT(Ktext1,"TestText””);_LIT(KXtraText,"New:");TBufC<10>Buf1(Ktext);//Buf1长长度为9内容容“TestText””TBufC<10>Buf2(Ktext1);//Buf2长度度为10内容容“Test1Text”//通通过赋值值的方式式改变数数据Buf2=Buf1;//Buf2长长度变为为9内内容““TestText”//通过过使用Des()生成成指针改改变TBufC的数据据TPtrPointer=Buf1.Des();//删删除后四四个字符符Pointer.Delete(Pointer.Length()-4,4);//Buf1长长度变为为5内内容“Test”//增增加新的的数据Pointer.Append(KXtraText);//Buf1长长度为9内容容为“TestNew:””//也也可以使使用下列列方式改改变数据据TBufC<10>Buf3(NewText);Pointer.Copy(Buf3);//Buf1长度为为4,内内容为New1//或或直接从从字符串串里获得得数据Pointer.Copy(NewText1);//Buf1长度度为4,,内容为为New2Symbian基本语语法描述符的的使用栈描述符符可修改的的描述符符TBuf,TBuf8就就不用通通过那么么复杂的的方法来来实现修修改,它它直接可可以用Copy、Delete等方方法,但但是无论论可修改改的还是是不可修修改的,,一旦指指定最大大的数据据长度后后,最大大长度就就不能进进行修改改了修改改的只是是数据内内容,而而数据内内容修改改的受限限条件是是不能超超过声明明或定义义时的最最大长度度。堆描述符符堆描述符符HBufC,HbufC8虽然都都是不可可修改类类型的,,但是它它仍然具具有构造造和修改改,与栈栈描述符符不同的的是:首首先对内内存需要要显示释释放,其其次是堆堆描述符符没有最最大长度度的限制制,任何何时候都都可以用用ReAlloc())函数重重新申请请分配。。有两种种方式来来生成一一个堆描描述符示示例://第一一种方式式用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.赋值方方式改变变其数据据的方法法_LIT(KText1,"Text1");*Buf1=KText1;Symbian基本语语法描述符的的使用堆描述符符堆描述符符的修改改方式:://2.通过过可修改改指针来来改变数数据的方方式TPtrPointer=Buf1->Des();Pointer.Delete(Pointer.Length()-2,2);//删除除数据_LIT(KNew,"New:");Pointer.Append(KNew);//添加数数据重新申请请内存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);//使使用构造造函数初初始化TPtrCPtr1;Ptr1.Set(Buf);//利用用set函数初初始化Symbian基本语语法描述符的的使用指针描述述符不可修改改的指针针TPtrC用TText*构造TPtrCconstTText*text=_S("HelloWorld\n");TPtrCptr(text);//或或者TPtrCPtr2;Ptr2.Set(text);//如果果要存储储TText的的一部分分数据,,我们使使用下列列方法TPtrCptr4(text,5);从另一个个TPtrC中中构造TPtrCconstTText*text1=_S("HelloWorld\n");TPtrCPtr3(text1);//从从一个TPtrC中获获得另一一个TPtrCTPtrCp1(Ptr3);//或或TPtrCp2;p2.Set(Ptr3);可修改的的TPtr同同不可修修改的指指针描述述符构造造方法基基本类似似,区别别在于,,不可修修改的指指针描述述符TPtrC的函数数始终是是不可修修改的,,因此没没有Insert,Delete等等函数,,并且没没有Des()函数,,但有Alloc(),Compare(),Find(),Mid(),Size()等函数数。Symbian基本语语法动态数组组在传统c/c++中经常会会使用数数组来存存储序列列,它是是具有相相同数据据类型的的数据元元素的集集合,通通过数组可以很很方便的的实现数数据元素素的访问问等相关关操作。。动态数数组是一一个类的的模板,,可以接接受各种种各样的数据类类型,SymbianOS主要提供供了3类动态数数组:RArray<classT>,RPointerArray<classT>,CArray<classT>活动对象象在symbianos中中活动对对象是一一种非抢抢先式多多任务处处理的机机制,是是symbianos中中一个十分重重要的概概念。可可用于替替代SymbianOS中中的多线线程。。使用活活动对象象可获得得的好处处是:在在同一个线程程中运行行的活动动对象之之间进行行切换的的代价要要比线程程上下文文的切换换代价低低,这使使得对于于各种资源比较较紧张的的SymbianOS来说说,使得得活动对对象更适适合事件件驱动多多任务。。概念:一一个活动动对象必必须派生生自基类类CActiveclassCActive:publicCBase{

public:enumTpriority

{EPriorityIdle=-100;EPriorityLow=-20;EPriorityStandard=0;EPriorityUserInput=10;EPriorityHigh=20;}Symbian基本语语法活动对象象public:IMPORT_C~CActive();IMPORT_CvoidCancel();//删除未未完成请请求的函函数………IMPORT_CvoidSetPriority(TIntaPriority);InlineTBoolIsActive()const;…………

protected:IMPORT_CCActive(TIntaPriority);IMPORT_CvoidSetActive();virtualvoidDoCancel()=0;//两个个纯虚函函数,继继承类必必须实现现它们virtualvoidRunL()=0;//处理理函数IMPORT_CvirtualTIntRunError(TIntaError);public:TrequestStatusiStatus;//代表请请求状态态……….private:TBooliActive;……….}构造时也会有有一个优先级级值来决定它它们如何被调调度Cancel和DoCancel用来取消发发出的请求,,Docancel是一一个纯虚函数数,需要由派派生类实现。。Cancel的功能就就是调用DoCancel,如果用用户取消当前前请求调用Cancel而不是DoCancel,但在代代码中要实现现DocancelSymbian基本语法法活动对象IsActive确定活活动对象是否否处于活动状状态SetActive激激活活动对象象,一般在调调用请求后紧紧接着调用它它。RunL异异步事件处理理函数,当一一个请求完成成时,活动对对象调度器会会调用这个函函数,进行下下一步处理RunError当RunL函数数出现异常时时会出现RunError函数,它它也是纯虚函函数,需要派派生类实现。。具体例子见文文档。文件管理symbian系统采用用了C/S(客户端/服服务器)的架架构。对于文文件操作,系系统有一个文文件系统管理理的服务器。程序通通过联结这个个文件管理服服务器来进行行文件。在symbianos中,Flash(闪闪存)通常被被定义在c盘盘,symbian智能能手机中还有有一个ROM存储器通常被映射在在z盘,用户户的许多文件件也存放在z盘。其他可可移动存储((如存储卡))则映射在d,e等盘符。symbian开发环境境下各盘符对对应的映射关关系:客户机c:盘盘对应开开发平台中sdk的\epoc32\wins\c目录录客户机d:盘盘对应开开发平台中sdk的\epoc32\wins\d目录客户机z:盘盘对应应开发平台中中sdk的\epoc32\release\wins\urel\z目录或者者\epoc32\release\wins\urel\z文件命名规则则一个完整的symbianos文文件应该包包含以下四个个部分1.驱动器名名,即盘符2.路径,,从根目录到到或当前会话话目录起到文文件经过的所所有目录路径径3.文件名,,遵循c/c++命名规规范4.文件扩展名名例如:c:\myfile\data.txt就是合法的的文件名,一一个完整的文文件名不能超超过255个个字符。Symbian基本语法法文件管理文件访问流程程1.应用程序序要进行文件件读写之前,,必须建立应应用程序与文文件服务器的的连接,这种种连接也称会会话(session)),Sysmbianos中提供供RFs类来来实现这个功功能,该类提提供了Connect()和Close()函函数来建立和和关闭连接。。RFsfsSession;//建建立RFs类类的对象User::LeaveIfError(fsSession.Connect());//建立立连接,为防防止出现异常常放User::LeaveIfError中fsSession.Close();//用完关闭闭连接2.文件服务务器可以实现现文件的读、、写、删、建建,通过RFile的Open(RFsaFs,constTDesC&aName,TUnitaFileMode)打打开文件。。通过Write()和和Read()可以实实现文件的写写和读。RFile的的Create()用用于建立新文文件。删除文件可以以使用RFs的Delete()。3.另一种比比较重要的文文件读写方式式----流(Stream)文件输出流RWriteStream和文文件输入流RReadStream文件输出六主主要使用RWriteStream的派生类类RFileWriteStream将数据据外化为流,,它需要先打打开一个文件件,打开文件件的两种方式式:OpenL::当文件件不存在会产产生异常,所所以必须保证证文件存在Replace:文件件存在删除并并重建新的,,不存在就创创建,因每次次都创建文件件,会带来额额外开销。例子:RFileWriteStreamwriter;writer.PushL();//writeroncleanupstackUser::LeaveIfError(writer.Replace(iCoeEnv->FsSession(),*iFileName,EFileWrite));writer<<*iText; //writethetextwriter.CommitL();CleanupStack::PopAndDestroy();//释放放资源从存储中读取取数据的方法法就是将以上上的过程反向向Symbian基本应用用数据库管理Symbian系统的DBMS提供供了创建与维维持数据库的的功能,通过过本地调用和和SQL调用用,其可以对对数据库进行安全全可靠的数据据访问。这种种调用支持事事务/回滚机机制用以保证证所有数据被被写入或数据据为空的情形获得支持。。DBMS的管管理结构和元元素任何Symbian系统统的DBMS都采用层次次性的结构——最底层是保保存数据库的的文件仓库。。Symbian操作系统统的DBMS是一个功能能强大,或为为轻量集的数数据库关系系系统实现。它它支持普通的的添加/查找//检索/更新新/删除功能能,同时它还还支持基本的的结构化查查询语言(StructuredQueryLanguage:SQL),数据据定义语言((DataDefinitionLanguage:DDL)和和数据建模语语言(DataModelingLanguage:DML)语句处理理。永久文件存储储系统和流Symbian系统的的DBMS依依赖于文件服服务器提供的的资源,Symbian系统所的永永久文件存储储和流能提供系统所需要要的底层存储储功能。永永久文件系统统通过使用CPermanentFileStore来来获得,它是是一个源自CFileStore的具体体类。这些些类在文件件存储API中定义义,可为DBMS提提供组建模模块。创建数据库库(1)RDbStoreDatabase:通通过文件存存储打开的的数据库,,提供了进进行数据库库操作的API,独独占使用数数据库,不可可共享使用用。(2)RDbNamedDatabase:通通过文件名名打开的数数据库,同同样提供API。使使用C/S模式,可可以共享使使用(3)CDbColSet::数据库字字段的集合合,可用于于在数据库库中创建表表格。(4)使用用到的库和和头文件::ws32.libedbms.libd32dbms.hf32file.hs32file.h创建步骤::(1)数据据库类的声声明:将RFs和RDbStoreDatabase声声明为数据据成员。classCMiapSampleDatabase:publicCBase{Symbian基本本应用数据库管理理public://SomeFunctionsprivate:

RFsiFsSession;

RDbStoreDatabaseiDb;};(2)创建建数据库::

首先打打开一个文文件流存储储(FileStore),,通过调用用RDbStoreDatabase::CreateL(CStreamStore*aStore)来来创建数据据库。最后后将文件流流提交。_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基本本应用数据库管理理(3)创建建表格:通通过文件件流存储打打开数据库库:

_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);创创建表表格:User::LeaveIfError(iDb.CreateTable(KTableName,*ColSet));释放不使用用的内存::

CleanupStack::PopAndDestroy(ColSet);

CleanupStack::PopAndDestroy(FileStore);Symbian基本本应用数据库管理理(4)创建建索引:TDbKeyColIdKey(KId);CDbKey*key=CDbKey::NewLC();

key->AddL(IdKey);

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

CleanupStack::PopAndDestroy(key);首首先创创建一个索索引对象,,将其添加加到索引集集合中,通通过调用RDbStoreDatabase::CreateIndex(constTDesC&aName,constTDesC&aTable,constCDbKey&aKey)创创建表格,,最后清除除不使用的的内存。(5)插入入记录:_LIT(KIdText,"100001");首先打打开数据库库。打开表表:

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)查询询记录:首首先打开开数据库和和表。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)执行行SQL语语句:首首先打开数数据库。TBuf<256>SQL;

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

RDbUpdateDbUpdate;

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

while(incStat==1){

incStat=DbUpdate.Next();

}DbUpdate.Close();Symbian基本本应用SymbianGUI编程程60系列用用户界面显显示器规范范如下:分辨率:176像素素(宽)××208像像素(高))正方形像素素物理尺寸::约35mm(宽),41mm(高),对对应约0.2mm的的象素点距距。颜色数(4096色色或更多))SymbianGUI编程程SymbianGUI编程程显示器按照照一定的层层次结构进进行布局。。布局由被被称为窗口口(windows)和窗格格(panes)的的组件构建建。屏幕(Screen)是最顶顶层的显示示组件,对对应于物理理屏幕的整整个象素区区域。窗口(Window)屏幕(screen)是窗口口的唯一父父组件。一一般情况下下一个窗口口会充满整整个屏幕,,但有时也也存在一些些小窗口((临时性的的),它们们只占据屏屏幕的一部部分,环绕绕其周围的的部分是可可见的。每个应用程程序都在自自己的窗口口中运行。。应用程序序也可以调调用其它的的临时窗口口。窗格(Pane)窗格是窗口口(window)的子组件件。一个窗口可可以包含多多个窗格,,而每个窗窗格又可以以包含多个个子窗格,,如此等等等。不含有有子组件的的底层组件件被称为元元素(element)。应用窗口应用窗口是是覆盖整个个屏幕的主主窗口。通通常它并不不直接用于于显示,而而是作为各各种窗格的的父组件。一个典型的的应用窗口口由下几种种窗格组成成:-状态窗窗格-主窗格格-控制窗窗格SymbianGUI编程程GUI应用用程序的基基本组成部部分Application负责启动方方面的工作作Document负责永久保保持的工作作AppUI负责接受并并处理用户户的命令AppView负责图形显显示的工作作Model可选:负责责处理数据据view架架构view是是一个执行行特定任务务的一屏同一时刻,,view管理系统统只允许一一个view处于激激活状态每个view都有一一个ID每个view必须到到viewserver上上去登记调用ActiveViewL()还能能够激活其其它应用程程序的views在view之之间间能能够够传传递递消消息息classCMyView:publicCAknViewCCoeControl框框架架主要要内内容容简单单控控件件CCoeControl概概述述控件件的的初初始始化化控件件的的重重绘绘用户户输输入入处处理理((按按键键事事件件))复合合控控件件常用用控控件件对话话框框表格格资源源菜单单软键键热键键CCoeControl框框架架WINDOWSserverCCoeControl框框架架WINDOWSserverCoeControl可以以作作为为视视图图的的基基类类传统统的的EIKON视视图图架架构构--containerdialog负责责应应用用程程序序视视图图区区域域的的显显示示工工作作一个个应应用用程程序序的的界界面面分分为为三三部部分分标题题栏栏软键键区区域域应用用程程序序视视图图区区域域((右右图图的的黑黑框框部部分分))使用用CGraphicsContext进进行行画画图图在UI平平台台能能力力范范围围内内工工作作((如如::60系系列列))系统统提提供供的的常常用用控控件件有有按钮钮编辑辑器器文本本标标签签列表表框框可以以内内嵌嵌其其它它控控件件((又又称称定定制制控控件件,,或或者者复复合合控控件件))CoeControl所有有对对屏屏幕幕的的操操作作都都是是在在控控件件上上进进行行控件件从从CCoeControl继继承承而而来来控件件是是屏屏幕幕上上的的一一个个矩矩形形区区域域控件件占占据据窗窗口口的的全全部部或或者者部部分分应用用程程序序的的视视图图使使用用至至少少一一个个控控件件控件件可可以以处处理理用用户户的的输输入入事事件件键盘盘事事件件鼠标标事事件件CoeControl是所所有有控控件件的的基基类类被派派生生类类直直接接调调用用的的函函数数SetRect(())CreateWindowL(())被派派生生类类重重载载的的函函数数OfferKeyEventL()Draw()所拥拥有有的的函函数数可可以以分分为为以以下下三三类类初始始化化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;负责产生控件件的图形化外外观重要提示基类中的该函函数为空,在在派生类中如如果不实现该该函数的话控控件将不可见见该方法由应用用程序框架调调用,不要自自己调用该函函数方法是const,意味味着你在Draw()中中不能更改任任何成员变量量,或者调用用任何不是const的的函数。该函数不允许许leave,因此你必必须用TRAP封装可能能leave的函数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具体实现现了这些接口口可以直接使用用CFbsBitGc绘绘图,但不推推荐:推荐的绘图方方式建议在程序中中使用CWindowGc提供的接接口图形上下文CWindowGc&SystemGc())const用来获取取当前的图形形上下文提供了许多有有用的绘图函函数画点、线、椭椭圆、矩形、、位图等等改变画笔/画画刷的颜色和和风格改变字体设置裁剪区域域,原点在某一时刻CWindowGc只能能由一个窗口口激活voidActivate(RDrawableWindow&aWindow)voidDeactivate()控件的重绘(redraw)更新在屏幕上上的显示两种类型系统发起的windowserver我们“必须””重绘控件应用程序发起起的内部状态改变变我们“想要””重绘控件系统发起的重重绘当windowserver检测测到可能使一一个区域无效效的事件对话框/菜单单不再需要时时启动一个GUI程序时发送redraw消息给给拥有窗口的的应用程序应用程序通过过CONE发发送消息给相相关的控件调用控件的Draw()函数应用发起的重重绘通常是某个内内部状态改变变的结果实现方法有以以下几种:Invalidate控控件窗口的某某部分,让windowserver发送一一个redraw消息请求CONE立即重绘整整个控件立即重绘控件件的某个部分分所有的实现方方法最终都是是调用Draw()函数数redraw的类型立即重绘整个个控件CCoeControl::DrawNow()在程序初始化化时采用一旦有机会就就重绘整个窗口:voidCCoeControl::DrawDeferred()const部分窗口:voidRWindow::Invalidate(constTRect&)立即重绘已知知无效的部分分voidCSemView::DrawSunNow()const{Window().Invalidate(iSunArea);ActivateGc();Window().BeginRedraw(iSunArea);DrawSun();Window().EndRedraw();DeactivateGc();}更多Draw()的信息息参数aRect指定重绘的区区域相对于控件的的原点(左上上角)对于简单控件件,通常重绘绘整个控件对于复合控件件,只重绘部部分控件防止屏幕闪烁烁只重绘位于无无效区域的部部分不要短时间内内多次重绘某某个区域尽量避免大面面积的重绘处理按键事件件控件能够检测测并处理按键键事件按键事件的处处理是独立于于资源文件定定义的热键处处理之外的UI框架已经经实现了大部部分的按键处处理典型应用导航键选择键CONE控件件堆栈按键事件由系系统通告给对对其感兴趣的的控件在一个特殊的的数据结构((CONE控控件堆栈)中中登记感兴趣趣的控件系统给控件发发送OfferKeyEventL事件CONE控件件堆栈中的控控件被一一通通告事件的发发生,直至某某个控件宣称称接收了该事事件控件按优先级级被通告事件件的发生控件必须告知知系统是否接接收了该事件件如果没有任何何控件宣称接接收一个事件件,则最后将将由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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论