当前位置:首页 >> 信息与通信 >>

展讯Helloworld


首先声明, 本人技术能力很差, 写这个文档纯属依瓢画葫芦, 很多地方知其然不知其所以然, 原因是自己想学点展讯的基本的东西, 在网上找了很久也没找到类似 MTK 的 Helloworld 的 教程,于是决定献丑写篇,希望可以帮到别人,更希望能抛砖引玉,能有人写篇像 MTK 富 贵文档样的佳作。有不好的地方,请大家见谅。 1、 在 MS_Code\MS_MMI\source\mmi_app\app 目录下建立自己的文件 Helloworld,按照展讯 的规范里面应该包含三个文件 c、h,分别放需要的头文件和源文件。 2、 增加自己的开关(为了规范和方便维护) ,一般在工程的主 mk 里,我的工程是 project_sc6600l_sp6601l.mk: export MYAPP_SUPPORT = TRUE ### RELEASE version # Option1:TRUE # Option2:FALSE 3、 在 make\app 目录下的 app.mk 里添加自己的宏,要编译的源文件、头文件路径: ifeq ($(strip $(MYAPP_SUPPORT)), TRUE) MCFLAG_OPT += -D__MYAPP__ MINCPATH += MS_MMI/source/mmi_app/app/Helloworld/h MSRCPATH += MS_MMI/source/mmi_app/app/Helloworld/c SOURCES += myapp.c myapp_id.c endif 一般加在 app.mk 的最后面,方便查找和修改。 4、 在目录 make\resource 下的 resource.mk 里添加资源头文件和路径 最开始我是这样添加的: ifeq ($(strip $(MYAPP_SUPPORT)),TRUE) SOURCES += myapp_mdu_def.h SRCPATH += MS_MMI/source/mmi_app/app/Helloworld/h Endif 这时候出现了致命的错误, 怎么样资源都有问题不能编译出资源的 bin 文件, resource.log 里面提示无法打开 res 目录下的资源头文件.原来展讯是要把资源头文件拷贝到 build 里 面的一个 res 文件夹的,但是 BT 的就在于它是用资源头文件的名字的前缀来建立一个 相应的文件夹的,唉,此错误真是耗费我精力时间良多呀,可见依瓢画葫芦某些方面就 得完全参照呀,也可见自己对于此的理解和思维能力很差,好好加油吧。 最后修改成: 最后修改成 ifeq ($(strip $(MYAPP_SUPPORT)),TRUE) SOURCES += Helloworld_mdu_def.h SRCPATH += MS_MMI/source/mmi_app/app/Helloworld/h Endif 编译通过。 (添加的位置进去后跟着别人加就可以了,连我都知道相信你一定会的) 5、 在 mmi_res_prj_def.h 里,定义自己的 MODULE(作用不是很明确,估计和 MTK 的定 义资源 ID 差不多吧) : #ifdef __MYAPP__ RES_ADD_MODULE(MMI_MODULE_MYAPP,"\\Helloworld\\ Helloworld _mdu_def.h") #endif

到此处又想了些,估计步骤 4 是和 5 紧密联系的,此处添加的模块就是通过查找 res 里 面的 Helloworld 目录的,如果继续使用 myapp_mdu_def.h 来命名,估计把此处的目录改成 myapp 应该就可以了,不过实在不想再去试了,等有心情时间后再试了吧。 注意:最好加在该头文件最后一个 RES_ADD_MODULE 之后。 注意 6、 在 mmi_menutable.h 里添加菜单 ID,在 ID_TOTAL 之前: #ifdef __MYAPP__ ID_MYAPP_HELLOWORLD, #endif 7、 在 mmi_menutable.c 里的数组 menu_icon_pastime(娱乐)下添加菜单信息: #ifdef __MYAPP__ {ID_MYAPP_HELLOWORLD,TIP_NULL,{STXT_OK,TXT_NULL,STXT_RETURN},T XT_MYAPP, IMAGE_MYAPP, 0,0,MENU_NULL}, #endif 说下我对此菜单信息的理解吧:参数 1 是菜单 ID,参数 2 还不是很明确,参数 3、4、5 分别是左中右键的文字信息,参数 6 是菜单名,参数 7 是菜单小图标。 因为菜单里的 TXT_MYAPP,IMAGE_MYAPP 是我们自己定义的,分别在 myapp_text.h 和 myapp_image.h 里面,所以此处要包含这两个头文件。 #ifdef __MYAPP__ #include "myapp_text.h" #include "myapp_image.h" #endif 至此,我们的 helloworld 菜单就出来了,见截图(娱乐菜单下第二位) :

附上几个头文件的内容: Helloworld_mdu_def.h: #ifdef __MYAPP__

RES_ADD_IMG(IMAGE_MYAPP,"\\MMI_RES_##\\IMAG\\myapp.png",IMG_CMP_PNG _ARGB,0)

RES_ADD_STRING(TXT_MYAPP,"Helloworld") #endif

myapp_text.h: #ifndef MYAPP_TEXT_H #define MYAPP_TEXT_H #ifdef __MYAPP__ #include "sci_types.h" #include "mmi_module.h" #ifdef __cplusplus extern "C" { #endif #define MACRO_MDU_TYPE MACRO_MDU_TEXT #include "macro_mdu_def.h" typedef enum MYAPP_TEXT_ID_E { MYAPP_TXT_NULL = ( MMI_MODULE_MYAPP << 16 ) | MMI_SYS_RES_FLAG, #include "Helloworld_mdu_def.h" MYAPP_TXT_MAX } MYAPP_TEXT_ID_E; #undef MACRO_MDU_TYPE #ifdef __cplusplus } #endif #endif #endif myapp_image.h: #ifndef MYAPP_IMAGE_H_ #define MYAPP_IMAGE_H_ #ifdef __MYAPP__ #include "sci_types.h" #include "mmi_imagefun.h" #include "mmi_module.h" #ifdef __cplusplus

extern #endif

"C" {

#define MACRO_MDU_TYPE MACRO_MDU_IMAGE #include "macro_mdu_def.h" typedef enum MYAPP_IMAGE_ID_E { MYAPP_IMAGE_NULL = ( MMI_MODULE_MYAPP << 16 ) | MMI_SYS_RES_FLAG, #include "Helloworld_mdu_def.h" MYAPP_IMAGE_MAX_ID } MYAPP_IMAGE_ID_E; #undef MACRO_MDU_TYPE #ifdef __cplusplus } #endif #endif #endif 接下来要做的就是在 myapp.c 里面添加点击菜单可以进入到一个显示世界你好的窗口 了,不过在此之前先说下一些简单的编译命令和模拟器的使用吧: 一般的编译命令: 一般的编译命令 make PROJECT=projectname new/update/cleanall new:重新编译整个目录 (时间最久,最好安装有联合编译,然后带上参数 ib=1 就可以使用 联合编译快很多了) ,update:更新了资源和改动少量逻辑上的代码时使用,可以节约时间, cleanall 清除所有编译结果。 模拟器使用 使用: 模拟器使用 编译完成后再使用模拟器编译命名编译:make PROJECT=projectname MODULES=simulator 编 译 完 成 后 , 去 到 目 录 : MS_Code\build\sc6600l_sp6601l_builddir\win 用 VC 打 开 simulator.dsw,此时不知道为什么我的会弹出一个窗口要输入密码,我点了几次 cancel 后就 跳过了。这时 VC 要做相应的设置: 菜单 工程——设置活动工程——选择 msdevkernel 菜单 工程——设置——点击调试——可执行调试对话 点击右边的图标选择要运行的 exe 路径为:MS_Code\build\sc6600l_sp6601l_builddir\win\bin 下的 msdev.exe

然后用 VC 编译完成(用联合编译快很多) ,点运行就可以出现了,有看到网上说第一次使

用模拟器还要做一些配置,但是不知道为什么我的不用,大家可以上网找些资料。 再接下来,让我们完成 myapp.c,实现点击我们菜单进入一个窗口:

最后实现效果如图: 8、 增加菜单 ID 响应函数, mainmenu_win.c 里的函数 HandleMainSecondMenuWinMsg 里 在 的语句 switch (menu_id)里添加入口函数: #ifdef __MYAPP__ case ID_MYAPP_HELLOWORLD: MYAPP_EnterWin(); break; #endif

9、 myapp.c 里的内容为: #ifdef __MYAPP__ #include "window_parse.h" #include "mmk_type.h" #include "guilcd.h" #include "mmidisplay_data.h" #include "os_api.h" #include "mmk_timer.h" #include "mmiacc_id.h" #include "mmi_image.h" #include "mmipub.h" #include "myapp_id.h" #include "myapp_text.h" void MYAPP_AppInit(void) { MYAPP_RegWinIdNameArr(); } MMI_RESULT_E win_id,MMI_MESSAGE_ID_E { MMI_RESULT_E recode

HandleStartStatusMYAPPWinMsg(MMI_WIN_ID_T msg_id,DPARAM param)

= MMI_RESULT_TRUE;

MMI_STRING_T string = {0}; switch(msg_id) { case MSG_OPEN_WINDOW: GUIWIN_SetSoftkeyTextId(win_id, COMMON_TXT_NULL,COMMON_TXT_NULL,STXT_RETURN,FALSE); MMK_SetAtvCtrl(win_id, MYAPP_TEXT_CTRL_ID); MMI_GetLabelTextByLang(TXT_MYAPP_CONTENT, &string); GUITEXTBOX_SetText(MYAPP_TEXT_CTRL_ID , &string, FALSE); break; case MSG_FULL_PAINT: break;

case MSG_APP_CANCEL: case MSG_CTL_CANCEL: MMK_CloseWin(win_id); break;

default: recode = MMI_RESULT_FALSE; break; } return recode; } WINDOW_TABLE(MYAPP_WIN_TAB) = { //CLEAR_LCD, WIN_PRIO(WIN_ONE_LEVEL), WIN_FUNC((uint32)HandleStartStatusMYAPPWinMsg), WIN_ID(MYAPP_OPTION_WIN_ID), WIN_TITLE(TXT_MYAPP), CREATE_TEXTBOX_CTRL( 0, MMI_TITLE_HEIGHT, MMI_MAINSCREEN_RIGHT_MAX_PIXEL , MMI_MAINSCREEN_HEIGHT-MMI_FULLSCREEN_SOFTKEY_BAR_HEIGHT-1, MAINLCD_ID, MYAPP_TEXT_CTRL_ID ), WIN_SOFTKEY(TXT_NULL, TXT_NULL, STXT_RETURN),//展讯平台自身提供的调 用函数,用于响应按键函数。 END_WIN }; PUBLIC BOOLEAN MYAPP_EnterWin(void) { if(!MMK_IsOpenWin(MYAPP_WIN_TAB)) return (MMK_CreateWin((uint32 *)MYAPP_WIN_TAB, PNULL)); }

#endif 10、 myapp_id.c 内容 #include "std_header.h" #ifdef __MYAPP__ #include "sci_types.h" #include "Mmi_modu_main.h" #define WIN_ID_DEF(win_id, win_id_name) win_id_name,

const uint8 myapp_id_name_arr[][MMI_WIN_ID_NAME_MAX_LENGTH] = { #include "myapp_win_id.def" }; #undef WIN_ID_DEF

PUBLIC void MYAPP_RegWinIdNameArr(void) { #ifndef MMI_AUTOTEST_LOW_MEMORY MMI_RegWinIdNameArr(MMI_MODULE_MYAPP, myapp_id_name_arr); #endif } #endif 11、 myapp_id.h 内容: #ifdef __MYAPP__ #include "mmi_module.h" #include "os_api.h" #define WIN_ID_DEF(win_id, win_id_name) win_id,

#ifndef MMI_AUTOTEST_LOW_MEMORY typedef enum { MYAPP_WIN_ID_START = (MMI_MODULE_MYAPP<< 16), #include "myapp_win_id.def" MYAPP_MAX_WIN_ID }MYAPP_WINDOW_ID_E; #else //提高兼容性

typedef enum { MYAPP_WIN_ID_START = (MMI_MODULE_MYAPP << 16), MYAPP_OPTION_WIN_ID, MYAPP_MAX_WIN_ID }MYAPP_WINDOW_ID_E; #endif typedef enum { MYAPP_CTRL_ID_ID_START = MYAPP_MAX_WIN_ID, MYAPP_TEXT_CTRL_ID, MYAPP_MAX_CTRL_ID }MYAPP_CTRL_ID_T;

PUBLIC void MYAPP_RegWinIdNameArr(void); #endif 12、 myapp_win_id.def 内容: #ifdef __MYAPP__ WIN_ID_DEF(MYAPP_OPTION_WIN_ID, "MYAPP_OPTION_WIN_ID") #endif 13、添加初始化函数,在 mmimain.c 里的函数 InitMMIModule 里的 MMI_RegModuleNvEnd 之前添加: #ifdef __MYAPP__ MYAPP_AppInit(); #endif 结语:在此首先对那些写文档分享技术的高手们表示崇拜和敬意,原来写文档很不容易, 结语:在此首先对那些写文档分享技术的高手们表示崇拜和敬意,原来写文档很不容易, 由于个人技术能力, 花了近两天时间,不过也因此有所收获。 由于个人技术能力,这样一个简单 Hello world 花了近两天时间,不过也因此有所收获。转 眼毕业两年了, 的道路,心中感触良多。虚度了自己的大学四年, 眼毕业两年了,去年四月开始走上 IT 的道路,心中感触良多。虚度了自己的大学四年,在 专业学习上一塌糊涂,现在感觉举步维艰。 专业学习上一塌糊涂,现在感觉举步维艰。对于程序的领悟能力和思维能力比之身边的人 差距甚大,每当想到这里都怀疑自己适不适合走 行业,但目前既然在路上了, 差距甚大,每当想到这里都怀疑自己适不适合走 IT 行业,但目前既然在路上了,只能硬着 头皮走下去。 语言,进步很慢,不过总比不学好吧,慢慢的来, 头皮走下去。开始重新学习 C 语言,进步很慢,不过总比不学好吧,慢慢的来,希望可以 有所收获。也希望有高手指点,要怎么样才能有质的转变。如此文档,实在难以出手, 有所收获。也希望有高手指点,要怎么样才能有质的转变。如此文档,实在难以出手,但 愿能帮到一两个人,也算不白费精力了吧。学习个人觉得 愿能帮到一两个人,也算不白费精力了吧。学习个人觉得 MTK、展讯这些平台的精髓就在 、 于模仿,很多都可以模仿其平台实现了的功能、模板。谢谢! 于模仿,很多都可以模仿其平台实现了的功能、模板。谢谢! ——孤星城 ——孤星城


赞助商链接
相关文章:
更多相关文章: