申明:本文系原创,转载时请注明出处,本人保留追究责任的权利。

原文地址:http://hi.baidu.com/surfmygod/blog/item/6f3a66900cbb195ad0135e7d.html

最近公司有个项目,要用MTKMTK10A1032版本出软件。今天刚刚拿到了MTK10A1032版本的软件,大致了解了一下,感觉比之前的版本改动要大很多,可以说是脱胎换骨了。改动后的版本C源文件明显比原来减小,而附加了很多xml、res文件,各模块资源定义和文件结构也做了较大改动。对于程序员来说,由于资源和操作分离了,加些资源什么的比之前要容易一些,程序也简洁了很多。当然老MTK程序员需要用一段时间来适应新版本,一段时间内可能不是很顺手。本文从创建一个APP为例逐步探讨该平台的开发流程。由于水平有限,不保证所有内容均准确无误,只是抛砖引玉给想尝试新版本的同仁们(那些想第一个吃螃蟹的人,嘿嘿,偶也是)。若有疏忽遗漏错误之处,欢迎指正,欢迎交流。

PS:10A开发环境为VC9+RVDS3.1,bin档编译只能单机(目前暂不知道怎么用分布式,开启分布式会报错,MTK的人说好像要使用浮动IP才可以,俺不懂,暂且不管,我们用四核Q8200重新new一遍大概在半个小时左右,还可以接受),模拟器可以使用分布式。编译bin档前请卸载分布式编译(目前确认关闭分布式服务也可以,这样就可以不必卸载分布式了。关闭方法:右键点分布式的小图标,选择“Agent Settings”,左侧选择“Agent”-“General”,右侧“Agent Service”一栏点“Stop”按钮关闭服务。需要打开的时候按同样方式点选“Start”)。有谁知道10A下分布式怎么配的,留言告诉我,谢谢!至于环境的配置我就不罗嗦了,VC9很好装,RVDS也不是很困难,网上找找资料就可以搞定。

1、文件结构

目录一:plutommi\MMI\FirstApp
目录二:plutommi\MMI\FirstApp\FirstAppInc(该结构未改变)
文件列表:
FirstAppDefs.h:用于存放本程序所需要的类型,结构,常量的定义 
FirstAppProt.h:用于存放本程序中的所有函数声明,但此文件只被本文件的源程序所加载 
FirstAppGprot.h:也是用于存放函数声明,但是此文件是用于别的程序加载,即此文件中的函数声明的都是对外的接口 
FirstAppResDef.h:用于存放本资源ID的定义接口

目录三:plutommi\MMI\FirstApp\FirstAppSrc(该结构未改变)
FirstAppSrc.c程序的主源文件

目录四:plutommi\MMI\FirstApp\FirstAppRes(新的目录)

FirstApp.res:资源文件定义,包含字串、图片、菜单、屏幕等的定义,该文件实际为一个标准xml文件

ref_list_FirstApp.txt:该模块多国语言字串定义(目前发现该文件并未生效,不知道是否是设置问题)

2、将文件加入项目
修改make\plutommi\mmi_app\下的三个文件:
1)mmi_app.lis:此文件用来申明MMI所要编译的所有源文件,添加如下一行:
plutommi\MMI\FirstApp\FirstAppSrc\FirstAppSrc.c
2)mmi_app.inc:此文件用来指明MMI所有头文件所在目录,同样添加:
plutommi\MMI\FirstApp\FirstAppInc
3)mmi_app.pth:此文件用来指明MMI所有源文件所在目录,添加:
plutommi\MMI\FirstApp\FirstAppSrc

4)在plutommi\Customer\ResGenerator\MakeFile文件中添加如下一行:
-I "../../MMI/FirstApp/FirstAppInc"\

3、应用程序ID定义

1)在基础ID 统一定义文件plutommi\MMI\Inc\mmi_res_range_def.h(原来为MMIDataType.h)中找到如下定义块:

RESOURCE_BASE_ENUM_BEGIN()
    /**************************************************************************************
     * Declare resource ID range below

**************************************************************************************/

……

/**************************************************************************************
     * Declare resource ID range above 
     **************************************************************************************/
RESOURCE_BASE_ENUM_END()

在其中添加:

#ifdef __MMI_FIRSTAPP__
RESOURCE_BASE_RANGE(FIRSTAPP, 50),
#endif
2)找到如下定义块:
/* Beginning of resource table */
RESOURCE_BASE_TABLE_BEGIN()
……
/* End of resource table */
RESOURCE_BASE_TABLE_END()
在块中间末尾位置添加:
/****************************************************************************
* FirstApp
*****************************************************************************/
#ifdef __MMI_FIRSTAPP__
#define FIRSTAPP_BASE ((U16) GET_RESOURCE_BASE(APP_FIRSTAPP))
#define FIRSTAPP_BASE_MAX ((U16) GET_RESOURCE_MAX(APP_FIRSTAPP))
RESOURCE_BASE_TABLE_ITEM_PATH(APP_FIRSTAPP, ".\\MMI\\FirstApp\\FirstAppRes\\")//这里较之前有所变化
#endif

4、字串、图片、屏幕资源的添加

先来说字串、图片、屏幕资源ID的添加。10A版本中对资源定义的改动比较大,稍微对比一下新老版本,你会发现很多原来很大的文件变小了,而多出来了很多.res后缀的文件,这就是新版本的资源定义文件。10A版本仍部分保持了老版本的定义方式,不过笔者建议采用新版本的方式来定义资源,而且与之前相比新版本的资源定义要方便不少。读者可以随便找一个res文件,会看到如下定义格式:

/* Needed header files of the compile option in XML files, if you need others need to add here */
#include "mmi_features.h"
#include "custresdef.h"

/* Need this line to tell parser that XML start, must after all #include. */
<?xml version="1.0" encoding="UTF-8"?>

/* APP tag, include your app name defined in MMIDataType.h */
<APP id="APP_FIRSTAPP">/* 这里定义的id必须和之前定义的APP的ID一致 */

/* When you use any ID of other module, you need to add
       that header file here, so that Resgen can find the ID */
    <!--Include Area-->

<!-----------------------------------------------------String Resource Area----------------------------------------------------->
    /* String ID of you Application, we will get string from ref_list.txt for all languages */
       <STRING id="STR_ID_APP_FIRSTAPP_HELLO"/>/* 在这里添加自己的字串ID */

/* 这里说下,字串的内容定义和之前的版本一样放在YourProjectPath\plutommi\Customer\CustResource\PLUTO_MMI\ref_list.txt下,为了更好的兼容,最好将你自己定义的字串重新规整到YourProjectPath\plutommi\MMI\FirstApp\FirstAppRes\ref_list_FirstApp.txt下,具体定义方式和ref_list.txt类似,参考本博客文章《MTK编程起步——建立新APP和资源定义》 */

<!-----------------------------------------------------Image Resource Area------------------------------------------------------>
    /* Image Id and path of you Application , you can use compile option in Path, but need out of "" */
        <IMAGE id="IMG_ID_APP_FIRSTAPP_HELLO">CUST_IMG_PATH"\\\\MainLCD\\\\FirstApp\\\\HELLO.BMP"</IMAGE>

/* 这里定义自己的图片ID和路径,注意图片现在的CUST_IMG_PATH路径是在YourProjectPath\plutommi\Customer\Images\FTE320x480,请将图片文件夹放在这里,然后打包整个MainLCD文件夹为image.zip(改了mtk_resgenerator.cpp的可以不用打包) */

<!------------------------------------------------------Menu Resource Area------------------------------------------------------>
    /* Only MENUITEM need compile option, MENUITEM_ID does not need */
    /* 这里定义你的菜单ID,具体定义方法稍后给出 */

<!------------------------------------------------------Other Resource---------------------------------------------------------->
    <SCREEN id="SCR_ID_APP_FIRSTAPP_HELLO"/>/* 这里定义你的屏幕ID */

</APP>

这个res文件类似与xml文件,不过你可以在其中使用一些C的预处理命令和注释。使用这种方式你不需要自己去定义res_app_firstapp.c,系统会在这个文件中搜索ID并自动生成名为mmi_rp_app_firstapp_def.h和mmi_rp_app_firstapp.c的文件,并在后者中定义对应的populate函数。至于res文件中各标签和其属性定义,请参看MTK官方文档10A_MMI_Resource_Training.pdf。

5、菜单添加

菜单由于有上下级关系,定义要相对复杂些,这里先介绍几个标签:MENU、MENUITEM和MENUITEM_ID。MENU是用来定义菜单树的标签,MENUITEM是用来定义单个菜单项的标签,MENUITEM_ID是用来在MENU树中安置菜单项的标签。下面来讨论菜单的定义。

新版本中菜单的定义方式有很多种,现介绍最常用的三种方式,其它方式请读者参看上面给出的MTK官方文档。

方法一:MENU中包含MENUITEM_ID方式定义

这种方式采用如下格式:

<MENUITEM id="SUBMENU1" str="STR_SUBMENU1"/>
<MENUITEM id="SUBMENU2" str="STR_SUBMENU2"/>

<MENU id="MENU1" type="OPTION" str="STR_MENU1" highlight="HighlightMenu1" hint="HintMenu1">
        <MENUITEM_ID>SUBMENU1</MENUITEM_ID>
        <MENUITEM_ID>SUBMENU2</MENUITEM_ID>
</MENU>

采用这种方式要在MENU体外申明对应MENUITEM的定义,可以放在引用MENU之前也可在其后,但MENU中MENUITEM_ID包含的内容必须是已定义的MENUITEM的ID,如果不存在系统将会将该菜单忽略。另外提一点,为了和先前的版本兼容,MTK提供了@OID:前缀,用来引用原先在c文件中定义的菜单ID,使用方法是将其放在<MENUITEM_ID></MENUITEM_ID>标签对之间即可,例如:<MENUITEM_ID>@OID:SUBMENU3</MENUITEM_ID>。不过引用前请使用<INCLUDE file="XXXResDef.h"/>引用你ID所在文件,将其至于<!--Include Area-->下。

方法二:直接将MENUITEM定义在MENU中,格式如下:

<MENU id="MENU1" type="OPTION" str="STR_MENU1" highlight="HighlightMenu1" hint="HintMenu1">
        <MENUITEM id="SUBMENU1" str="STR_SUBMENU1">SUBMENU1</MENUITEM_ID>
        <MENUITEM id="SUBMENU2" str="STR_SUBMENU2">SUBMENU2</MENUITEM_ID>
</MENU>

这种方式不需要在MENU体外定义对应MENUITEM,只需要放在MENU标签内同时定义MENUITEM信息即可。

方法三:嵌套MENU,格式如下:

<MENU id="MENU1" type="OPTION" str="STR_MENU1" highlight="HighlightMenu1" hint="HintMenu1">
        <MENU id="SUBMENU1" type="OPTION" str="STR_SUBMENU1" highlight="HighlightSubMenu1" hint="HintSubMenu1"></MENU>
        <MENU id="SUBMENU2" type="OPTION" str="STR_SUBMENU2" highlight="HighlightSubMenu2" hint="HintSubMenu2"></MENU>
</MENU>

采用这种方式使得菜单的定义一次完成,也易于理解,但是当属性较多层次较深的时候可能显得较乱。这种方式是直观的MENU树表现方式,显示了子菜单与父级菜单的对应关系。有些读者可能对MENU和MENUITEM有些迷茫,笔者认为,在大部分时候MENU和MENUITEM可以通用,你可以把他们看成一种东西(MENU)。你可以将方法三第二行替换成方法一或方法二的形式。不过如果有SUBMENU1有子菜单的时候,方法三可以直接嵌套在对应MENU体之中,而方法一或方法二则需在MENU方法体外做如下定义:

<MENU id="SUBMENU1" type="OPTION" str="STR_SUBMENU1" highlight="HighlightSubMenu1" hint="HintSubMenu1">

……

</MENU>

以上三种方法可以根据需要混合使用。最后为了完整实现菜单功能,别忘了添加对应菜单的highlight和hint函数。说到highlight和hint函数,这里有必要提一下,不是所有菜单都可以直接在res文件中添加highlight和hint选项来实现的,如果你发现你的highlight和hint不起作用,请使用模拟器跟踪一下同类高亮函数,会发现其高亮处理在类似mmi_ret mmi_phnset_gpio_menu_handler(cui_menu_event_struct *menu_evt, MMI_ID parent_gid)和static void mmi_phnset_gpio_select_menu(mmi_menu_id id, MMI_ID parent_id)的函数中使switch (menu_evt->highlighted_menu_id){case SUBMENU1:}或switch (id){case SUBMENU1:}进行多分支进行的。其中前一个函数的作用是点选左键或点触该菜单项所执行的事件即原来高亮函数中的SetLeftSoftkeyFunction,而后一个函数则是高亮该菜单项所执行的函数即原来的高亮函数。而hint函数存在于类似static mmi_ret mmi_phnset_disp_setup_sub_menu_entry_handler(cui_menu_event_struct *param)中,switch (param->parent_menu_id){case MENU1:}对父级菜单ID进行判断并执行相应初始化函数,hint函数位于对应父级菜单的初始化函数中。注意这里一定是父级菜单而不是本菜单,因为hint函数的加载都是在进入包含该菜单的父级菜单中进行的。

MTK 10A APP,菜单,资源添加相关推荐

  1. UE 在Editor的资源右键菜单上添加两个按钮

    今天接到个任务,需要在Editor的资源右键菜单上添加两个按钮,用来上传资源,一个是默认参数上传,一个是用户输入描述去上传,研究了半天,最后在UE的源码里找到的作业抄了下来,做个记录,由于周五了实在是 ...

  2. MTK 10A 消息机制

    1 MTK 10A 帮助文档 一. 10A MMI 主要新特征 1. 新Event 机制 API: #define MMI_FRM_SEND_EVENT(_evt, _proc, _user_data ...

  3. MTK 10A 之前的备忘

    MTK 10A 之前的备忘 mmi_idle_exe_callback  进入待机前的准备,检查是否有新短信.未接来电(mmi_nmgr_entry_default_idle) 等 NetWorkAt ...

  4. Win32汇编--加载菜单资源

    基本上的窗口都会有一个菜单,现在就来看看Win32汇编中是如何加载菜单的: 1>在工程中添加新的菜单资源 2>双击新添加的菜单资源进行编辑 3>菜单栏:Make->Compil ...

  5. Menu菜单资源Android

    Menu菜单资源Android 1.新建Menu\app\src\main\res\menu 目录 1.1新建activity_main.xml <?xml version="1.0& ...

  6. VS2010-MFC(菜单:VS2010菜单资源详解)

    转自:http://www.jizhuomi.com/software/210.html 上一节讲了标签控件Tab Control以后,常用控件的内容就全部讲完了,当然并没有包括所有控件,主要是一些很 ...

  7. css app菜单,简单的Material Design风格手机App菜单特效

    插件描述:这是一款非常简单的Material Design风格手机App菜单特效.该特效使用CSS3和少量的jQuery代码来完成.在用户点击汉堡包菜单按钮之后,按钮会变形放大到整个手机APP屏幕,同 ...

  8. 使用Powershell批量为Azure资源添加Tags

    在使用Azure的过程中,我们可以将Tags应用于Azure资源,从而可以将元数据逻辑的组织到某些分类中.每个Tags由名称和值组成.例如,我们可以将名称"Environment" ...

  9. 如何在IE右键菜单中添加菜单项(转)

    (来自:http://www.jaron.cn/chs_scripts/7/2003-11/20031125111738-101413.html) 如果使用过Netants的朋友可能都知道,NetAn ...

最新文章

  1. Silverlight开发中遇到的几个小问题
  2. 开源杀毒引擎 ClamAV
  3. linux/android 脚本相关
  4. 浅谈RDMA流控设计
  5. ubuntu20.04的xfce4下面安装百度输入法linux版本
  6. oracle查询并更新数据库,oracle数据库查询和更新
  7. win102004优化_win10 2004系统电脑出现玩命运2掉帧的问题
  8. JEECG支付服务窗专题 - 支付窗激活开发者模式
  9. 内存管理器剖析:ptmalloc,windows,macOS
  10. python格式输出占四列左对齐_python – 打印字符串左对齐,固定宽度和后缀
  11. vue获取麦克风_vue使用recorder.js实现录音功能
  12. 添加WSS3.0中文模板
  13. 基于STM32的手势识别检测
  14. hdu2825(AC 自动机)
  15. 分析器错误信息 未能加载类型 命名空间 类 ---小结
  16. 机器学习 | k近邻
  17. Flutter开始支持Windows了
  18. 太赞了!Python 开发神器Jupyter竟然还有可视化debug功能!
  19. android 内核老版本下载安装,百度极速版老版本下载安装
  20. 浏览器不能打开网站问题

热门文章

  1. Kubernetes学习之路(26)之kubeasz+ansible部署集群
  2. 数据结构与算法小结——排序(八)
  3. static成员函数
  4. c#异步文件传输功能
  5. 嵌入式成长轨迹52 【Zigbee项目】【CC2430基础实验】【在PC用串口收数并发数】...
  6. Kubernetes常见操作
  7. 100 个网络基础知识
  8. 完整、详细的MySQL规范
  9. 大规模数据生成 (500万条数据)
  10. jsp mysql事务锁,JSP操作数据库的事务回滚