展讯平台之 MMI
来源:互联网 发布:马新贻 知乎 编辑:程序博客网 时间:2024/05/16 09:30
窗口创建过程(hello sprd):
(1)创建窗口TABLE()
宏 WINDOW_TABLE定义了窗口数据信息表,在window_parse.h
WINDOW_TABLE(MMI_HELLO_SPRD_WIN_TAB)=
{
WIN_ID(MMI_HELLO_SPRD_WIN_ID),//窗口ID
WIN_FUNC((uint32)HandleHelloSprdWinMsg), //处理函数
WIN_TITLE(TXT_HELLO_TITLE),//窗口标题
WIN_SOFTKEY(STXT_OK, TXT_NULL, STXT_RETURN),
END_WIN
};
(2)注册窗口ID
暂放于MMI_APP/COMMON/H/mmi_id.def中
WIN_ID_DEF(MMI_HELLO_SPRD_WIN_ID,"MMI_HELLO_SPRD_WIN_ID")
(3)MMK位于mmk_app.h中
在idle窗口的处理函数里面加case_msg_app_ok里加一句:
MMK_CreateWin((uint32*)MMI_HELLO_SPRD_WIN_TAB,PNULL);
(4)写窗口处理函数,否则是一个空窗口 不会显示。(窗口回调函数)
首先要申明,LOCAL MMI_RESULT_E HandleHelloSprdWinMsg(
MMI_WIN_ID_T win_id,
MMI_MESSAGE_ID_E msg_id,
DPARAM param
);
然后函数实现:窗口的处理函数其实就是一个大的CASE语句,主要处理来自于系统的内部和外部消息。
LOCAL MMI_RESULT_E HandleHelloSprdWinMsg(
MMI_WIN_ID_T win_id,
MMI_MESSAGE_ID_E msg_id,
DPARAM param
)
{ MMI_RESULT_E recode=MMI_RESULT_TRUE;
switch(msg_id)
{
case MSG_OPEN_WINDOW: //打开窗口的消息
break;
case MSG_FULL_PAINT: //刷新窗口消息
{
GUI_LCD_DEV_INFO lcd_dev_info ={GUI_MAIN_LCD_ID,GUI_BLOCK_MAIN};
GUI_POINT_T start_point={1,1};
GUI_RECT_T rect={0,0,239,319}; //全屏区域
MMI_STRING_T text_str={0};
MMIRES_GetText(TXT_HELLO_SPRD,win_id,&text_str);
GUI_FillRect(&lcd_dev_info,rect,MMI_WHITE_COLOR);
start_point.x=1;
start_point.y=30;
LCD_DisplayString(&lcd_dev_info,start_point,text_str.wstr_ptr,text_str.wstr_len,0,MMI_BLACK_COLOR,SONG_FONT_16,0);//显示字符串接口
start_point.x=1;
start_point.y=50;
GUIRES_DisplayImg(&start_point,PNULL,PNULL,win_id,HELLO_SPRD_TEST,&lcd_dev_info);
HelloDrawLine();
HelloDrawRect();
HelloFillRect();
}
break;
case MSG_APP_OK:
MMK_CreateWin((uint32*)MMI_TEST_MENU_WIN_TAB,PNULL);
break;
case MSG_GET_FOCUS: //窗口获得焦点
break;
case MSG_LOSE_FOCUS: //窗口失去焦点
break;
case MSG_APP_CANCEL: //////2010-05-10
MMK_CloseWin(MMI_HELLO_SPRD_WIN_ID);
break;
case MSG_CLOSE_WINDOW: //关闭窗口消息
break;
default:
recode=MMI_RESULT_FALSE;
break;
}
return recode;
}
总结一下一个窗口的创建步骤:
(1)创建窗口TABLE
(2) 注册窗口ID
(3)调用MMK_createWin创建窗口
(4)实现窗口处理函数
关于部分CASE语句的消息定义:
MSG_OPEN_WINDOW:打开窗口
MSG_GET_FOCUS:窗口获得焦点
MSG_FULL_PAINT:窗口刷新
MSG_LOSE_FOCUS:窗口失去焦点
MSG_CLOSE_WINDOW:关闭窗口
MSG_APP_CANCEL:右键消息(取消或返回)
资源(静态资源和动态资源)
包括:字符串、图片、菜单、字库、声音等。
资源工程定义文件:mmi_res_prj_def.h
模块资源ID定义文件:例如common模块common_mdu_def.h文件
添加字串资源:
(1)在资源文件夹,打开STR_TABLE.xls
文件末尾处添加(ID,MAXLENGTH,ENGLISH)
(2)打开common_mdu_def.h
添加res_add_string(TXT_HELLO_SPRD,"HELLO SPRD")
字符串资源的使用:
{
GUI_POINT_T start_point={1,1,};
GUI_RECT_T rect={0,0,239,319};
MMI_STRING_T text_str={0};//定义字符串资源信息
MMIRES_GetText(TXT_HELLO_SPRD,win_id,&text_str);//获取字符串资源信息
GUI_FILLrect(&lcd_dev_info,rect,MMI_WHITE_COLOR);
LCD_DisplayString(&lcd_dev_info, start_point,text_str.wstr_ptr,
text_str.wstr_len,0,MMI_BLACK_COLOR,SONG_FONT_16,0);
}
添加图片资源:
(1)将图片保存于相应模块的MS_Code\MS_MMI\source\resource\mmi_res_240x320\common\MMI_RES_DEFAULT\IMAG\Common
(2)在common_mdu_def.h中添加(注意路径)
RES_ADD_IMG(HELLO_SPRD_TEST,"\\MMI_RES_##\\IMAG\\Common\\HELLO_SPRD_TEST.BMP",IMG_CMP_BMP_16_565_RAW,0)
(3){
start_point.x=1;
start_point.y=50;
GUIRES_DisplayImg(&start_point,PNULL,PNULL,win_id,HELLO_SPRD_TEST,&lcd_dev_info);
}
添加菜单资源:
(1)mmi_menutable.c
//添加于5月17
#define MENU_DEF(_TABLEID, _ITEMPTR, _STYLE, _TITLESTR, _TITLE_ICON, _TITLE_NUMICON, _TITLE_BACKGROUND, \
_ITEMCOUNT) \
_ITEMPTR, _STYLE, _TITLESTR, _TITLE_ICON, _TITLE_NUMICON, _TITLE_BACKGROUND, _ITEMCOUNT,
const GUIMENU_ITEM_T menu_hello_table[]=
{
{ID_HELLO_TEST1,TIP_NULL,{STXT_OK,TXT_NULL,STXT_RETURN},TXT_HELLO_TEST1,IMAGE_SECMENU_ICON_SET_CALL,0,0,0},
{ID_HELLO_TEST2,TIP_NULL,{STXT_OK,TXT_NULL,STXT_RETURN},TXT_HELLO_TEST2,IMAGE_SECMENU_ICON_SET_CALL,0,0,0},
{ID_HELLO_TEST3,TIP_NULL,{STXT_OK,TXT_NULL,STXT_RETURN},TXT_HELLO_TEST2,IMAGE_SECMENU_ICON_SET_CALL,0,0,0},
(2)mmi_menutable.def中添加菜单组ID定义
MENU_DEF( MENU_HELLO_TABLE, menu_hello_table, GUIMENU_STYLE_THIRD, TXT_NULL,IMAGE_COMMON_TITLE_BAR, IMAGE_NULL,IMAGE_NULL, GUIMENU_ITEM_NUM(menu_hello_table))
(3)加入菜单ID
typedef enum//菜单ID
{
ID_HELLO_TEST1,
ID_HELLO_TEST2,
ID_HELLO_TEST3,
ID_HELLO_TOTAL
}MMI_HELLO_MENU_ID_E;
(4) 在mainapp.c里面加入
WINDOW_TABLE(MMI_TEST_MENU_WIN_TAB)=
{
WIN_ID(MMI_TEST_MENU_WIN_ID),
WIN_FUNC((uint32)HandleTestMenuWinMsg),
WIN_TITLE(TXT_NULL),
CREATE_MENU_CTRL(0,MMI_CLIENT_RECT_TOP,MMI_MAINSCREEN_RIGHT_MAX_PIXEL,MMI_CLIENT_RECT_BOTTOM,MENU_HELLO_TABLE,MMI_TEST_MENU_CTRL_ID),
WIN_SOFTKEY(STXT_OK,TXT_NULL,STXT_RETURN),
END_WIN
};
(1)查看菜单项数据定义:const GUIMENU_ITEM_T menu_settings[] =
有助于了解菜单的含义。在mmi_menutable.c文件内
菜单组数据:
首先定义该文件中MENU_DEF宏中取那些数据:
#define MENU_DEF(...)....
const GUIMENU_GROUP_T menu_table[]={} //这个如果是另增模块就需要,
否则加在别的模块的话会引起重定义错误。
(2)定义菜单组ID和菜单组数据
MENU_DEF(...)...//定义菜单数据信息宏
定义菜单数据信息(数组),const GUIMENU_ITEM_T menu_hello_table[]=
{
{ID_HELLO_TEST1,TIP_NULL,{STXT_OK,TXT_NULL,STXT_RETURN},TXT_HELLO_TEST1,IMAGE_SECMENU_ICON_SET_CALL,0,0,0},
{ID_HELLO_TEST2,TIP_NULL,{STXT_OK,TXT_NULL,STXT_RETURN},TXT_HELLO_TEST2,IMAGE_SECMENU_ICON_SET_CALL,0,0,0},
{ID_HELLO_TEST3,TIP_NULL,{STXT_OK,TXT_NULL,STXT_RETURN},TXT_HELLO_TEST2,IMAGE_SECMENU_ICON_SET_CALL,0,0,0},
};
(3)定义菜单项ID
typedef enum {
ID_HELLO_TSET1,
ID_HELLO_TSET2,
ID_HELLO_TSET3,
ID_HELLO_Total
}mmi_hello_menu_id_e;
(4)创建窗口列表
window_table(mmi_test_menu_win_tab)={}
(5)
case MSG_APP_OK:
MMK_CreateWin((uint32*)MMI_TEST_MENU_WIN_TAB,PNULL);
为窗口增加处理函数handletestMenuWinMsg()
设置消息的ACTIVE状态,否则接收不到消息。
case MSG_OPEN_WINDOW:
MMK_SetAtvCtrl(win_id,MMI_TEST_MENU_CTRL_ID);
如果添加新模块的话 可以将ID分离开来 建一个sample_id.h文件
window id
typdef enum{
MMIHELLO_WIN_ID_START=(MMI_MODULE_SAMPLE<<16),
MMI_HELLO_SPRD_WIN_ID,
MMI_TEST_MUNE_WIN_ID,
MMIHELLO_MAX_WIN_ID
}MMIHELLO_WINDOW_ID_E;
CONTROL ID
typedef enum
{
MMIHELLO_CTRL_ID_START=MMIHELLO_MAX_WIN_ID,
MMI_TEST-menu_ctrl_id,
mmihello_max_ctrl_id
}mmihello_control_id_e;
- 展讯平台之 MMI
- MMI
- MTK平台MMI窗口的绘制(转)
- MMI 练习之 新增模块步骤
- MTK 图层 MTK平台MMI窗口的绘制
- MTK MMI平台在VC的模拟器使用
- [feature phone系列]平台架构和MMI framework
- MMI 练习之二 WinId、MenuGroupId等定义、声明
- MMI设计
- mmi学习
- MMI主题
- MMI Code
- MMI Code
- MMI小结
- MMI-Android
- 展讯平台消息传递之键盘消息
- 展讯平台消息传递之键盘消息 (二)
- 展讯平台如何调试之打LOG--串口log
- <二>---RIL层代码分析---RIL_startEventLoop()->eventLoop()->ril_event_loop()
- linux 网络数据类型
- “应用程序配置不正确,程序无法启动”的解决方法
- 转载自http://www.programmer.com.cn/8435/ 本文链接: 编程技术面试的五大要点
- 设计模式--Factory Method
- 展讯平台之 MMI
- 自定控件设置控件属性用到的一些类
- 自己总结的有关Oracle用户权限的一些基本命令
- 分类器模型1:朴素贝叶斯分类器 Naive Bayes(转载)
- 【解决问题】android sdk Content Loader's has encountered a problem
- 添加uCOSII到工程时出现100个 Error[Li006] 错误
- JAVA环境变量配置
- JBoss6 消息驱动文件配置
- WebService大讲堂之Axis2(10):使用soapmonitor模块监视soap请求与响应消息