第一篇:Mstar_6M48學(xué)習(xí)心得之關(guān)于在已有的一個(gè)OSD Win上增加了一個(gè)Pag
關(guān)于在已有的一個(gè)OSD Win上增加了一個(gè)Page:(以在Mainmenu里增加一個(gè)test page為例)
1、MApp_Main.c里有個(gè)while(1)循環(huán);
2、通過(guò) while(1)循環(huán)MApp_MultiTasks 里面的 MApp_ProcessUserInput 可以 得到 當(dāng)前的
u8KeyCode
3、while(1)循環(huán) 里面的MApp_TopStateMachine的作用:
3.1、在剛開(kāi)機(jī)時(shí),首先 enTopState = STATE_TOP_DIGITALINPUTS 等待用戶輸入;3.2、再次調(diào)用:MApp_TopStateMachine時(shí),switch(enTopState)之后調(diào)用 switch(MApp_TV);3.3、當(dāng)用戶在IR中輸入Menu按鍵;3.4、通過(guò)MApp_TV調(diào)用MApp_TV_ProcessUserInput 之后
switch(u8KeyCode)
case KEY_MENU: enTVState = STATE_TV_INIT;enTVRetVal = EXIT_GOTO_MENU;u8KeyCode = KEY_NULL;
break;
switch(MApp_TV())case EXIT_GOTO_MENU:
enTopState = STATE_TOP_MENU;
break;3.5、再次調(diào)用:MApp_TopStateMachine時(shí),witch(enTopState)之后調(diào)用 switch(MApp_Menu_Main());3.6、通過(guò)MApp_Menu_Main調(diào)用MApp_ZUI_ACT_StartupOSD(E_OSD_MAIN_MENU);再調(diào)用MApp_ZUI_ACT_AppShowMainMenu();就可以Show出我們想要Show出的主界面了。
enMainMenuState = STATE_MENU_WAIT;_eZUIState = E_ZUI_STATE_RUNNING;3.7、再次調(diào)用MApp_Menu_Main時(shí),switch(enMainMenuState)時(shí),就要執(zhí)行:
MApp_ZUI_ProcessKey(u8KeyCode);
u8KeyCode = KEY_NULL;
MApp_ZUI_ACT_ExecuteWndAction(EN_EXE_UPDATE_SIGNAL_INFORMAT);了;
3.8、MApp_ZUI_ProcessKey調(diào)用MApp_ZUI_API_PostMessage(HWND_MAINFRAME, MSG_KEYDOWN, vk_code),Post Message。
3.9、再次調(diào)用MApp_TopStateMachine 時(shí)執(zhí)行到 MApp_ZUI_MainTask 時(shí)
switch(_eZUIState)eZUIState等于了E_ZUI_STATE_RUNNING,就會(huì)調(diào)用MApp_ZUI_API_GetMessage(&msg)收到剛才MApp_ZUI_ProcessKey發(fā)過(guò)來(lái)的Message,再通過(guò)MApp_ZUI_API_DispatchMessage(&msg);因?yàn)槲覀儎偛虐l(fā)的是key的Message所以,執(zhí)行的以下代碼: if(pMsg->message == MSG_KEYDOWN){
//printf(“[dispmsg1]n”);
if(_eZUIState == E_ZUI_STATE_RUNNING /*||
_eZUIState == E_ZUI_STATE_MSGBOX_DOMODAL*/)
{
if(!MApp_ZUI_ACT_HandleGlobalKey((VIRTUAL_KEY_CODE)pMsg->wParam))
{
focus = GETWNDFOCUS();
//printf(“/focus=%bun”,(U8)focus);
//printf(“[dispmsg2]n”);
if(HWND_INVALID!= focus)
{
pMsg->hwnd = focus;//2007/12/24: keydown message for focus
iRet = MApp_ZUI_ACT_ExecuteWndProc(GETWNDPROCID(focus), pMsg);
}
}
} #if ZUI_DBG_RECURSIVE
_bInDispatchMessage = 0;#endif //ZUI_DBG_RECURSIVE
return iRet;}
3.10、由focus = GETWNDFOCUS();得到當(dāng)前Win的Focus 3.11、MApp_ZUI_ACT_ExecuteWndProc(GETWNDPROCID(focus), pMsg)兩個(gè)參數(shù)的說(shuō)明:
GETWNDPROCID(focus),得到當(dāng)前Win的類型(有EN_ZUI_DEFAULTWINPROC、EN_ZUI_FLIPPAGE_WINPROC、EN_ZUI_EFFECT_WINPROC等類型)
pMsg:收到的消息,在本例中收到是按鍵。
3.12、執(zhí)行到S32 MApp_ZUI_ACT_ExecuteWndProc(U8 u8WinProcID, PMSG msg),根據(jù)傳過(guò)來(lái)的參數(shù),執(zhí)行:EFFECT_WINPROC(msg->hwnd, msg);直接調(diào)用:return DEFAULTWINPROC(hWnd, pMsg);3.13、轉(zhuǎn)到執(zhí)行:MApp_ZUI_API_DefaultWindowProc
本例會(huì)執(zhí)行以下語(yǔ)句:
if(GETWNDKEYEVENT(focus))
{
KEYEVENT *keyevent;
keyevent = GETWNDKEYEVENT(focus);
while(keyevent->u16VirKey!= VK_NULL)
{
if(keyevent->u16VirKey == pMsg->wParam)
{
handled = MApp_ZUI_ACT_ExecuteWndAction(keyevent->u16ExeActID);
//we can allow multiple actions...depend on the last one action..}
keyevent++;
} 對(duì)這段代碼的理解,由GETWNDKEYEVENT(focus)得到當(dāng)前focus定義的keyevent,如果有定義當(dāng)前所按鍵的事件if(keyevent->u16VirKey == pMsg->wParam)則MApp_ZUI_ACT_ExecuteWndAction(keyevent->u16ExeActID);將定義要執(zhí)行的事件ID傳過(guò)去。
For example: static KEYEVENT _ZUI_TBLSEG _MENU_PICTURE_MODE_KEY[] = { { VK_SELECT, EN_EXE_GOTO_PICTURE_MODE_PAGE}, { VK_UP, EN_EXE_NOTIFY_PARENT_KEY_UP }, { VK_DOWN, EN_EXE_NOTIFY_PARENT_KEY_DOWN }, { VK_UP, EN_EXE_EFFECT_SLIDEITEM }, { VK_DOWN, EN_EXE_EFFECT_SLIDEITEM }, { VK_LEFT , EN_EXE_EFFECT_FLIPPAGE_LEFT }, { VK_RIGHT , EN_EXE_EFFECT_FLIPPAGE_RIGHT }, { VK_NULL, 0 }, };
3.14、執(zhí)行到:MApp_ZUI_ACT_ExecuteWndAction 本例只執(zhí)行:switch(_eActiveOSD)段。當(dāng)前是E_OSD_MAIN_MENU所以執(zhí)行MApp_ZUI_ACT_ExecuteMainMenuAction(act);3.15、以按左右鍵為例:
switch(act)case EN_EXE_EFFECT_FLIPPAGE_LEFT: case EN_EXE_EFFECT_FLIPPAGE_RIGHT: {
static HWND hwndTop[] =
{
HWND_MENU_CHANNEL_PAGE,HWND_MENU_PICTURE_PAGE,HWND_MENU_SOUND_PAGE,HWND_MENU_TIME_PAGE,HWND_MENU_OPTION_PAGE,#if SHOW_LIUBO_ADD_TEST_PAGE
HWND_MENU_TEST_PAGE,#endif
#if ENABLE_ATV_VCHIP//ENABLE_DTV
HWND_MENU_LOCK_PAGE,#endif
#if(INPUT_USB_SOURCE == 0)
HWND_MENU_APP_PAGE,#endif
};
HWND hwndFocus = MApp_ZUI_API_GetFocus();
HWND hwndEffect = hwndFocus;
HWND hwndNext = HWND_INVALID;
EN_FLIPPAGE dir = EN_FLIPPAGE_NONE;/******若當(dāng)前不是第0個(gè)Index page則 要找到當(dāng)前功能的首個(gè)page 即屬性為EN_ZUI_FLIPPAGE_WINPROC的page**************/
while((hwndEffect=MApp_ZUI_API_GetParent(hwndEffect))!= HWND_MAINFRAME)
{ if(MApp_ZUI_API_GetWindowProcId(hwndEffect)== EN_ZUI_FLIPPAGE_WINPROC)
{
break;
}
} /******若當(dāng)前不是第0個(gè)Index page則 要找到當(dāng)前功能的首個(gè)page 即屬性為EN_ZUI_FLIPPAGE_WINPROC的page**************/
if(hwndEffect == HWND_MAINFRAME)
return TRUE;
U32 u32Data = MApp_ZUI_API_GetWindowData(hwndEffect);
if(u32Data == 0)
return TRUE;
U32 i;
for(i=0;i { if(hwndTop[i] == hwndEffect) break; } if(i >= COUNTOF(hwndTop)) return TRUE; if(act == EN_EXE_EFFECT_FLIPPAGE_LEFT) { if(i < 1) i = COUNTOF(hwndTop)-1; #if ENABLE_DTV else if((hwndTop[i]==HWND_MENU_APP_PAGE)&&(!IsDTVInUse())) i-=2; #endif else i--; hwndNext = hwndTop[i]; dir = EN_FLIPPAGE_LEFT; } else if(act == EN_EXE_EFFECT_FLIPPAGE_RIGHT) { if(i+1 >= COUNTOF(hwndTop)) i = 0; #if ENABLE_DTV else if((hwndTop[i]==HWND_MENU_OPTION_PAGE)&&(!IsDTVInUse())) i+=2; #endif else i++; hwndNext = hwndTop[i]; dir = EN_FLIPPAGE_RIGHT; } HWND child, last_succ;//2008/4/12: get last successor once HWND listwn = hwndNext+2; last_succ = MApp_ZUI_API_GetLastSuccessor(listwn); for(child = listwn+1;child <= last_succ;child++) { if(MApp_ZUI_API_GetParent(child)!= listwn) continue; if(MApp_ZUI_ACT_QueryDynamicListItemStatus(child)!= EN_DL_STATE_NORMAL)這個(gè)if語(yǔ)句的作用是:設(shè)置下個(gè)頁(yè)面不要顯示的win。 continue; else break; } GUI_DATA_FLIPPAGE *windata =(GUI_DATA_FLIPPAGE *)u32Data; windata->pVarData->hwndCurrent = hwndEffect; windata->pVarData->hwndNext = hwndNext;/* if(windata->pVarData->hwndNext == HWND_MENU_LOCK_PAGE) { // if focus on HWND_MENU_LOCK_PAGE, set focus on HWND_MENU_LOCK_TITLE // Press Enter to invoke input password dialog and to input password to use HWND_MENU_LOCK_PAGE's functions.child = windata->pVarData->hwndNext +1; } */ #if ENABLE_DTV if(windata->pVarData->hwndNext == HWND_MENU_LOCK_PAGE) stGenSetting.g_BlockSysSetting.u8EnterLockPage = 0; #endif if(child == last_succ) windata->pVarData->hwndNextFocus = windata->pVarData->hwndNext+3; else windata->pVarData->hwndNextFocus = child; windata->pVarData->dir = dir; //MApp_ZUI_API_PostMessage(windata->pVarData->hwndCurrent, MSG_EFFECT, 0);MApp_ZUI_API_SendMessage(windata->pVarData->hwndCurrent, MSG_EFFECT, 0); MApp_ZUI_API_InvalidateWindow(HWND_MENU_MAIN_BOTTON_INFO_BAR); return TRUE;