灵通163百科在线-实用的手机,证券免费资源网站

您现在的位置:首页 > 手机图文教程 > MTK手机教程 >

MTK手机开发入门教程doc下载

教程来源:www.lt163.com     点击数:     更新时间:2018-01-10 10:04

一、、​ 开发环境设立、开发主机要求及所需工具:操作系统:Windows,WinXP推荐WindowswithSPorlater编译器:ADS(ArmDeveloperSuite)vBuildPerl解析:ActivePerl,推荐使用ActivePerl版本仿真工具:MTKPCSimulator跟踪工具:CatcherLv从串口输出调试信息只做普通UI应用的话大致不会用到用PC仿真工具就好了烧录工具:FlashToolUIv或FlashToolv其他:PLDriverXPKv这是下载线用到的USB串口驱动以前机器上装过PL驱动的建议改用这个否则可能会有蓝屏的问题。、开发环境建立过程:新建一个目录英文的好了否则有些工具不认识中文路径这里以E:MTKP为例说明下面我用文字和图片简单说明下安装过程更详细的安装过程可以看压缩文件“手机开发板C语言开发视频rar”中的Flash文件“PBuildEnvswf”。)​ 安装ADS解压文件huayuadsrar到某个目录比如说解压到“E:MTKP”解压完后运行“E:MTKPADSSetupexe”一路按下一步最后安装License时选定文件“E:MTKPADSCRACKlicensedat”然后接着一路下一步直到安装完。安装完后删掉目录“E:MTKPADS”节省磁盘空间。)​ 安装ADS补丁运行huayuADSPatchWindowsrar压缩文件中的ADSPatchWindowexe这是个自解压的压缩文件选Unzip解压到上一步ADS的安装目录(缺省是C:ProgramFilesARMADSv)解压过程中如果问到是否覆盖全部选覆盖好了。)​ 安装脚本解释器Perl直接运行压缩包huayuperlziprar里面扩展名为msi的安装文件缺省安装就好一路Next呵呵。上述几步完成后编译环境基本建立此时可以开一个dos窗(开始菜单>运行>输入cmd>确定)看一下安装正常应该能顺利执行以下命令如下图:注意看版本号应该是ADSBuild不是的话可能没打补丁或补丁打的位置不对请看第步ADS补丁部分的说明并重新打一次直到版本号对为止哈哈。这是perl解释器的运行画面。注:上述安装过程会自动创建编译环境所需的环境变量如果发现编译不正常了可能是安装了其他编译工具导致冲突这时建议查看下系统环境变量把Perl和ADS的安装目录调到最前面同时从path中去掉可能会产生冲突的编译工具链的路径(例如winavr)如下图所示(我是安装到D盘滴缺省是C盘不过我C盘几乎被我塞满了):如果嫌改path麻烦(因为要用到其他编译工具链的时候还得改回去)还有一种办法就是改makebat批处理具体见注中相关说明。注:如果安装ADS时改变了默认安装路径需要修改源码中的设置源码目录树解压过程见模拟器编译环节相关介绍。makeOptionmakifeq($(strip$(COMPILER)),ADS)DIRARM=c:progra~armadsv#修改这里DIRARM:=$(strip$(DIRARM))DIRTOOL=$(DIRARM)binDIRARMLIB=$(DIRARM)libDIRARMINC=$(DIRARM)includeendif比如改装到D盘了这里把红色部分“c”改成“d”就好了)​ 代码编辑环境运行压缩文件huayuSourceInsightrar中的安装文件安装即可。至于编辑器这个看个人喜好了不过SourceInside看代码蛮方便的。)​ PC机模拟器模拟器MTKPCSimulator是用来在PC上仿真调试用的要安装VCSP(同时要安装Uuicode静态和动态库没有装Unicode库的可以用“huayuMTK模拟器DLL补丁zip”中的库拷到系统目录“windirsystem”下即可)。我机器上的VC是有装Unicode库的没装过Unicode库的如果在模拟器编译或运行中出现问题建议重装下VC安装时勾选Unicode库并打上相关补丁到SP。模拟器能模拟真机的大部分行为这样能给调试带来很大便利不需要每次改动都要烧录。模拟器要从源码编译解压压缩包“huayuPVReleaserar”里面的文件“HUAYUPVReleaserar”到目录“E:MTKP”此时会出现目录“E:MTKPPVRelease”这就是P的代码目录树了接着打上最新的补丁解压压缩包“huayuPVReleasepatchrar”里面的压缩文件“HUAYUPVReleasepatchrar”到目录“E:MTKPPVRelease”解压时选择全覆盖以替换被修改过的文件打补丁之前对目录树里面的文件进行修改过的需要手动再加上去。编译PC仿真器之前需要先把刚才上面得到的目录树build一次开一个dos窗盘符和目录转到代码目录树对应的盘符和目录例如:E:cdE:MTKPPVReleasemakenew注:第一次make的时候要用“makenew”makenew的时间比较长(慢的机器搞不好要小时以上)编译过程中间会出现一些文件找不到的信息只要编译过程没意外终止那些信息可以忽略。编译日志文件位置:buildNEOTELBlog要查看编译过程有啥问题就看这个目录下的文件了生成的bin文件位置:buildNEOTELB*bin下载烧录就是烧bin文件。这里顺带介绍下build的命令格式:makenew清除后重新编译整个项目makeresgen重新生成资源makeremake重新编译链接项目makeviewlogxxx查看模块xxx的编译日志make查看可以用make选项帮助信息注:如果机器上装了其他gcc编译工具链(比如winavr之类)的话可能要手动改下Path否则编译会出错修改Path的方法见注也可以修改批处理文件“E:MTKPPVReleasemakebat”在“perlmakepl*”之前加上下面两句:setPERLLIB=D:perllibsetPATH=D:perlbind:progra~armadsvbinE:MTKPPVReleasetoolsc:windowssystemc:windowsc:windowssystem注意上面的路径是我机器上的不是缺省安装路径要根据自己的实际安装路径做修改。下面开始编译PC仿真器了用VC打开工程文件“E:MTKPPVReleaseplutommimmiPCSimulatordsw”,然后开始编译编译时间比较长具体看机器配置了这时又可以干点别的啥了呵呵。因为仿真器工程涉及文件较多编译费时建议编译过程中电脑上少开窗口特别是网络类的如QQ有时会发现开QQ后编译过程中VC会挂死呵呵。有可能是开QQ后防火墙过滤网络数据占用较多系统资源如果发现VC编译特别慢或干脆挂死可以重启动一下电脑只开必要的窗口然后开始编译。如果编译过程中发现怪异的问题如:incomingstringiddefh():errorC:syntaxerror:'constant'或者errorC:'STRCMREDIAL':undeclaredidentifier之类这个时侯你可能需要看一下你VC相关路径的设置顺序如下图:把VC原本的头文件路径调整到最前面我刚开始编译的时候SDK的头文件在前面编译总是通不过改一下就好了库也一样都调整下比较保险呵呵。)​ Tracer跟踪工具解压文件PBuildGuiderar到E:MTKP然后在文件管理器进入目录“E:MTKPPBuildGuide”接着解压CatcherLvzip到当前目录下的CatcherLv子目录进入子目录CatcherLv发送一个Catcherexe的快捷方式到桌面。在需要用到TRACE的时候在代码中使用函数voidkalprompttrace(moduletypemodid,constkalchar*fmt,)打印需要查看的信息使用Catcher跟踪查看。这个有点类似Linux的KernelDebug工具具体使用方法见文档《cather使用手册doc》这个文档可在压缩包“huayup软件使用工具及开发指南rar”里面找到。)​ 烧录工具解压文件“E:MTKPPBuildGuideFlashToolUIexevzip”到当前目录然后进入目录“E:MTKPPBuildGuideFlashToolv”,发送一个Flashtoolexe的快捷方式到桌面好了。还有个下载工具FlashToolvrar也是不用安装解压后直接用的据说烧录速度比上面那个快。具体使用方法见文档《flashtoolMT平台使用教程doc》这个文档可在压缩包“huayup软件使用工具及开发指南rar”里面找到。)​ USB串口下载线驱动运行压缩文件“E:MTKPPBuildGuidePLDriverXPKvzip”里面的可执行文件进行安装一路下一步这里不再赘述。、​ HelloWorld上面一节我们建立好了开发环境现在是时候实战一把了在进行实质性的项目开发之前我们先来了解下P上写程序的一般性做法。从“HelloWorld”开始吧有句笑话讲:“会编程就是会HelloWorld编程高手就是会写很多个HelloWorld”,虽然是句笑话但是细想也是有道理的麻雀虽小五脏俱全嘛掌握了框架剩下的就无非是些编程技巧的问题了。这和建房子一个道理地基打的深不深框架建的是否合理决定房屋总体质量好不好其他就是装修的功夫了当然还有水电线路的铺设这涉及到习惯和技巧了设计不好会漏水漏电哈哈。扯远了下面开始HelloWorld。下面为描述上的方便我们将HelloWorld称为一个模块。首先建立新的模块目录之后把模块相关文件都放到这个目录下统一进行管理新的模块一般放到plutommiMMI下面这里我们新建一个目录“HelloWorld”然后在模块目录“HelloWorld”下再建三个子目录:“Inc”、“Src”和“Res”分别用来存放模块的头文件、源文件和资源文件目录结构如下图所示:接着我们在Inc下创建几个头文件:HelloWorldGprothHelloWorldProth,HelloWorldTypesh,HelloWorldDefsh,再在Src下创建一个源文件:HelloWorldc关于文件名和函数名等的命名标准每个公司及个人各有不同统一就好否则在进行大的项目开发时彼此协同会遇到问题有时候弄不好光这些问题就能折腾你半天甚至数日或数月呵呵。上面几个文件的作用我大致讲下:HelloWorldGproth模块对外接口供模块外部调用的函数原型在此申明模块内部接口就不要放这里了HelloWorldProth模块内部接口供模块内部调用的函数原型在此申明HelloWorldTypesh本模块用到的一些常量、自定义数据类型、结构的定义HelloWorldDefsh本模块用到的资源ID定义HelloWorldc模块功能函数的实现部分头文件HelloWorldGproth的内容大致如下:*************************************************************************#ifndefHELLOWORLDGPROTH#defineHELLOWORLDGPROTH#include"PixtelDataTypesh"#include"HelloWorldTypesh"externvoidmmiHelloWorldentry(void)*模块入口理解成dos程序的main好了*#endif*HELLOWORLDGPROTH**************************************************************************头文件HelloWorldProth的内容的大致如下:*************************************************************************#ifndefHELLOWORLDPROTH#defineHELLOWORLDPROTH#include"HelloWorldGproth"externvoidmmiHelloWorldentry(void)*本模块主界面入口例程*externvoidmmiHelloWorldexit(void)*本模块主界面退出例程*#endif*HELLOWORLDPROTH**************************************************************************其他几个文件的内容因模块功能而异这里先略过后面再讲。紧接着我们要修改的相关系统文件使这个模块成为整个项目的一部分需要修改的系统文件如下:makeplutommiplutommiinc所有mmi部分的头文件所在目录的相对路径列表makeplutommiplutommipth所有mmi部分的源文件所在目录的相对路径列表makeplutommiplutommilis所有mmi部分的源文件(相对路径)列表在上述个文件里面分别加上我们模块的对应内容就现在讲的HelloWorld而言所加内容如下:makeplutommiplutommiinc文件追加一行“plutommimmiHelloWorldInc”makeplutommiplutommipth文件追加一行“plutommimmiHelloWorldSrc”makeplutommiplutommilis文件追加一行“plutommimmiHelloWorldSrcHelloWorldc”再接着我们需要增加一个开关以决定这个模块是否成为最终发布版本的一部分这实际上是一个编译开关需要修改系统文件及相关的模块源文件需要修改的系统文件包括:plutommiCustomerCustResourcePLUTOMMIMMIfeaturesPLUTOh这里我们用名字为“MMIHELLOWORLDENABLED”这个开关好了在这个文件里面追加一行:#defineMMIHELLOWORLDENABLED同时在相关源文件里面用:#ifdefMMIHELLOWORLDENABLED#endif来框住相关代码行就OK了当不打算将这个模块发布的时候注释掉“#defineMMIHELLOWORLDENABLED”这一句重新make一次就好了。下面讲具体实现的部分为了简化描述我们暂时先将我们的模块入口挂接到主菜单入口处(后面讲到资源的部分可将入口移到某个新建的子菜单下)修改下文件“plutommimmimainmenumainmenusrcMainMenuc”中的gotomainmenu函数如下所示红色字体部分:voidgotomainmenu(void){#ifdefMMIHELLOWORLDENABLEDmmiHelloWorldentry()return#else…此处为之前gotomainmenu的代码#endif}同时我们需要在文件MainMenuc中包含头文件HelloWorldGproth所以再在这个文件的头文件包含代码块(通常是文件的顶部区域)追加这一句:#include"HelloWorldGproth"。下面是HelloWorldc的内容:*************************************************************************#include"stdCh"#include"MMIFeaturesh"*编译开关会出现在这个由makeupdate生成的文件里面*#include"LDrh"#include"LDrh"#include"AllAppGproth"#include"FrameworkStructh"#include"GlobalConstantsh"#include"EventsGproth"#include"mmiappfnptrsh"#include"HistoryGproth"#include"HelloWorldProth"#include"HelloWorldTypesh"#include"HelloWorldDefsh"#include"MainMenuDefh"#include"wguicategoriesh"#include"Unicodexdclh"*模块入口*voidmmiHelloWorldentry(void){#ifdefMMIHELLOWORLDENABLED*强制退出当前屏幕之后进入到我们的模块了**上电缺省是idle屏幕现进入MAINMENUSCREENID屏**注意看第二个参数这个是当我们模块被强制退出时执行的一些操作*EntryNewScreen(MAINMENUSCREENID,mmiHelloWorldexit,,)*关掉屏幕顶部的状态条我们要用整个屏幕*entryfullscreen()*擦除当前背景*clearscreen()*移动文本输出光标*guimovetextcursor(,)*设置字体颜色*guisettextcolor(UICOLORRED)*输出文本到显示缓冲,注意是Unicode编码*guiprinttext(L"Hello,World")*刷新屏幕显示MMI用的是双缓冲绘图方式而且需要显式刷新*guiBLTdoublebuffer(,,UIdevicewidth,UIdeviceheight)*注册一个按键处理右软键弹起时返回到之前被我们强制退出的模块*SetKeyHandler(GoBackHistory,KEYRSK,KEYEVENTUP)#endif}*模块出口*当我们的模块被其他模块强制退出时会执行这个函数*这个函数的常见写法包括:*、模块已申请资源的释放(如果需要的话)这一步可选*、手动把自己压栈到窗口(实际是整个屏)堆栈里面*便于强制我们退出的模块执行完后重新把我们叫出来*不像Window的窗口管理是自动压栈的PlutoMMI需要手动压栈*、其他一些清理动作*voidmmiHelloWorldexit(void){#ifdefMMIHELLOWORLDENABLEDhistorycurrHistorySnHistory=currHistoryscrnID=MAINMENUSCREENIDcurrHistoryentryFuncPtr=mmiHelloWorldentrypfnUnicodeStrcpy((S*)currHistoryinputBuffer,(S*)nHistory)AddHistory(currHistory)#endif}*************************************************************************编码的部分基本上就是这些了然后我们开始make这次要用“makeupdate”,基于上述对相关系统文件的改动makeupdate会自动将刚才的模块加入到整个项目中去同时也会更新仿真器VC工程文件如下图所示HelloWorld模块的相关文件已经被自动加入到MMI库里面了:后续的make如果是不涉及到系统相关文件的修改用“makeremake”就可以了以节省编译时间因为make一次太耗时间了。注意:对于仿真程序的编译“makeupdate”似乎缺少一些处理导致可能还需要手工在文件“plutommimmiGlobalSimulatorPathDef”中追加一行以便模块的头文件能被顺利找到如下所示:I"HelloWorldInc"好现在编译仿真程序开始看下效果编译(makeupdate会清除掉仿真程序之前编译的中间文件这样仿真程序会整个重新编译)完后运行仿真器程序如下图所示点选File>NetworkSimulator启动仿真启动后手机模拟器进入Idle画面点选手机模拟画面上的“菜单”就进入到我们的HelloWorld了而不是之前的主菜单然后点右按钮画面回到Idle画面。至此HelloWorld基本完成这是一个相对完整的模块框架在此基础之上我们可以逐步开始进入真正有意义的项目开发了。、​ 使用资源我们知道很多时候我们需要应付来自不同国家和地区客户的需求他们使用的语言编码不一样但实际上对产品功能的要求是基本相同的此外即便是同一种语言客户的个性化需求(例如外观换皮肤)也要求我们有相应手段来处理和产品业务逻辑关系不是很密切的产品表现手段大多数时候这些东西涉及到:字符串、图标、图片、菜单、字库、主题、声音等也就是我们常说的资源做过多语言版本软件的朋友应该对此深有体会。一般来讲VC使用资源动态库来解决这个问题那么在MTK平台上一般是怎么解决的呢我们一起来看下。、资源ID在进入实际编码前让我们先来看看MTK平台是如何管理资源的。MTK平台大致将资源分为以下几类:字符串、菜单、图片、字库、主题、声音、屏幕所有资源统一编码管理对于同一类型的资源每个资源有全系统唯一的编号也就是资源ID字符串资源和其他资源稍有不同同一个语义的不同语言版本字符串共用同一个字符串资源ID系统自动根据当前语言设定提取对应语言版本的字串。此外屏幕是一种平常我们Windows开发中不多见的一种资源这里我们可以简单的理解成Windows的窗口句柄好了。为了不让系统各个模块的资源ID彼此重叠从而导致混乱系统提供专门的宏来处理并将相关的定义统一放到同一个文件里面便于管理。具体来讲这个文件是“plutommimmiIncMMIDataTypeh”在开始添加实际资源之前我们需要大致估计一个安全值这个值代表我们可能用到的资源最大数注意这个最大数并不是我们用到的所有资源的总数而是某一类资源因为不同类型的资源其资源ID是允许重复的比如说我们总共要用到个字符串张图片个菜单项那么这个最大数是一般会再留一些可扩展的空间就HelloWorld模块而言最大数取足够了(当然了这个数后面还可以再改的)。最大值取好后我们就可以着手向系统申报我们的资源ID空间了修改文件“plutommimmiIncMMIDataTypeh”如下所示红色字体部分这样系统就预留了个全系统唯一的资源ID给我们了注意是每一种资源都有个可用的资源ID。typedefenum{……RESOURCEBASERANGE(MAINMENU,),RESOURCEBASERANGE(HELLOWORLD,),……}RESOURCEBASEENUM……**************************************************************************MainMenu**************************************************************************#defineMAINMENUBASE((U)RESOURCEBASEMAINMENU)#defineMAINMENUBASEMAX((U)RESOURCEBASEMAINMENUEND)RESOURCEBASETABLEITEM(MAINMENU)**************************************************************************HelloWorld**************************************************************************#defineHELLOWORLDBASE((U)RESOURCEBASEHELLOWORLD)#defineHELLOWORLDBASEMAX((U)RESOURCEBASEHELLOWORLDEND)RESOURCEBASETABLEITEM(HELLOWORLD)……好现在我们有自己的资源ID空间了之前我们有暂借MAINMENU的屏幕ID资源现在用回我们自己的增加相关定义到HelloWorldDefsh现在HelloWorldDefsh看起是这样:************************************************************************#ifndefHELLOWORLDDEFSH#defineHELLOWORLDDEFSHtypedefenum{SCRHELLOWORLD=HELLOWORLDBASE,}SCREENIDLISTHELLOWORLD#endif*HELLOWORLDDEFSH*************************************************************************接着修改模块入口函数mmiHelloWorldentry见红色字体部分如下所示:EntryNewScreen(SCRHELLOWORLD,mmiHelloWorldexit,,)屏幕ID资源是一种最简单的资源就是一个数值定义完就可以使用了其他资源相对复杂需要有一个生成的过程下面我们接着看资源的生成。、资源的生成限于篇幅这里我们主要讲常用的种资源:字符串、图片和菜单。首先我们来看这些资源是如何被生成的后面我们再讲如何使用这些资源。MTK平台的资源是通过一个叫mtkresgeneratorexe的程序生成的这个程序位于目录plutommiCustomerResGenerator下是个临时生成的可执行文件每次项目相关资源被修改该程序都要重新编译实际上这个程序是由一系列需要自有资源的模块根据一定的资源生成规则将各自的资源生成代码组合而成的。资源生成相关的代码统一放在同一个目录下面因此我们要给自己的模块添加资源只需要在这个目录下建立自己的资源生成c文件并按照指定的生成规则编写代码即可。具体来讲这个目录就是plutommiCustomerCustResourcePLUTOMMIResMMI。注意这个目录下不要放其他不相关的c或cpp源文件因为编译脚本会自动将这个目录下的所有源文件作为mtkresgeneratorexe的一部分来处理。好下面开始资源生成相关的编码。我们继续接着在HelloWorld模块上讲好了首先在上面说的目录下面创建一个文件:ResHelloWorldc这个文件的内容大致框架如下:*************************************************************************#include"StdCh"#ifdefDEVELOPERBUILDFIRSTPASS注意后面资源生成相关代码要用这个编译开关框住#include"PopulateResh"#include"MMIfeaturesh"#include"GlobalMenuItemsh"#include"HelloWorldDefsh"voidPopulateHelloWorldRes(void){#ifdefMMIHELLOWORLDENABLED……这里是资源生成部分的代码基本上都是些宏后面讲到具体资源的时候我们再讲#endif}#endif*DEVELOPERBUILDFIRSTPASS**************************************************************************接着我们还需要修改系统文件plutommiCustomerResGeneratorMakefile以便编译系统能顺利找到我们定义资源ID的头文件"HelloWorldDefsh"在PLUTOINC=这一项里面追加一行:I"MMIHelloWorldInc"注意追加新行的时候别忘了在上一行尾部添上续行符号“”。再接着我们要把我们的资源生成函数“PopulateHelloWorldRes”放到合适的地方调用这样才能生成我们要的资源这里我们需要修改另外一个系统c源文件:“plutommimmiResourcePopulateResc”,需要修改的见红色字体部分如下所示:……externvoidPopulateMmiapiRes(void)externvoidPopulateHelloWorldRes(void)……voidPopulateResData(void){……#ifdefDOWNLOADMCU*Added,*PRINTINFORMATION(("PopulatingMCUDownloadResourcen"))PopulateMCUDownload()#endif#ifdefMMIHELLOWORLDENABLEDPRINTINFORMATION(("PopulatingHelloWorldResourcen"))PopulateHelloWorldRes()#endif……}对于字符串资源的生成我们还需要修改另外一个系统c源文件这个文件是“plutommiCustomerResGeneratorreadexcelc”,这个文件是专门用来处理字符串资源的mtkresgeneratorexe会调用这个部分来单独处理字符串相关的部分。需要修改的见红色字体部分如下所示:……#include"SettingDefsh"#ifdefMMIHELLOWORLDENABLED#include"HelloWorldDefsh"#endif……只加上面句就好主要是让字串资源生成程序能根据我们的资源ID定义头文件“HelloWorldDefsh”辨识到我们的字符串资源。)​ 字符串资源的生成首先在我们的资源ID定义头文件"HelloWorldDefsh"里面加入字符串ID的定义如下所示红色字体部分:typedefenum{STRHELLOWORLDHELLO=HELLOWORLDBASE,}STRINGIDLISTHELLOWORLD好现在我们有一个全系统唯一的字符串资源ID了让我们给这个字符串资源ID设定具体的文本内容这需要修改到一个系统文本文件:“plutommiCustomerCustResourcePLUTOMMIreflisttxt”注意这个文本文件是Unicode编码的可以用UltraEdit打开不过最好用Excel打开这样便于编辑修改这个文件的格式如下:第一列:字符串资源ID这里我们只加了一个也就是我们上面定义的“STRHELLOWORLDHELLO”第二列:字符串资源所属模块这个是便于设计者辨识资源归属的资源生成程序并没用到最好和当前的模块号同名便于识别和管理第三列:该字串的最大长度取所有语言中文本长度最长的一个第四列:字串描述这一列可以随意第五列及以后各列分别对应各个不用语言的字串按照上述格式我们增加追加一条如下红色字体所示:STRHELLOWORLDHELLOHelloWorldHelloWorld"Hello,World"你好世界你好世界接着我们要在我们的资源生成函数PopulateHelloWorldRes中增加一行这样才能将上面的资源真正变成最终系统资源的一部分一条宏指令就搞定了如下红色字体所示:ADDAPPLICATIONSTRING(STRHELLOWORLDHELLO,“Hello,World”,“HelloWorld”)这个宏的第一个参数是字符串ID第二个参数是当前系统语种对应的字串内容为空的时候的替代值第三个参数是串的描述可以随意。好至此我们就成功的向系统中添加了一个字符串资源而且是包含多语种支持的。)​ 图片资源的生成同样第一步我们向资源ID定义头文件"HelloWorldDefsh"里面加入图片ID的定义如下所示红色字体部分:typedefenum{IMGHELLOWORLD=HELLOWORLDBASE,}IMAGEIDLISTHELLOWORLD接着我们把设计好的图片放到系统约定的目录一般来讲系统是按照屏幕分辨率来分类存放图片资源的对于P*的屏幕分辨率来讲这个目录是“plutommiCustomerImagesPLUTOXMainLCD”在这个目录下我们建一个名字为“HelloWorld”的子目录之后把我们模块要用到的图片通通都放到这个子目录下以便于管理。我们增加一个小图片HelloWorldbmp到这个子目录下后面我们将这个小图片作为菜单项的图标如下所示:再接着同样我们需要在资源生成函数PopulateHelloWorldRes中增加一行这也是一个宏如下所示红色字体部分:ADDAPPLICATIONIMAGE(IMGHELLOWORLD,CUSTIMGPATH"MainLCDHelloWorldHelloWorldbmp","HelloWorld")这个宏第一个参数是图片资源ID第二个参数是图片存储路径(CUSTIMGPATH对应“plutommiCustomerImagesPLUTOX”)第三个参数是资源描述这样一个图片资源就加好了下面接着看菜单资源的添加这一部分稍稍繁琐一点(主要是相对应的宏参数比较多)。注意:HelloWorld子目录以及相关文件实际上是要加入到压缩文件“plutommiCustomerImagesPLUTOXimagezip”中(放到MainLCD目录下)“plutommiCustomerImagesPLUTOXMainLCD”这个目录是由imagezip生成的临时目录。)​ 菜单资源的生成我们都知道菜单是一种树形的结构一个菜单项一般有以下几个要素:、​ 父菜单项、​ 子菜单项、​ 菜单项的文本提示、​ 菜单项文本提示前面的小图标、​ 菜单项对应的动作第个涉及到菜单资源的使用我们放到后面再讲下面就前面几项讲讲如何向添加一个新的菜单项。首先确定我们新的菜单项的位置我们放到工具菜单下好了就是主菜单进去后那个小推车对应的菜单。第一步:我们要定义一个全系统唯一的菜单ID这需要在系统文件“plutommimmiIncGlobalMenuItemsh”中名字为GLOBALMENUITEMSID的枚举型定义里面增加一行如下红色字体所示:enumGLOBALMENUITEMSID{IDLESCREENMENUID=,……MENUIDHELLOWORLD,**************************************************************Addnewmenuitemsdefinitionsbeforehere**************************************************************AddAllMenusdefinesaboveMAXMENUITEMSVALUEOnly*……}从上面我们可以看出菜单ID并没有用到我们之前提到的HELLOWORLDBASE到HELLOWORLDBASEMAX之间的数值而是重新启用另外一套数值空间没关系只要能保证同一种资源每一个都有全系统唯一编号就好了。第二步:找到工具菜单的定义部分将MENUIDHELLOWORLD作为其中的一部分这实际上是要修改主菜单的相关资源主菜单的资源定义文件是“plutommiCustomerCustResourcePLUTOMMIResMMIResMainMenuc”打开这个文件找到OrganizerMenu的定义部分增加我们的相关定义如下所示红色部分:typedefenum{……#ifdefined(MMIEBOOKREADER)ENUMEBOOK,#endif#ifdefined(MMIHELLOWORLDENABLED)ENUMIDHELLOWORLD,#endifORGENUMTOTAL}OrganizerMenu对于OrganizerMenu这个定义的修改主要意义在于ORGENUMTOTAL这个值实际上是对应菜单的子菜单数系统会引用到这个值我们往枚举定义OrganizerMenu里面增加一项这个值自动加也就是对应菜单的子菜单数比以前大。第三步:把我们的菜单ID作为工具箱菜单的一个子菜单在对应位置插入一行如下红色字体所示:#ifdefined(MMIVERSION)*Max*voidPopulateMainMenuRes(void){……*oganizer*ADDAPPLICATIONMENUITEM((MAINMENUORGANIZERMENUID,IDLESCREENMENUID,ORGENUMTOTAL,funandgamesmenu……#ifdefined(MMIEBOOKREADER)MAINMENUEBOOKMENUID,#endif#ifdefined(MMIHELLOWORLDENABLED)MENUIDHELLOWORLD,#endif……}通过上面三步我们已经将新的菜单项成功插入到工具箱菜单也就是说我们解决了菜单几个元素中的“父菜单项”的问题接着我们来看看其他几项元素。这里我们介绍下ADDAPPLICATIONMENUITEM这个宏刚才往工具箱菜单插入我们的菜单项时已经接触到这个宏了生成菜单资源用的就是这个宏接着我们就会用到。这个宏的参数个数是可变的其参数具体含义如下:参数:菜单项本身的ID就我们的例子而言是MENUIDHELLOWORLD参数:菜单项的父菜单ID这里是MAINMENUORGANIZERMENUID参数:本菜单子菜单个数假定为N好了这个参数之后是变参部分随后的N个参数为各个子菜单的ID参数N:菜单是否显示一般为SHOW参数N:菜单其他属性可以是这些值的组合:NONMOVEABLE,MOVEABLEWITHOARENT,MOVEABLECROSSPARENT,INSERTABLE,SHORTCUTABLE一般我们就用SHORTCUTABLE就好了。参数N:下级菜单的显示风格以下风格任选其一就好:DISPLIST列表显示常见风格DISPMATRIX矩阵显示如九格宫、十二格宫主菜单一般用这种风格DISPCIRCULARD循环D显示只有主菜单用到DISPPAGE翻页格式每个菜单项一页一般也是主菜单才会用到DISPFIXEDGRID很少用到可忽略参数N:菜单项显示文本对应的字串资源ID参数N:菜单项对应的小图标的资源ID好根据上述参数说明我们在函数PopulateHelloWorldRes中加入菜单生成宏如下红色字体所示:ADDAPPLICATIONMENUITEM((MENUIDHELLOWORLD,*要加左括号*MAINMENUORGANIZERMENUID,,*我们没有子菜单*SHOW,SHORTCUTABLE,DISPLIST,STRHELLOWORLDHELLO,IMGHELLOWORLD))*要加右括号*至此我们完成菜单项资源的生成部分注:ADDAPPLICATIONMENUITEM这个宏的参数实际上是一个上面那些参数要用括号“()”括起来。、资源的使用上一小节我们分别完成了字符串资源、图片资源以及菜单资源的生成部分这一小节我们来看如何的使用这些资源:)​ 字符串资源的使用字符串资源的使用比较简单用函数GetString就可以了如下红色所示我们修改下之前输出字符的操作:guiprinttext((UIstringtype)GetString(STRHELLOWORLDHELLO))注意GetString前面有个类型转换这个数据类型定义在“guidatatypesh”里面因此需要在HelloWorldc中包含此头文件。)​ 图片资源的使用实际上我们在用宏ADDAPPLICATIONMENUITEM生成菜单的使用已经用过了更多的使用实例这里不再赘述读者可自行寻找相关代码查看使用方法基本上都是将图片资源ID作为一个参数传入某个函数或者宏。)​ 菜单资源的使用实际上就是给菜单项设定一个响应动作使之转到我们模块的入口设置菜单项响应动作的函数是SetHiliteHandler设置的动作只需要在系统上电后初始化的部分执行一次就可以了这里我们为模块新增一个函数这个函数专门处理我们模块上电初始化的部分如下红色字体所示我们在HelloWorldc中增加一下部分:voidmmiHelloWorldhilite(void){#ifdefMMIHELLOWORLDENABLEDSetLeftSoftkeyFunction(mmiHelloWorldentry,KEYEVENTUP)#endif}voidmmiHelloWorldinit(void){#ifdefMMIHELLOWORLDENABLEDSetHiliteHandler(MENUIDHELLOWORLD,mmiHelloWorldhilite)#endif}这实际上要用两个函数由这两个函数共同完成菜单点击通知的接收和转入我们模块主入口的动作。mmiHelloWorldinit这个函数是一个外部接口我们把申明放到HelloWorldGproth中mmiHelloWorldhilite这个函数是内部接口我们把申明放到HelloWorldProth中。然后我们把mmiHelloWorldinit放入到函数InitAllApplications中调用已完成我们模块的初始化设定修改文件“plutommimmiFrameworkTasksTasksSrcMMITaskc”如下红色字体部分所示:……#ifdefMMIHELLOWORLDENABLED#include“HelloWorldGproth”#endif……voidInitAllApplications(void){……#ifdefMMIHELLOWORLD

没有相关教程
UC浏览器 最先进实用的手机端浏览器,最大限度节省页面浏览流量,点击下载
老虎地图 绿色纯免费GPS定位省流量的最佳手机地图,点击下载
网秦手机安全系列 手机杀毒防盗,防火墙,构建手机安全,点击进入
塞班精品游戏 最流行最给力的塞班S60免签名名精品游戏合集,点击进入
阿里通 手机上轻松拨打网络电话和收发短信,高音质超省话费,资费标准
爱科手机电话 国内最好的手机网络电话领先品牌,价格低廉,点击查看
愤怒的小鸟2 全民挑战超流行休闲游戏力推新作-愤怒的小鸟2,点击查看
魔力旺旺 淘宝卖家首选的交易工具

资源下载排行
文章阅读排行