注:本人博文整理至CSDN以方便查阅,源博文位于EDN
在每个App底下都有一个res文件夹。这些文件的主要功能是将UI layout从程序中分离,变更的时候无需更改代码。
这些文件的自动生成应该是源自EMMI Studio。不过我还没用过EMMI Studio来进行开发,一般都是直接手动进行修改。(具体的是否如此,就该问问Mstar官方说法了)
下面以AlarmApp()为例分析一下RS文件的内容。
ApBegin(QvgaP,CLSID_ALARMAPP)
WndBegin(ALARM_WND_SETALARM)
WndSetAllSoftkeyRC({SK_SAVE, SK_OK, SK_CANCEL})………………①
WndSetTitleRC({IMG_NULL_ID,TXT_LTL_N_EDIT_ALARM})
WdgBegin(CLSID_DOUBLE_TEXT_WIDGET,TitleDoubleTextWidget)
WdgDoubleItemCreateForWndRC({{0,0},{0,0},DOUBLEITEM_STYLE_DOUBLE_TEXT})
WdgDoubleItemDBTextSetDataByIDRC({TXT_LIL_N_TITLE,TXT_NULL_ID})
WdgEnd(CLSID_DOUBLE_TEXT_WIDGET,TitleDoubleTextWidget)
WndEnd(ALARM_WND_SETALARM)
ApEnd(QvgaP,CLSID_ALARMAPP)
ApBegin和ApEnd有两个参数,第一个是指ThemeID,主要是在有多个Theme时用来做切换theme的判断。第二个参数很明显,就是对应AP的CLSID了。加载资源的时候,会根据所提供的AP CLSID及Window ID从资源中得到对应窗口的内容。
WndBegin/ WndEnd里的参数是指对应窗口的ID号,这个ID好一般都定义在对应AP的头文件中,如闹铃的是在Mmi_alarmapp_id.h。在一个App中可以定义多个窗口,窗口中又可以定义多个Widget。在程序中Load资源时,变量的数据类型ALARM_WND_SETALARM_t,这个东东又是怎么生成的呢?
这个数据结构是根据用户定义的窗口ID动态生成的。别急!
在窗体内部就是诸如左右软键,标题,Widget等的layout了。在标号一中设置了左软键功能为保持,Action键为确定,右软键为返回。WndSetAllSoftkeyRC里面的参数在mmi_macro_prop_def.h中可以查看:
#define WndSetAllSoftkeyRC(...) PropIDDefine( nAllSkID) AllSoftkeyVar_t tAllSk;
AllSoftkeyVar_t这个结构定义在mmi_common_wdgvar.h。具体为
typedef struct
{
u32 nLeftSKID;
u32 nMiddleSKID;
u32 nRightSKID;
}AllSoftkeyVar_t;
以下是在代码中的调用
ALARM_WND_SETALARM_t *pVar = LoadRC(CLSID_ALARMAPP,ALARM_WND_SETALARM);
WndSetAllSoftkey(hWin, pVar->tAllSk.nLeftSKID,pVar->tAllSk.nMiddleSKID,pVar->tAllSk.nRightSKID);
从颜色上我想你应该很清楚知道他们的对应关系了。
WdgBegin/ WdgEnd,参数一,widget ID,参数二,widget的名称。Widget里的写法和结构都可以像左右软键那样找到。
从上面不难看出,通过WND_ID生成的结构WND_ID_t其实就是内部所有用到的结构的一个打包。