MTK之添加资源与菜单心得

来源:互联网 发布:淘宝网电饭煲厂家直销 编辑:程序博客网 时间:2024/05/22 15:52

以下是本人这半个月来的学习心得,由于生病和编译环境有问题,学习进度很缓慢。感觉三周多了也没学到什么。有点郁闷。

 

大家跟着我这个流程做,就能从整体上清楚的理清添加资源与菜单的流程,知道为什么要这样做。下面是在6235平台下进行的,其他平台可能代码名称有不同,具体添加方式参考同文件中其他代码的写法就好了,其实MTK的代码需要改动的很少,就是在里面添添,不知道怎么添的时候就参考内部代码。

 

第一步:添加程序文件:先假设自己写的程序的名字为MyApp

      需要添加有:MyAppProt.h (用来存放本程序的所有函数申明,此头文件只被本程序的源文件所加载)

                       MyAppDefs.h  (用来存放本程序的一些普通的资源ID定义)

                       MyAppTypes.h (用来存放本程序所需的类型,结构,常量定义)

                      MyAppGprot.h (也是用来存放函数申明的,但是此头文件是被别的程序所加载的,也就是说此文件所申明的都是对外接口)

                      当然还有源文件MyAppSrc.c                      

 

                   注:以上这些头文件一般放在plutommi/MMI/MyApp/MyAppInc下面,这样方便代码管理

 

 

第二步:将文件加入项目

       

                 在make/plutommi/下面的三个文件需要修改

                    1:plutommilis  所需编译的源文件

                    2:plutommiinc  指明头文件所在目录

                    3:plutommipth  指明源文件所在目录

 

 

第三步:程序开关:

                  MMI的编译开关一般都放在plutommi/customer/custResource/PLUTO_MMI/MMI_features_switchPLUTO.h中

                如下添加:#define _MMI_MYAPP_   (_ON_)    

             

              当添加了如上的代码后,在其他文件中的#ifdef _MMI_MYAPP_

                                                                         .............

                                                                         .............

                                                                    #endif

                                                             所包围的代码就会被编译。

 

第四步:为资源添加ID

              做完以上三步后,接下来就是添加ID了,资源有很多种,所以添加ID的方式有一些不同

              (1)添加基础ID。

                               在加ID之前先得为本程序添加一个基础ID,因为所有程序的资源ID都是各自为政定义各自的,但这些ID又不能冲突,(因为每种类型的资源ID都是在一个取值空间),所以我们需要基础ID将每个程序的ID取值隔离开来,基础ID为某类资源定义了一个范围,统一定义在plutommi/MMI/INC/MMIDataType.h

 

                           具体就看两个宏定义

/*
 * Use this macro two to declare resource id range between RESOURCE_BASE_ENUM_BEGIN()
 * and RESOURCE_BASE_ENUM_END()
 */
#define RESOURCE_BASE_RANGE(ap_id, count)    /
    ap_id,                                   /
    GET_RESOURCE_BASE(ap_id) = ap_id,        /
    GET_RESOURCE_MAX(ap_id) = ap_id + count - 1

 

/*
 * Use these tow macro to get the resource base and resource end
 */
#define GET_RESOURCE_BASE(id)   RESOURCE_BASE_##id
#define GET_RESOURCE_MAX(id)    RESOURCE_BASE_##id##_END

 

这样首先通过语句 RESOURCE_BASE_RANGE(ap_id, count) 就可以设定资源 ID的范围,

               同时GET_RESOURCE_BASE(ap_id)把ap_id付给RESOURCE_BASE_##id,

最后再通过类似的语句

       #define MYAPP_BASE                                   ((U16)GET_RESOURCE_BASE(MYAPP))

把RESOURCE_BASE_##id付给了MYAPP_BASE。

 

再啰嗦下,也就添加两类代码,一类先是确定资源ID范围,然后一类就是把范围地址赋值给MYAPP_BASE 这类ID。

 

 

 

                 (2)添加屏幕ID(即屏幕序号)

 上面添加完基础ID后,我们就可以利用基础ID来添加我们的屏幕ID了,在MYAPPDefs.h中定义

     typedef enum{

                  

                 SCR_MYAPP-MAIN=MYAPP_BASE+1,

 

}SCREENID_LIST_MYAPP

 

                  (3)添加字串ID

也是利用基础ID,在MYAPPDefs.h中定义

typedef enum
{
STR_MYAPP_HELLO = MYAPP_BASE + 1,
}STRINGID_LIST_MYAPP;

 

                   (4)添加图片ID

              同上 

 

                 (5)添加菜单项ID

   这个相对特殊,它在plutommi/MMI/inc/GlobalMenuItems.h中定义

 

 

第五步:资源的加载

       上面四步把ID和资源都定义了,现在我们就需要把它们加载使之关联起来。

               

                 (1)主菜单及一级菜单的加载

        需要在Res_MainMenu.c修改添加,此处很容易出错,因为多处位置容易添错,首先需要在文件前部定义枚举变量,然后在void PopulateMainMenuRes(void)中调用ADD_APPLICATION_MENUITEM这个函数。

 

                 (2)其他菜单项的加载,字符串加载,图片加载

      都在plutommi/customer/custresource/pluto_mmi/res_mmi/Res_MyApp.c中的populateMyAppRes函数里加载。

         注:populateMyAppRes这个函数被plutommi/MMI/Resource/populateRes.c下的populateResData()调用,而populateResDate()被mtk_resgenerator.exe执行时呼叫。这就是资源装载预编译顺序。

 

 

第六步:交互

 

       在平台中,每个菜单项的行为都由菜单项自己控制,系统所做的就是在高亮此项时发个通知过来。所以,每个菜单项都要在开机时通知系统由哪个函数来接收通知,SetHiliteHandler就是用来做此事的,其第一个参数就是菜单项的ID,第二个参数就是接收通知的函数指针。我们通常为每个程序建立一个初始化函数,此函数只在开机时运行一次,比如mmi_myapp_init,在此函数中我们会将本程序所有菜单项都注册一遍。mmi_myapp_init通常在MMITask.c 中被调用。

如:#ifdef _MMI_MYAPP_

     #include "MyAppGprot.h"

     #endif

 

    void InitAllApplication()

   {

#ifdef _MMI_MYAPP_

     mmi_myapp_init();

#endif

   }

 

 

以下在myappsrc.c中实现
void mmi_myapp_init(void)
{
SetHiliteHandler(MENU_ID_MYAPP_PRINT, mmi_myapp_hilite_print);

}

 

void mmi_myapp_hilite_print(void)
{
 SetLeftSoftkeyFunction(mmi_myapp_print_entry,KEY_EVENT_UP);

}

 

 

 

void mmi_myapp_print_entry(void)

{

.................

}

 

 

      通过以上的6个步骤,基本上就实现了各种资源的定义和加载。如果还有不懂的可以跟我博客交流。

原创粉丝点击