当前位置:文档之家› 展讯平台窗口创建流程

展讯平台窗口创建流程

窗口创建流程简介窗口在展讯平台中是一个至关重要的概念,与Windows操作系统相类似的,窗口在展讯平台中就是最终呈现给用户的一个应用程序。

在这里,我们可以把窗口看作一个应用程序,因为,它不但能够显示内容给用户,而且更为重要的是,窗口能够处理系统中所有的内部消息及发送到该窗口的外部消息。

一个应用程序是由一个或多个窗口构成的,例如Idle窗口只包含一个窗口,而短消息模块包含多个窗口。

应用程序都是通过窗口显示给用户,并最终实现人机交互。

下面我们来看下展讯平台的窗口创建流程。

图1动态窗口创建流程图2 静态窗口创建流程窗口分为静态窗口和动态窗口,静态窗口会在宏WINDOW_TABLE中先定义好窗口的属性,而动态窗口是在实现时动态创建窗口属性。

具体如何选择,根据应用的需要来选择。

展讯平台为用户提供了创建静态窗口和动态窗口的接口,分别为函数MMK_CreateWin和函数MMK_CreateWindow,具体如何创建窗口,可以参考展讯文档,这里主要讲述调用创建窗口接口后的流程。

通过上面两个流程图,我们可以看到静态窗口和动态窗口的创建会调用几个相同的函数MMK_AddTreeNode、TreeNodeNew和MMK_WindowTreeNodeConstruct。

这三个函数是为了创建窗口节点,窗口是通过树来管理的,如下图:图3 窗口管理展讯平台里退出当前窗口时,系统会执行注销当前窗口的操作,用树管理窗口的好处就是这时候系统会自动进入父窗口,从而达到用户希望的效果。

创建完窗口节点后,会创建窗口的一些基本属性,如背景、显示区域等,这个时候我们看不到其它的属性,如状态栏、菜单、编辑框等等。

静态窗口和动态窗口在这之后就会出现一些区别,静态窗口会在后面继续创建窗口其它的属性,这些属性在先前宏WINDOW_TABLE中已经定义好的,比如状态栏、标题栏、菜单栏、soft控件等。

这些属性的创建是在以下函数中进行的。

PUBLIC BOOLEAN MMK_ParseWinTab(MMI_HANDLE_T win_handle,uint32 *win_tab_ptr){…value_ptr = win_tab_ptr;while ((END_WIN != *value_ptr) && (CAF_END_WIN != *value_ptr)){ins = *value_ptr;value_ptr++;if ((FIRST_PARSE <= ins) && (END_WIN > ins)){result = MMKParseFunc[ins - FIRST_PARSE](win_handle,&value_ptr);//调用函数表中的函数来创建窗口的其它属性}else if ((CHILD_CTRL_FIRST <= ins) && (LAST_CHILD > ins)){result = GUIFORM_ParseChild((ins - CHILD_CTRL_FIRST),win_handle,&value_ptr);}else if ((CAF_PARSEWIN_FIRST <= ins) && (CAF_PARSEWIN_MAX > ins)){result = CAFParseFunc[ins - CAF_PARSEWIN_FIRST](win_handle,&value_ptr);}else{SCI_ASSERT(FALSE); /*assert verified*/ }if (!result){break;}}return (result);}LOCAL const PARSE_FUNC MMKParseFunc[] ={SetWinPrio,SetWinFunc,SetWinId,CreateMenuCtrl,CreatePopmenuCtrl,CreateMsgBoxCtrl,CreatePrgBoxCtrl,CreateTextCtrl,CreateListBoxCtrl,CreateEditTextCtrl,CreateEditPhonenumCtrl,CreateEditDigitalCtrl,CreateEditPasswordCtrl,CreateEditListCtrl,CreateEditDateCtrl,CreateEditTimeCtrl,CreateEditIPCtrl,CreateAnimCtrl,SetWinBackgroundID,CreateLabelCtrl,CreateButtonCtrl,SetWinStyle,CreateDropDownListCtrl,CreateIconListCtrl,CreateRichTextCtrl,CreateTabCtrl,CreateStatusBarCtrl,CreateSoftkeyCtrl,CreateTitleCtrl,SetWinMoveStyle,CreateTipsCtrl,CreateSettingList,CreateFormCtrl,CreateOwnDrawCtrl,CreateToolbarCtrl,SetWinSupportAngle,};而动态窗口在创建完基本的属性后,需要手动创建窗口的其它属性。

如以下代码:LOCAL void OpenFileListMainWin(BOOLEAN is_internal_call){if(!MMK_IsOpenWin(MMIFMM_OPEN_FILE_BYLAYER_WIN_ID)){MMI_WINDOW_CREATE_T win_create = {0};MMI_HANDLE_T win_handle = 0;MMI_CONTROL_CREATE_T create = {0};GUILIST_INIT_DATA_T init_data = {0};win_create.applet_handle = MMK_GetFirstAppletHandle();win_create.win_id = MMIFMM_OPEN_FILE_BYLAYER_WIN_ID;win_create.win_priority = WIN_ONE_LEVEL;win_create.add_data_ptr = (ADD_DATA)(is_internal_call);win_create.window_style = 0;win_create.window_move_style = MOVE_BY_SETTING;if (NULL == s_handle_func){win_create.func = MMIFMM_HandleOpenFileByLayerWin;}else{win_create.func = s_handle_func;}win_handle = MMK_CreateWindow( &win_create );//创建动态窗口//create softkeyif (0 != win_handle){GUISOFTKEY_INIT_DATA_T softkey_data = {0};MMI_CONTROL_CREATE_T softkey_create = {0};MMI_CTRL_ID_T softkey_ctrl_id = 0;softkey_data.leftsoft_id = STXT_OK;softkey_data.midsoft_id = TXT_NULL;softkey_data.rightsoft_id = STXT_RETURN;softkey_ctrl_id = MMITHEME_GetSoftkeyCtrlId();softkey_create.ctrl_id = softkey_ctrl_id;softkey_create.guid = SPRD_GUI_SOFTKEY_ID;softkey_create.parent_win_handle = win_handle;softkey_create.init_data_ptr = &softkey_data;MMK_CreateControl( &softkey_create );//创建soft控件MMK_SetWinSoftkeyCtrlId(win_handle, softkey_ctrl_id);}//create titleif (0 != win_handle){GUIWIN_CreateTitleDyna(win_handle, TXT_FMM_FILE_LIST);//创建标题栏}//create listif( 0 != win_handle ){init_data.both_rect = MMITHEME_GetWinClientBothRect(win_handle);//init_data.both_rect.h_rect = init_data.both_rect.v_rect = list_rect;init_data.type = GUILIST_TEXTLIST_E;init_data.is_dynamic_item_data = TRUE;create.ctrl_id = MMIFMM_OPEN_FILE_BYLAYER_LIST_CTRL_ID;create.guid = SPRD_GUI_LIST_ID;create.parent_win_handle = win_handle;create.init_data_ptr = &init_data;MMK_CreateControl( &create );//创建列表}}}当创建完窗口后就会通过发送同步消息来打开窗口,如下:MMK_SendMsg(win_node_ptr->base_node.handle, MSG_OPEN_WINDOW, PNULL);。

相关主题