根据我自己的理解,setform.c主要负责的工作就是日程表界面显示相关的内容,而逻辑实现部分则在working.c之中;
对于界面而言,其一是对于外观的修改,例如菜单的长度、文字的长度、对话框大小的设置等等;其二是更深入的部分,主要是相关按键及其他事件的处理工作。对于第一点我们了解了它就可以对界面的显示进行修改了;如果要对按键等功能设置进行更改的话则需在事件处理中进行。下面是一个创建日程表内容的界面创建过程,我们通过它来详细的了解步骤1。
static int SCH_Create_Schedule_Content(Sch_Setting * pMe,int16 ypos)
{
int ret = SUCCESS;
WidgetProp wp;
IWidget *tmpWidget;
WExtent we;
WidgetPos wpos;
pMe->pSchContImage = ISHELL_LoadResImage(pMe->pShell, SCHEDULE_IMAGE_RESFILE,IDI_SCH_CONT);//载入内容ICON
// 创建PROPCONTAINER接口实例
ret = ISHELL_CreateInstance(pMe->pShell, AEECLSID_PROPCONTAINER, (void**)&pMe->pSchContPropContainer);
ret += ISHELL_CreateInstance(pMe->pShell,AEECLSID_STATICWIDGET,(void**)&pMe->pSchContWidget);//创建static widget实例
ret += ISHELL_CreateInstance(pMe->pShell,AEECLSID_IMAGEWIDGET,(void**)&pMe->pSchContImgWig);//创建image widget实例
ISHELL_LoadResString(pMe->pShell,pMe->pMF->pApp->pSchedulesrFile,IDS_SCH_CONT,pMe->SchContBuf,SCH_TIME_BUF_LENGTH*sizeof(AECHAR));//载入“内容”二字
IWIDGET_SetImage(pMe->pSchContImgWig, pMe->pSchContImage); //将图片指针与imagewidget关联
ret += IWIDGET_SetROP(pMe->pSchContImgWig, AEE_RO_TRANSPARENT); //设置imagewidget属性1
IWIDGET_SetFlags(pMe->pSchContImgWig, IDF_ALIGN_LEFT|IDF_ALIGN_MIDDLE);//设置imagewidget属性2
IWIDGET_SetBorderWidth(pMe->pSchContWidget, 0);//设置static widget属性1
IWIDGET_SetFlags(pMe->pSchContWidget, IDF_ALIGN_LEFT|IDF_ALIGN_MIDDLE);//设置static widget属性2
IWIDGET_SetText(pMe->pSchContWidget,pMe->SchContBuf,FALSE);//设置static widget文字
wp.bVisible=TRUE;//设置可见属性
#ifdef FEATURE_QTM10
wp.prop = 1 ; //不执行
IPROPCONTAINER_Insert(pMe->pSchContPropContainer, pMe->pSchContWidget, WIDGET_ZNORMAL,&wp);//不执行
#else
wp.prop = 2 ; //FLAG_IMAGE_WIDTH
IPROPCONTAINER_Insert(pMe->pSchContPropContainer, pMe->pSchContImgWig,WIDGET_ZNORMAL,&wp);//插入imwig至PCONT
wp.prop = 10 ;
IPROPCONTAINER_Insert(pMe->pSchContPropContainer, pMe->pSchContWidget, WIDGET_ZNORMAL,&wp);插入stawig至PCONT
#endif
//将CONTPROPCONTAINER与一个widget类型的临时指针绑定,也就是说将其当做一个普通的widget
ret += IPROPCONTAINER_QueryInterface(pMe->pSchContPropContainer, AEEIID_WIDGET, (void**)&tmpWidget);
if (ret == SUCCESS)
{
//将该WIDGET放置于pXYContainer指向的container,达到显示的目的,前面几句代码作用是设置widget的属性
IWIDGET_SetLayoutStyle(tmpWidget, LAYOUT_HORZ);
we.height = MENU_ITEM_HEIGHT;
we.width = CONTAINER_WIDTH ;
IWIDGET_SetExtent(tmpWidget, &we);
wpos.x=0 ;
wpos.y= ypos ;
wpos.bVisible=TRUE ;
IXYCONTAINER_Insert(pMe->pXYContainer, tmpWidget, WIDGET_ZNORMAL, &wpos);//最后插入widget或者说是propcontainer
IWIDGET_Release(tmpWidget);//释放临时对象, 注意代码的安全
}
HANDLERDESC_Init(&pMe->hSchContDesc, Sch_Setting_Cont_HandleEvent, pMe, 0);//调用事件处理函数
IWIDGET_SetHandler(pMe->pSchContWidget, &pMe->hSchContDesc);//设置新的事件处理
return ret;
}
(完)