| 本帖最后由 xingyangqing 于 2010-3-2 10:50 编辑 
 下面讲具体实现的部分,为了简化描述,我们暂时先将我们的模块入口挂接到主菜单入口处(后面讲到资源的部分可将入口移到某个新建的子菜单下),修改下文件“plutommi\mmi\mainmenu\mainmenusrc\MainMenu.c”中的goto_main_menu函数,如下所示红色字体部分:
 
 void goto_main_menu(void)
 
 {
 
 #ifdef      __MMI_HELLOWORLD_ENABLED__
 
 mmi_HelloWorld_entry();
 
 return;
 
 #else
 
 …    // 此处为之前goto_main_menu的代码
 
 #endif
 
 }
 
 同时我们需要在文件MainMenu.c中包含头文件HelloWorldGprot.h,所以再在这个文件的头文件包含代码块(通常是文件的顶部区域)追加这一句:#include "HelloWorldGprot.h"。
 下面是HelloWorld.c的内容:
 
 /*************************************************************************/
 
 #include "stdC.h"
 
 #include "MMI_Features.h"   /* 编译开关会出现在这个由make update生成的文件里面 */
 
 #include "L4Dr.h"
 
 #include "L4Dr1.h"
 
 
 
 #include "AllAppGprot.h"
 
 #include "FrameworkStruct.h"
 
 #include "GlobalConstants.h"
 
 #include "EventsGprot.h"
 
 #include "mmiappfnptrs.h"
 
 #include "HistoryGprot.h"
 
 
 
 #include "HelloWorldProt.h"
 
 #include "HelloWorldTypes.h"
 
 #include "HelloWorldDefs.h"
 
 
 
 #include "MainMenuDef.h"
 
 
 
 #include "wgui_categories.h"
 
 
 
 #include "Unicodexdcl.h"
 
 
 
 /* 模块入口 */
 
 void mmi_HelloWorld_entry(void)
 
 {
 
 #ifdef      __MMI_HELLOWORLD_ENABLED__
 
 /* 强制退出当前屏幕,之后进入到我们的模块了 */
 
 /* 上电缺省是idle屏幕,现进入MAIN_MENU_SCREENID屏 */
 
 /* 注意看第二个参数,这个是当我们模块被强制退出时执行的一些操作 */
 
 EntryNewScreen(MAIN_MENU_SCREENID, mmi_HelloWorld_exit, NULL, NULL);
 
 
 
 /* 关掉屏幕顶部的状态条,我们要用整个屏幕 */
 
 entry_full_screen();
 
 
 
 /* 擦除当前背景 */
 
 clear_screen();
 
 
 
 /* 移动文本输出光标 */
 
 gui_move_text_cursor(50, 100);
 
 
 
 /* 设置字体颜色 */
 
 gui_set_text_color(UI_COLOR_RED);
 
 
 
 /* 输出文本到显示缓冲, 注意是Unicode编码 */
 
 gui_print_text(L"Hello, World");
 
 
 
 /* 刷新屏幕显示,MMI用的是双缓冲绘图方式,而且需要显式刷新 */
 
 gui_BLT_double_buffer(0, 0, UI_device_width - 1, UI_device_height - 1);
 
 
 
 /* 注册一个按键处理,右软键弹起时返回到之前被我们强制退出的模块 */
 
 SetKeyHandler(GoBackHistory, KEY_RSK, KEY_EVENT_UP);
 
 #endif
 
 }
 
 
 
 /* 模块出口
 
 * 当我们的模块被其他模块强制退出时会执行这个函数,
 
 * 这个函数的常见写法,包括:
 
 *   1、模块已申请资源的释放(如果需要的话),这一步可选
 
 *   2、手动把自己压栈到窗口(实际是整个屏)堆栈里面,
 
 *      便于强制我们退出的模块执行完后重新把我们叫出来
 
 *      不像Window的窗口管理是自动压栈的,Pluto MMI需要手动压栈
 
 *   3、其他一些清理动作
 
 */
 
 void mmi_HelloWorld_exit(void)
 
 {
 
 #ifdef      __MMI_HELLOWORLD_ENABLED__
 
 history currHistory;
 
 S16 nHistory = 0;
 
 
 
 currHistory.scrnID = MAIN_MENU_SCREENID;
 
 currHistory.entryFuncPtr = mmi_HelloWorld_entry;
 
 pfnUnicodeStrcpy( (S8*)currHistory.inputBuffer, (S8*)&nHistory);
 
 
 
 AddHistory(currHistory);
 
 #endif
 
 }
 
 /*************************************************************************/
 
 编码的部分基本上就是这些了,然后我们开始make,这次要用“make update”,基于上述对相关系统文件的改动,make update会自动将刚才的模块加入到整个项目中去,同时也会更新仿真器VC工程文件,如下图所示,HelloWorld模块的相关文件已经被自动加入到MMI库里面了:
 
 
 MTK开发心得-网友Henry原创(连载)
 2009-6-16 23:04
 
 后续的make,如果是不涉及到系统相关文件的修改,用“make remake”就可以了,以节省编译时间,因为make一次太耗时间了。
 
 注意:对于仿真程序的编译,“make update”似乎缺少一些处理,导致可能还需要手工在文件“plutommi\mmi\GlobalSimulatorPathDef”中追加一行,以便模块的头文件能被顺利找到,如下所示:
 
 /I ".\HelloWorld\Inc"
 |