一、InputSource界面的显示:
1、switch(MApp_TV())
MApp_TV_ProcessUserInput();
switch(u8KeyCode)
case KEY_INPUT_SOURCE:
enTVState = STATE_TV_INIT;
enTVRetVal = EXIT_GOTO_INPUTSOURCE;
u8KeyCode = KEY_NULL;
break;
case EXIT_GOTO_INPUTSOURCE:
enTopState = STATE_TOP_INPUTSOURCE;
break;
2、switch ( enTopState )
case STATE_TOP_INPUTSOURCE:
switch(MApp_InputSource_Main())
EN_RET MApp_InputSource_Main(void)
switch(enInputSourceState)
case STATE_INPUTSOURCE_INIT:
MApp_ZUI_ACT_StartupOSD(E_OSD_INPUT_SOURCE); enInputSourceState = STATE_INPUTSOURCE_WAIT; break;
当我们按“上”、“下”键时,执行:
MApp_ZUI_ACT_ExecuteWndProc(GETWNDPROCID(focus), pMsg); 再执行:
MApp_ZUI_API_DefaultWindowProc
再执行:
MApp_ZUI_ACT_ExecuteWndAction
以按下键为例:
执行:
case EN_EXE_NOTIFY_PARENT_KEY_DOWN:
MApp_ZUI_API_PostMessage(
MApp_ZUI_API_GetParent(MApp_ZUI_API_GetFocus()), MSG_NOTIFY_KEYDOWN,
VK_DOWN);
return TRUE;
再执行:
case EN_ZUI_DYNAMICLIST_WINPROC:
return DYNAMICLIST_WINPROC(msg->hwnd, msg); 再执行:
if((windata->pVarData->hwndFirstShown<=next
&&next<= windata->pVarData->hwndLastShown)
&&MApp_ZUI_API_IsWindowVisible(next)
&&MApp_ZUI_API_IsWindowEnabled(next))
{
//shown region: trivial case: focus it
MApp_ZUI_API_SetFocus(next);
printf("[]focus=%u\n", next);
break;
}
return DEFAULTWINPROC(hWnd, pMsg);
选中Input Source的USB项,再按OK键,执行:
case EN_EXE_EXECUTE_APP_USB:
{
MApp_ZUI_ACT_InputSourceSwitch( _MApp_ZUI_ACT_GetSourceType() );
MApp_ZUI_ACT_TransitionEffectBegin(EN_EFFMODE_CLOSE, _ZUI_STATE_TERMINATE); enInputSourceState= STATE_INPUTSOURCE_GOTO_DMP;
}
return TRUE;
再执行到:
MApp_InputSource_Main
switch(enInputSourceState)
case STATE_INPUTSOURCE_GOTO_DMP:
MApp_ZUI_ACT_ShutdownOSD();
enInputSourceState = STATE_INPUTSOURCE_INIT;
enRetVal = EXIT_GOTO_DMP;
break;
再:
switch(MApp_InputSource_Main())
case EXIT_GOTO_DMP:
enTopState = STATE_TOP_DMP;
break;
执行:
MApp_DMP_Main
switch(m_enDmpVar.enDmpState)
case DMP_STATE_INIT:
srand(msAPI_Timer_GetTime0());
MApp_ZUI_ACT_StartupOSD(E_OSD_DMP);
_MApp_DMP_Switch2Dmp();
u32time = msAPI_Timer_GetTime0();
m_enDmpVar.enDmpState = DMP_STATE_CONNECTING;
u8GWinId = MApp_ZUI_API_QueryGWinID();
break;
case DMP_STATE_CONNECTING:
if(msAPI_Timer_DiffTimeFromNow(u32time) > DMP_WAITCONNECT_MS || m_enDmpVar.enDmpFlag & DMP_FLAG_DRIVE_CONNECT_OK) {
m_enDmpVar.enDmpState = DMP_STATE_UI;
}
break;
case DMP_STATE_UI:
MApp_DMP_NotifyUiState(m_enDmpVar.enDmpUiState);
m_enDmpVar.enDmpState = DMP_STATE_WAIT;
break;
我们再一直按右,执行:
switch(pMsg->wParam)
{
case VK_RIGHT:
MApp_ZUI_API_SetFocusByNav(focus, NAV_RIGHT);
break;
}
在影视选项上按OK,执行:
case EN_EXE_DMP_MEDIA_PAGE_SEL:
if(HWND_DMP_MEDIA_TYPE_MOVIE == MApp_ZUI_API_GetFocus())
{
// stop bgm
if(MApp_DMP_GetDmpFlag() & DMP_FLAG_BGM_MODE)
{
MApp_MPlayer_StopMusic();
MApp_DMP_ClearDmpFlag(DMP_FLAG_BGM_MODE);
}
MApp_MPlayer_SetCurrentMediaType(E_MPLAYER_TYPE_MOVIE, TRUE); MApp_DMP_UiStateTransition(DMP_UI_STATE_DRIVE_SELECT);
}
再执行:
case DMP_UI_STATE_DRIVE_SELECT:
{
#if (DMP_PHOTO_THUMBNAIL || DMP_MOVIE_THUMBNAIL)
_MApp_DMP_ThumbCopyRegion_Destroy();
MApp_MPlayer_LeaveThumbnailMode();
MApp_DMP_ClearDmpFlag(DMP_FLAG_THUMBNAIL_MODE);
#endif
U8 i;
for(i=0; i<NUM_OF_MAX_DRIVE; i++)
{
if(MApp_MPlayer_QueryCurrentDriveIndex()== MApp_DMP_GetDriveFromMappingTable(i))
{
MApp_DMP_SetCurDrvIdxAndCalPageIdx(i);
}
}
_MApp_ACTdmp_ShowDrivePage();
U8 u8Idx = (MApp_DMP_GetCurDrvIdx()+1) % DMP_DRIVE_NUM_PER_PAGE;
MApp_ZUI_API_SetFocus(_hwndListDriveItem[u8Idx]);
}
break;
好,现在进入了Drive选择界面。在该界面按右键,通过,Skin Tool里面定义的Navigation,跳转到了,第一个可供选择的Drive。
再在该界面按OK键,执行:
MApp_DMP_UiStateTransition(DMP_UI_STATE_FILE_SELECT);
再调用:MApp_DMP_NotifyUiState
就可以显示出文件列表页面了。
视频的播放流程,待续。
第二篇:Mstar_6M48学习心得之关于屏保
在需要进入屏保的地方调用:
MApp_ZUI_ACT_StartupOSD(E_OSD_SCREEN_SAVER);
调用:
MApp_ZUI_ACT_AppShowScreenSaver();
通过:
for (wnd = 0; wnd < HWND_MAX; wnd++)
{
//printf("create msg: %lu\n", (U32)wnd);
MApp_ZUI_API_SendMessage(wnd, MSG_CREATE, 0);
}
再执行到:
iRet = MApp_ZUI_ACT_ExecuteWndProc(GETWNDPROCID(pMsg->hwnd), pMsg);
在判断:
g_GUI_WindowList[hwnd].u8WinProcID
时,有个Win的ProcID为EN_ZUI_SCREENSAVER_WINPROC
于是执行:
SCREENSAVER_WINPROC(msg->hwnd, msg);
此时msg的type为Create
执行的函数为:
case MSG_CREATE:
{
if(hwnd == HWND_SCREEN_SAVER_FRAME) 这句话的意思是定义要显示的Page {
U16 x, y;
//MApi_GOP_GWIN_Enable(MApp_ZUI_API_QueryGWinID(), FALSE); //hide it first! srand(msAPI_Timer_GetTime0());
{
x = UI_OSD_PANE_W/2;
y = UI_OSD_PANE_H/2;
}
_ss_move_x_positive_main = 1;
_ss_move_y_positive_main = 1;
if ((rand()%2) == 0)
_ss_move_x_positive_main = 0;
if ((rand()%2) == 0)
_ss_move_y_positive_main = 0;
main_rect.left = x;
main_rect.top = y;
main_rect.width = SCREEN_SAVER_FRAME_WIDTH;
main_rect.height = SCREEN_SAVER_FRAME_HEIGHT;
MApp_ZUI_API_MoveAllSuccessors(hwnd, main_rect.left, main_rect.top);
MApp_ZUI_API_SetTimer(hwnd, 0, SCREEN_SAVER_MOVE_INTERVAL); }
}
break;
至此,已经显示出第一幅画面,并已经通过:
MApp_ZUI_API_SetTimer(hwnd, 0, SCREEN_SAVER_MOVE_INTERVAL);
发送了Timer,就可以每隔SCREEN_SAVER_MOVE_INTERVAL这么多微秒更换一个画面了。