1、工模GUI如下图:
注意两个API接口,_APP_Update_Layer()/UpdateNodeFunctionContent()
这两个接口一个是刷新ListView,另一个刷新ListView对应的TextBox值,后面简称ListView为工模的“键”,对应的TextBox为对应的“值”,即工模为键-值对的组合。
1) 刷新ListView以及TextBox值
static GUIResult_e _APP_Update_Layer(int NodeId){ GUIResult_e dRet = GUI_SUCCESS; int i=0; int ChildId = FactoryNode[NodeId].childID; if(ChildId==0) return dRet; // 检查ListView页面节点数 int NextId = FactoryNode[ChildId].nextID; int count = 1; while( (NextId!=0) && (count",具体值由"UpdateNodeFunctionContent"刷新 for(i=0; i<=FM_ITEMS_PER_PAGE; i++) { HWND FocusItem_Handle; dRet = GEL_GetHandle(pWindowControl, nItemStart+i, &FocusItem_Handle); if(i
2)刷新菜单的Focus/Disable/Item滚动状态
static INT32 _APP_GUIOBJ_FM_FactorySetting_UpdateMenu(void){ GUIResult_e dRet = GUI_SUCCESS; INT32 i32Index = 0; UINT32 NodeId = ID_ROOT; HWND hItem; HWND hFocusItem; State_e nState = NORMAL_STATE; APP_Source_Type_t eSourceType = APP_SOURCE_MAX; AL_ServiceDetail_t stServInfo; AL_RecHandle_t hProgHdl; UINT32 u32ColorSystem = 0; APP_GUIOBJ_Source_GetCurrSource(&eSourceType); //清除所有Item聚焦 for(i32Index=nItemStart; i32Index<=nItemEnd; i32Index++) { dRet = GEL_GetHandle(pWindowControl,i32Index, &hItem); // Get state GUI_FUNC_CALL( GEL_GetParam(hItem, PARAM_STATE,&nState) ); if(nState == FOCUS_STATE) { GUI_FUNC_CALL(GEL_SetAnimEnable(hItem, FALSE)); GUI_FUNC_CALL( GEL_SetParam(hItem, PARAM_SETNORMAL, NULL)); } } //设置特定Item的Disable状态 if(nowNodeHeadId == ID_FM_Funct_Backlight) { for(i32Index=0;(int)i32Index= u16preBacklightValue)) { dRet = GEL_SetParam(g_fmFactorySetting_data,PARAM_ITEM_DISABLE, (void*)&i32Index); dRet = GEL_GetHandle(pWindowControl, i32Index+nItemStart, &hItem); dRet = GEL_SetParam(hItem,PARAM_SETDISABLED, NULL); } else { dRet = GEL_SetParam(g_fmFactorySetting_data,PARAM_ITEM_ENABLE, (void*)&i32Index); dRet = GEL_GetHandle(pWindowControl, i32Index+nItemStart, &hItem); dRet = GEL_SetParam(hItem,PARAM_SETNORMAL, NULL); } } else { dRet = GEL_SetParam(g_fmFactorySetting_data,PARAM_ITEM_ENABLE, (void*)&i32Index); dRet = GEL_GetHandle(pWindowControl, i32Index+nItemStart, &hItem); dRet = GEL_SetParam(hItem,PARAM_SETNORMAL, NULL); } } } // 设置Item的聚焦及滚动 dRet = GEL_GetParam(g_fmFactorySetting_data, PARAM_CURRENT_INDEX, &i32Index); dRet = GEL_SetParam(g_fmFactorySetting_data, PARAM_SETFOCUSED, NULL); i32Index +=nItemStart; dRet = GEL_GetHandle(pWindowControl, i32Index, &hFocusItem); dRet = GEL_SetParam(hFocusItem, PARAM_SETFOCUSED, NULL); GUI_FUNC_CALL(GEL_SetAnimEnable(hFocusItem, FALSE)); APP_GuiMgr_RegionBufferControl(&hFocusItem, 1); //设置滚动Item GUI_FUNC_CALL(GEL_SetAnimEnable(hFocusItem, TRUE)); GUI_FUNC_CALL( GEL_ShowMenu(pWindow) ); GUI_FUNC_CALL(GEL_UpdateOSD()); return (UINT32)dRet;}
3)菜单联动显示
即,当前聚焦的Item发生变化时,其它Item会联动变化,例如:工模调整背光百分比是,当前电流/占空比/PWM寄存器的值是应该跟随变化的
调用API: UpdateNodeFunctionContent(ID_FM_Function_BlackLight_Backlight, 0, 0)
背灯例子:
void Factory_BackLight(BOOL bSet, BOOL path, FUNCTION_DATA *pValue, BOOL bDefault){ FUNCTION_DATA * FuncData = (FUNCTION_DATA *)pValue; Backlight_t BacklightSetting; BacklightSetting.Backlight_total_Stage = 100; static char dutyBuff[10]; INT16 u16Pwm = 0; UINT32 mapValue= 0; if (bSet) { //调整Backlight(OSD)的值 u16Pwm= AL_FLASH_GetBackLight(); if (gbIsFMRightKey == TRUE) { u16Pwm = (++u16Pwm>=100)?100:u16Pwm; } else if (gbIsFMLeftKey == TRUE) { u16Pwm = (--u16Pwm<=0)?0:u16Pwm; } AL_FLASH_SetBackLight(u16Pwm); BacklightSetting.OSD_backlight_index = u16Pwm; //设置Backlight Cmd_SetLcdBackLight(BacklightSetting); mapValue = CONFIG_DEFAULT_PWM_REG_MAX - (CONFIG_DEFAULT_PWM_REG_MAX - CONFIG_DEFAULT_PWM_REG_MIN)*BacklightSetting.OSD_backlight_index / BacklightSetting.Backlight_total_Stage; sprintf(dutyBuff,"%d - reg[%d]",u16Pwm,mapValue); //Backlight 显示 Update_TypeVersion_Node(dutyBuff, FuncData->nItem); MID_TVFE_GetCurrDutyPWM((short unsigned int *)&(u16DutyPWM)); //联动Item Duty/Current/Duty Value 跟随变化,刷新包含Backlight后面的各个节点 UpdateNodeFunctionContent(ID_FM_Function_BlackLight_Backlight, 0, 0); } else { mapValue = CONFIG_DEFAULT_PWM_REG_MAX - (CONFIG_DEFAULT_PWM_REG_MAX - CONFIG_DEFAULT_PWM_REG_MIN)*AL_FLASH_GetBackLight() / BacklightSetting.Backlight_total_Stage; sprintf(dutyBuff,"%d - reg[%d]",(INT32)AL_FLASH_GetBackLight(),mapValue); Update_TypeVersion_Node((char * ) dutyBuff, FuncData->nItem); } }
接口介绍:
static GUIResult_e UpdateNodeFunctionContent(int NodeId,UINT32 u32CurrentIndex,UINT32 dEventID){ GUIResult_e dRet = GUI_SUCCESS ; NODE_FUNCTION * pFunc; FUNCTION_DATA FuncData; HWND FocusItem_Handle; dRet = GEL_GetHandle(pWindowControl, u32CurrentIndex+nItemStart, &FocusItem_Handle); UINT32 tmp=u32CurrentIndex; gbIsFMRightKey = (UI_EVENT_RIGHT == dEventID) ? TRUE : FALSE; gbIsFMLeftKey = (UI_EVENT_LEFT == dEventID) ? TRUE : FALSE; //迭代需要刷新的TextBox节点 for(u32CurrentIndex=0; (int)u32CurrentIndex< Current_Node_Count; u32CurrentIndex++) { if(dEventID!=0) u32CurrentIndex = tmp; dRet = GEL_GetHandle(pWindowControl, u32CurrentIndex+nItemStart, &FocusItem_Handle); UINT32 nCurrNodeId = NodeId+ u32CurrentIndex;//nowNodeHeadId + u32CurrentIndex ; nowNodeId = nCurrNodeId; pFunc = FactoryNode[nCurrNodeId].pThis; //如果节点有回调,通过回调获取节点的值 if(pFunc != NULL) { if(pFunc->type == MENU_CTRL_TYPE_SLIDER) { if (pFunc->MenuSettingFun) (pFunc->MenuSettingFun)(FALSE, 0, (FUNCTION_DATA*)&FuncData, FALSE); } else if(pFunc->type == MENU_CTRL_TYPE_RADIOBUTTON) { FACT_RADIOBTN *pRad; if (pFunc->leaves) { FuncData.nItem = 0; FuncData.value = 0; if (pFunc->MenuSettingFun) { (pFunc->MenuSettingFun)(FALSE,0, (FUNCTION_DATA*)&FuncData, FALSE); } } } else if(pFunc->type == MENU_CTRL_TYPE_PUSHBUTTON ) { if (pFunc->MenuSettingFun) { if( dEventID==UI_EVENT_RIGHT|| dEventID==UI_EVENT_ENTER ) (*pFunc->MenuSettingFun)(TRUE, 0, &FuncData, FALSE);//注意形参TRUE,为设置节点的值 else (*pFunc->MenuSettingFun)(FALSE, 0, &FuncData, FALSE);//注意形参FALSE,为获取 } } else if( MENU_CTRL_TYPE_VERSION == pFunc->type ) { FuncData.nItem = u32CurrentIndex; if (pFunc->MenuSettingFun) { if( dEventID==UI_EVENT_RIGHT|| dEventID==UI_EVENT_ENTER) (pFunc->MenuSettingFun)(TRUE,/* MAIN*/ 0, &FuncData, FALSE); else (pFunc->MenuSettingFun)(FALSE,/* MAIN*/ 0, &FuncData, FALSE); } } else if(MENU_CTRL_TYPE_GROUPSTATICSTRINGS == pFunc->type) { if (pFunc->MenuSettingFun) { (pFunc->MenuSettingFun)(FALSE,/* MAIN*/ 0, &FuncData, FALSE); // Get Value from UMF } } else if(MENU_CTRL_TYPE_DAYNAMICSTRING == pFunc->type) { FuncData.nItem = u32CurrentIndex; if (pFunc->MenuSettingFun) { if((dEventID == UI_EVENT_RIGHT) || (dEventID == UI_EVENT_LEFT)) { (pFunc->MenuSettingFun)(TRUE, 0, &FuncData, FALSE); } else { (pFunc->MenuSettingFun)(FALSE, 0, &FuncData, FALSE); } } } } else { if(UI_EVENT_RIGHT == dEventID) { dRet = Enter_Behavior(); } else { GUI_FUNC_CALL(GEL_SendMsg(FocusItem_Handle, WM_PAINT, 0)); } } if(dEventID!=0) break; } return dRet;}