版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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();returnEKeyWasConsumed;}break;caseEEventKeyDown:……caseEEventKeyUp:……}returnEKeyWasNotConsumed;}点击击事事件件的的处处理理60系系列列并并不不支支持持笔笔写写输输入入但模模拟拟器器支支持持笔笔的的点点击击voidHandlePointerEventL(constTPointerEvent&)复合合控控件件compoundcontrol包含含其其它它控控件件的的控控件件有时时也也称称container,,容容器器为什什么么要要用用复复合合控控件件共享享主主控控件件的的现现有有窗窗口口重用用控控件件系统统控控件件((CEikLabel))自己己的的控控件件((CMyInfoControl))可以以选选择择性性地地重重绘绘子子控控件件容器器((主主控控件件))的的责责任任创建建窗窗口口只为为主主控控件件创创建建窗窗口口子控控件件重重用用该该窗窗口口创建建和和删删除除子子控控件件在主主控控件件中中定定义义成成员员变变量量在析析构构函函数数中中删删除除子子控控件件摆放放子子控控件件设置置自自己己的的大大小小摆放放子子控控件件CCoeControl&Windows创建建一一个个新新窗窗口口CreateWindowL()为主主控控件件所所拥拥有有为子子控控件件所所共共享享重用用现现有有的的窗窗口口SetContainerWindowL(constCCoeControl&aContainer)子控控件件调调用用该该函函数数减少少与与windowserver的的c/s交交互互}创建建子子控控件件在容容器器的的第第二二阶阶段段构构造造函函数数中中创创建建子子控控件件,,并并让让它它们们重重用用容容器器的的窗窗口口voidCtestContainer::ConstructL(constTRect&aRect){CreateWindowL();//创创建建主主窗窗口口iLabel=new(ELeave)CEikLabel;iLabel->SetContainerWindowL(*this);iLabel->SetTextL(_L("ExampleView"));iToDoLabel=new(ELeave)CEikLabel;iToDoLabel->SetContainerWindowL(*this);iToDoLabel->SetTextL(_L("AddYourcontrols\nhere"));SetRect(aRect);ActivateL();}通告告给给CONE相相应应的的信信息息告诉诉CONE拥拥有有的的子子控控件件的的数数目目TIntCtestContainer::CountComponentControls()const缺省省的的实实现现返返回回0返回回子子控控件件的的指指针针CCoeControl*CtestContainer::ComponentControl(TIntaIndex)const用来来依依次次对对所所有有的的子子控控件件执执行行操操作作第一一个个控控件件的的index为为0,,顺顺序序通通常常不不是是很很重重要要如果果忘忘记记重重载载上上述述两两个个函函数数,,则则子子控控件件依依然然存存
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年工程进度调整与补充协议
- 2024年学术交流协议
- 2024年保密责任:高管与机密资料协议
- 2024年搬运工事故应急处理协议
- 2024年房屋买卖合同专业范本
- 2024年教育咨询合同
- 2024年房屋团购集体协议
- 2024年快递行业碳排放减少合同
- 2024体育赛事公司赛事组织承包合同
- 2024年技术股权转让协议书
- 沪科版(2024)八年级全一册物理第一学期期中学业质量测试卷(含答案)
- 51单片机P0口工作原理详细讲解
- 软件项目管理实验报告(共17页)
- CNC84操作手册
- 班级文化建设研究课题研究报告
- 学而思寒假七年级尖子班讲义第5讲二元一次方程组进阶
- 浅议周记在班务工作中妙用
- 国民经济统计学 第3章中间消耗及投入产出核算
- 课程设计(论文)3kta梨果酱车间工艺设计
- 毕业设计(论文)长沙办公楼空调系统设计
- 第三章电阻材料
评论
0/150
提交评论