资源描述
窗口创建流程简介
窗口在展讯平台中是一个至关重要的概念,与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 softkey
if (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 title
if (0 != win_handle)
{
GUIWIN_CreateTitleDyna(win_handle, TXT_FMM_FILE_LIST);//创建标题栏
}
//create list
if( 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);
展开阅读全文