展讯平台窗口创建流程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
窗口创建流程简介
窗口在展讯平台中是一个至关重要的概念,与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};