




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
mtk平台mmi培训资料(中文)2008-06-0621:48本文详细说明了如何建设一个自定义列表窗体模板。原理部分请参见《MTK平台(1)——如何添加一个窗体模板》。
最终实现的是一个字典输入界面。布局为:该模板不包含业务逻辑,仅提供页面显示和InputBox框输入事件后的ListBox的Redraw事件的注册,以及基本的输入法设置、清空后的返回函数。
一、添加用户自定义列表模板的过程
(一)在g_categories_controls_map[]中加入:
,{MMI_CATEGORY_CUSTOM_LIST,(U8*)custom_define_list,(s16*)coordinate_custom_list,NULL}constU8custom_define_list[]=
{
5,
DM_BASE_LAYER_START,
DM_SCR_BG,
DM_BASE_CONTROL_SET1,
DM_SINGLELINE_INPUTBOX1,
DM_LIST1
};constS16coordinate_custom_list[]=
{
DM_FULL_SCREEN_COORDINATE_FLAG,
DM_CUSTOM_DEFINE_INPUTBOX,
//需要定义
DM_CUSTOM_DEFINE_LIST
//需要定义
};(二)在dm_get_coordinates()函数中加入:
//设定列表位置和大小(不要忘记全局变量MMI_custom_Listbox_x等的定义)
elseif(*UICtrlAccessPtr_p==DM_CUSTOM_DEFINE_LIST)
{
dm_coordinate_info->s16X=MMI_custom_Listbox_x;
dm_coordinate_info->s16Y=MMI_custom_Listbox_y;
dm_coordinate_info->s16Width=MMI_custom_Listbox_width;
dm_coordinate_info->s16Height=MMI_custom_Listbox_height;
dm_coordinate_info->Flags=DM_NO_FLAGS;
UICtrlAccessPtr_p++;
}
//设定输入框位置和大小
elseif(*UICtrlAccessPtr_p==DM_CUSTOM_DEFINE_INPUTBOX)
{
dm_coordinate_info->s16X=MMI_custom_inputbox_x;
dm_coordinate_info->s16Y=MMI_custom_inputbox_y;
dm_coordinate_info->s16Width=MMI_custom_inputbox_width;
dm_coordinate_info->s16Height=MMI_custom_inputbox_height;
dm_coordinate_info->Flags=DM_SINGLE_LINE_INPUTBOX_SPECIFIC_HEIGHT;
UICtrlAccessPtr_p++;
}
(三)在Wgui_category.c中定义模板显示函数
voidShowCategoryCustomListScreen(
U8*title,
U16title_icon,
U16left_softkey,
U16left_softkey_icon,
U16right_softkey,
U16right_softkey_icon,
S32number_of_items,
U8**list_of_items,
U16*list_of_icons,
S32flags,
S32highlighted_item,
U8*history_buffer)
{
/*----------------------------------------------------------------*/
/*LocalVariables
*/
/*----------------------------------------------------------------*/
dm_data_structdm_data;
S32i;
U8h_flag;
/*----------------------------------------------------------------*/
/*CodeBody
*/
/*----------------------------------------------------------------*/
gdi_layer_lock_frame_buffer();
SetupCategoryKeyHandlers();
MMI_title_string=(UI_string_type)title;
MMI_title_icon=(PU8)get_image(title_icon);
change_left_softkey(left_softkey,left_softkey_icon);
change_right_softkey(right_softkey,right_softkey_icon);//CreateList
create_fixed_icontext_menuitems();
associate_fixed_icontext_list();
ShowListCategoryScreen(
(UI_string_type)title,
get_image(title_icon),
get_string(left_softkey),
get_image(left_softkey_icon),
get_string(right_softkey),
get_image(right_softkey_icon),
number_of_items);
for(i=0;i<number_of_items;i++)
{
add_fixed_icontext_item((UI_string_type)list_of_items[i],wgui_get_list_menu_icon(i,list_of_icons[i]));
}
h_flag=set_list_menu_category_history(MMI_CATEGORY_CUSTOM_LIST,history_buffer);
if(h_flag)
{
fixed_list_goto_item_no_redraw(MMI_fixed_list_menu.highlighted_item);
}
else
{
fixed_list_goto_item_no_redraw(highlighted_item);
}
//CreateInputbox
memset(custom_single_input_buffer,0,100);
pfnUnicodeStrcpy(custom_single_input_buffer,L"CustomCategory");
wgui_setup_singleline_inputbox(
0,
0,
240,
320,
custom_single_input_buffer,
pfnUnicodeStrlen(custom_single_input_buffer),
MMI_CATEGORY_CUSTOM_LIST,
get_string(right_softkey),
get_image(right_softkey_icon),
INPUT_TYPE_ALPHANUMERIC_LOWERCASE|INPUT_TYPE_USE_ONLY_ENGLISH_MODES,
history_buffer,
0);
register_hide_multitap(wgui_hide_multitap);
gdi_layer_unlock_frame_buffer();
ExitCategoryFunction=ExitCategoryCustomListScreen;
dm_setup_category_functions(dm_redraw_category_screen,dm_get_category_history,dm_get_category_history_size);
dm_data.s32ScrId=(S32)GetActiveScreenId();
dm_data.s32CatId=MMI_CATEGORY_CUSTOM_LIST;
//不要忘记该常量MMI_CATEGORY_CUSTOM_LIST的定义
dm_data.s32flags|=DM_CLEAR_SCREEN_BACKGROUND;
//dm_data.s32flags|=DM_SHOW_VKPAD;
dm_register_vkpad_callback(CustomList_virtual_keypad_callback);
dm_setup_data(&dm_data);
dm_redraw_category_screen();
}
/*endofShowCategory353Screen*/voidCustomList_virtual_keypad_callback(void)
{
#ifdefined(__MMI_TOUCH_SCREEN__)
mmi_pen_editor_clear_and_show_virtual_keyboard_area();
#endif
gui_show_transparent_image(0,200,GetImage(IMG_H_SELECT_LEFT),0);
}
voidExitCategoryCustomListScreen()
{
wgui_close_singleline_inputbox();
}(四)在singleline_inputbox_multitap_input()函数中添加用户处理key_0~key_9的按键事件的函数:
void(*singleline_inputbox_custom_input_callback)(void)=UI_dummy_function;
voidsingleline_inputbox_multitap_input(UI_character_typec)
{
/*----------------------------------------------------------------*/
/*LocalVariables
*/
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/*CodeBody
*/
/*----------------------------------------------------------------*/
if(MMI_singleline_inputbox.flags&UI_SINGLE_LINE_INPUT_BOX_PLUS_CHARACTER_HANDLING)
{
if((MMI_singleline_inputbox.text[0]=='+')&&
(MMI_singleline_inputbox.current_text_p==MMI_singleline_inputbox.text)&&
(MMI_singleline_inputbox.text_length>=(MMI_singleline_inputbox.available_length-ENCODING_LENGTH)))
{
return;
}
}
gui_single_line_input_box_insert_multitap_character(&MMI_singleline_inputbox,c);
redraw_singleline_inputbox();
singleline_inputbox_input_callback();
singleline_inputbox_custom_input_callback();
}
(五)Wgui_Category.c中添加用户事件定义接口
//右键事件注册
voidSetCategoryCustomListRightSoftkeyFunction(void(*f)(void))
{
wgui_singleline_inputbox_RSK_function=f;
}//key_0到key_9按下时的事件注册
externvoid(*singleline_inputbox_custom_input_callback)(void);
voidSetCategoryCustomListNumKeyFunction(void(*f)(void))
{
singleline_inputbox_custom_input_callback=f;
}//设置InputBox大小
voidSetCustomList_Inputbox_Size(S32p_x,S32p_y,S32p_width,S32p_height)
{
MMI_custom_inputbox_x=p_x;
MMI_custom_inputbox_y=p_y;
MMI_custom_inputbox_width=p_width;
MMI_custom_inputbox_height=p_height;
}
//设置ListBox大小
voidSetCustomList_Listbox_Size(S32p_x,S32p_y,S32p_width,S32p_height)
{
MMI_custom_Listbox_x=p_x;
MMI_custom_Listbox_y=p_y;
MMI_custom_Listbox_width=p_width;
MMI_custom_Listbox_height=p_height;
}
二、自定义列表模板的使用方法1、调用SetCustomList_Inputbox_Size和SetCustomList_Listbox_Size设置列表框和输入框的大小。
2、调用显示窗体的接口ShowCategoryCustomListScreen。
3、调用右键事件注册函数,注册文本框被清空后的事件(如返回等)SetCategoryCustomListRightSoftkeyFunction。
4、调用key_0至key_9的事件注册函数,SetCategoryCustomListNumKeyFunction()。
三、参数详细说明
①voidSetCustomList_Inputbox_Size(S32p_x,S32p_y,S32p_width,S32p_height)与
voidSetCustomList_Listbox_Size(S32p_x,S32p_y,S32p_width,S32p_height)
p_x,p_y:起始位置
p_width,p_height:大小。
②voidSetCategoryCustomListRightSoftkeyFunction(void(*f)(void))
voidSetCategoryCustomListNumKeyFunction(void(*f)(void))
f(void):函数地址。
③voidShowCategoryCustomListScreen(
U8*title,
//标题文本指针
U16title_icon,
//标题图标ID
U16left_softkey,
//左键文本ID
U16left_softkey_icon,
//左键图标ID
U16right_softkey,
//右键文本ID
U16right_softkey_icon,
//右键图标ID
U8*custom_single_input_buffer,//Input输入Buffer
S32number_of_items,
//列表条目数
U8**list_of_items,
//列表项文本指针数组
U16*list_of_icons,
//列表项Icon
S32highlighted_item,
//当前高亮显示的列表条目
U8*history_buffer)
//历史记录Buffer
附:所需更改的文件
wgui.c
wgui_categories.c
wgui_draw_manager.c
wgui_inputs.c
wgui.h
wgui_categories_defs.h
wgui_draw_manager.h
CustCoordinate.c
一、什么是History管理
对于我们上层用户而言,经常接触到的History管理是这样的:
voidEntryFunc()
{
U8*guiBuffer;
EntryNewScreen(Screen_ID,Exit_Func,Entry_Func,NULL);
guiBuffer=GetCurrGuiBuffer(SCR_ID_WORDMAIN_LIST);
ShowCategroyXXScreen(Title_ID,…,guiBuffer);
}
但是,无论是EntryNewScreen的调用,还是guiBuffer的传入,我们都很少考虑过对这些指针和函数在GUI的管理起到了什么样的作用。下面我们就要了解,以上的代码与History管理之间存在的关系。
在MTK环境中,每当我们进入一个窗口,系统将先提取前一个窗口需保留的数据。这些数据包括:
1.
窗口ID;
2.
进入窗口时调用的函数和退出调用的函数--Exit_Func和Entry_Func;
3.
组成窗体的控件的属性(如,列表控件当前高亮显示的条目、当前屏的首末条目等)。举例说明这些数据在实际中是如何被使用的。
假设存在AB两个窗口,A窗口需要保留的数据为data_A。我们先从A窗口进入到B窗口。data_A将在B窗口调用EntryNewScreen()的时候,被压入一个结构类似于栈的数据存储区域;当从B调用GoBackHistory()返回A时,data_A从栈顶被弹出,然后A利用data_A将自身还原到其进入B之前的状态。
这就是History管理的作用。简言之,就是要保持窗口的外观状态。
二、History管理的机制
现在,我们来了解一下前面所说的data_A的数据结构是什么样的。
typedefstruct_history
{
U16scrnID;
//(1)ScreenID(窗口号)
FuncPtrentryFuncPtr;
//(2)EntryNewScreen时要进入的Entry_Func
U8inputBuffer[MAX_INPUT_BUFFER];
//(3)没遇到过其使用,都是NULL。
U8guiBuffer[MAX_GUI_BUFFER];
//(4)窗体中控件的一些需保存的信息的Buffer,通常//在使用时被转化成各控件自定义的结构体如:list_menu_category_history。
}history;
而存放data_A的类似于堆栈的数据区则以全局变量的形式定义在系统中:
historyNodehistoryData[MAX_HISTORY];(MAX_HISTORY=50):设当前窗口A所对应的数据是historyData[EntryScreenNum–1],那么它是何时、是如何被赋值的?又是何时、如何被使用的?
经过跟踪调试,我们已经知道,在由窗口A进入到窗口B(调用EntryNewScreen)的时候,我们将data_A记录到了historyNode的结构体变量中。但是,在EntryNewScreen的时候传入的,却是data_B,data_A是如何被记录和使用的呢?我们摘选EntryNewScreen的子函数中所包含的较核心的代码来说明这个问题。这三段代码是按照现在的排放顺序来执行的。
第一段(historyh可理解为data_A):
h.scrnID=scrnID;
//scrnID=currExitScrnID
h.entryFuncPtr=entryFuncPtr;//entryFuncPtr=currEntryFuncPtr
pfnUnicodeStrcpy((S8*)h.inputBuffer,(S8*)&nHistory);
//nHistory=NULL;
GetCategoryHistory(h.guiBuffer);
//GetCategoryHistory是指向获取//guiBuffer的函数的指针
AddHistory(h);
//数据入栈
第二段:
if(currExitFuncPtr)
{
//…
(*currExitFuncPtr)();
//执行Exit_Func
}
第三段(记录Screen_ID,Exit_Func和EntryFunc):
currExitScrnID=scrnID;
currExitFuncPtr=exitFuncPtr;
currEntryFuncPtr=entryFuncPtr;
这样,我们就可以看出,EntryNewScreen函数先将上次执行EntryNewScreen时所记录的currExitScrnID,currEntryFuncPtr以history结构为载体记录入栈;然后执行了记录中的currExitFuncPtr;最后将本窗口的scrnID、exitFuncPtr、entryFuncPtr分别记录入全局变量currExitScrnID、currExitFuncPtr和currEntryFuncPtr,留待下次调用EntryNewScreen时使用。下面有数据出入栈流程,有兴趣的话可以跟踪一下。以先后顺序代表包含关系,如下:
1.入栈(EntryNewScreen):
(1)U8EntryNewScreen(U16newscrnID,FuncPtrnewExitHandler,FuncPtrnewEntryHandler,void*peerBuf)
(2)staticvoidExecuteCurrExitHandler(void);
(3)voidExecuteCurrExitHandler_Ext(void);
(4)voidGenericExitScreen(U16scrnID,FuncPtrentryFuncPtr);
(5)voidAddHistoryReference(history*addHistory);//处理historyData
(6)S16increment();
//更改栈指针
2.出栈(GoBackHistory):
(1)voidGoBackHistory(void);
(2)staticvoidExecutePopHistory(void);
//处理historyData
(3)staticU8decrement(void);
//更改栈指针现在我们已经知道了history的三个结构体成员是如何记录的了,最后来重点看一下history.guiBuffer是如何被记录和使用的。
三、GUIBuffer对控件属性的记录
由上2节我们知道,guiBuffer是窗体中某些控件的需保存的属性的Buffer,通常在使用时被转化成各控件自定义的结构体。如:list_menu_category_history。
现在有几个问题需要我们解答:
1.
guiBuffer指向的Buffer是如何被分配的?该块数据是动态的还是静态的?
2.
这块Buffer是何时被写入数据的?
3.
如何释放(动态分配时)或清空(固定地址时)该块Buffer?让我们逐一解答上面的三个问题,以清晰我们对guiBuffer的认识。
1.
答:在voidAddHistoryReference(history*addHistory)中,调用OslMalloc(MAX_GUI_BUFFER)动态申请了一块内存,用来保存在GenericExitScreen中获取的history.guiBuffer。[参见出入栈流程]2.
如何释放(动态分配时)或清空(固定地址时)该块Buffer?
答:在staticvoiddecrement(void)函数中,该buffer被释放:OslMfree(historyData[currHistoryIndex].guiBuffer);。[参见出入栈流程]3.
答:只要一个窗体模板有需要保存状态的控件,它们都调用了这个函数——dm_setup_category_functions()。函数定义如下:
voiddm_setup_category_functions(
FuncPtrredraw_function,
U8*(*get_history_function)(U8*buffer),
S32(*get_history_size_function)(void)
)
{
//指向窗体重画函数的函数指针
RedrawCategoryFunction=redraw_function;
//指向获取窗体guiBuffer的函数指针
GetCategoryHistory=get_history_function;
//指向获取窗体guiBuffer大小的函数指针
GetCategoryHistorySize=get_history_size_function;
}
在只有一个控件的状态需要保存的窗体中,会这样传参给这个函数:
dm_setup_category_functions(dm_redraw_category_screen,dm_get_category_history,dm_get_category_history_size);
GenericExitScreen()函数中,将使用GetCategoryHistory()获取某个控件的GuiBuffer[参见出入栈流程]。如果按照上面的设置,GetCategoryHistory指向了
dm_get_category_history这个函数。看看这个函数做了什么:
control_set_ptr=dm_search_control_set((U16)p_dm_data->s32CatId,&coordinate_set_p);//获取窗体模板内的控件类型数组control_set_ptr
u8NoOfUICtrls=control_set_ptr[0];//获取数组内变量个数,即控件的个数
/*根据控件类型,获取控件的guiBuffer.值得注意的是,1.这里的histroy_Buffer的名称起的不好,应该起名为guiBuffer,不应混淆视听;2.最终history_buffer将指向模板中定义的最后一个控件的guiBuffer*/
for(u8CtrlCt=1;u8CtrlCt<=u8NoOfUICtrls;u8CtrlCt++)
{
switch(control_set_ptr[u8CtrlCt])
{
caseDM_CIRCULAR_MENU1:
{
get_circular_menu_category_history((U16)p_dm_data->s32CatId,history_buffer);
break;
}
caseDM_LIST1:
{
get_list_menu_category_history((U16)p_dm_data->s32CatId,history_buffer);
break;
}
caseDM_DYNAMIC_LIST1:
{
get_list_menu_category_history((U16)p_dm_data->s32CatId,history_buffer);
break;
}
caseDM_ASYNCDYNAMIC_LIST1:
{
get_list_menu_category_history((U16)p_dm_data->s32CatId,history_buffer);
break;
}
//...
}
//...
}
而在模版显示函数(ShowCategroyXXScreen)中,则根据guibuffer的情况设置控件的属性。如果guibuffer不为空,则说明该模板的显示函数是在GoBackHistory()的时候被调用的,而不是进入新窗口时被调用的。那么控件必然有一些保留的属性需要被还原。以6号窗口的List为例。在ShowCategory6Screen()中,调用下面的函数来恢复List设置:
h_flag=set_list_menu_category_history(MMI_CATEGORY6_ID,history_buffer);
这样guiBuffer的Get和Set就统一起来了。现在,我们已经知道了guiBuffer所起到的作用。但是,如果一个窗体模板内有两个或两个以上需要记录状态的控件,又该怎么办呢?
ps:该死的字数限制,只能把剩下的放到《MTK平台(3)——History管理[下]》了。四、灵活使用guiBuffer在我们自己设计窗体模板时,经常会出现一个窗体中有多个控件的情况。但是,如果一个窗体中有两个控件、却依然调用dm_get_category_history()获取控件的GuiBuffer的话,就会出现问题。比如,我们在制作CustomList窗体时,初期使用了这样的代码:
(1)模板中的组件设置:
constU8custom_define_list[]=
{
5,
DM_BASE_LAYER_START,
DM_SCR_BG,
DM_BASE_CONTROL_SET1,
DM_SINGLELINE_INPUTBOX1,
//单行输入控件
DM_LIST1
//列表控件
};
(2)窗体显示函数ShowCategoryCustomListScreen部分源码:
voidShowCategoryCustomListScreen(...,U8*guiBuffer)
{
//...
//根据MMI_CATEGORY_CUSTOM_LIST的guiBuffer,为全局结构体变量//MMI_fixed_list_menu赋值.
h_flag=set_list_menu_category_history(MMI_CATEGORY_CUSTOM_LIST,guiBuffer);
//而后利用MMI_fixed_list_menu,设置list的属性
if(h_flag)
{
fixed_list_goto_item_no_redraw(MMI_fixed_list_menu.highlighted_item);
}
else
{
fixed_list_goto_item_no_redraw(highlighted_item);
}
//...
//再设置单行输入框的属性
wgui_setup_singleline_inputbox(
0,
0,
240,
320,
custom_single_input_buffer,
50,
MMI_CATEGORY_CUSTOM_LIST,
get_string(right_softkey),
get_image(right_softkey_icon),
INPUT_TYPE_ALPHANUMERIC_LOWERCASE|INPUT_TYPE_USE_ONLY_ENGLISH_MODES,
guiBuffer,
0);//其中wgui_setup_singleline_inputbox函数中调用了//set_singleline_inputbox_category_history()来解析guiBuffer
//...
dm_setup_category_functions(dm_redraw_category_screen,dm_get_category_history,dm_get_category_history_size);
//...
}
继续使用前3节的假设。窗口A使用了CustomList窗体模板。从A进入到B时,EntryNewScreen函数调用了我们设置的获取guiBuffer函数dm_get_category_history,它先保存了A中InputBox的属性,再保存A中List的属性——此时它将把输入框的属性覆盖掉。当从B窗口返回到A窗口时,ShowCategoryCustomListScreen()函数先把history_buffer传给了set_list_menu_category_history,由于guiBuffer中存储的是List的数据,因此在交付fixed_list_goto_item_no_redraw进行设置属性的时候,不会出现问题。但wgui_setup_singleline_inputbox()就会因为guiBuffer中存储的不是输入框存储的数据而出现错误。
因此,权宜之计是,将更改传给wgui_setup_singleline_inputbox的入参:
wgui_setup_singleline_inputbox(
0,
0,
240,
320,
custom_single_input_buffer,
50,
MMI_CATEGORY_CUSTOM_LIST,
get_string(right_softkey),
get_image(right_softkey_icon),
INPUT_TYPE_ALPHANUMERIC_LOWERCASE|INPUT_TYPE_USE_ONLY_ENGLISH_MODES,
NULL,
0);
这样,虽然死机bug避免了,但是特定情况下InputBox需要保存的属性,将全部丢失掉.因此,更加合适的做法是,提取dm_setup_category_functions()中使用的函数接口:
get_singleline_inputbox_category_history
get_list_menu_category_history
这样可以分别获取inputbox和list的属性,然后将得到的两个属性的数据连续存放在一块动态分配的Buffer中.如200号窗口的GetCategroyHistory函数所示:
U8*GetCategory200History(U8*history_buffer)
{
S32s;
get_list_menu_category_history(MMI_CATEGORY200_ID,history_buffer);
s=sizeof(list_menu_category_history);
s=(s+3)/4;
s*=4;
get_singleline_inputbox_category_history(MMI_CATEGORY200_ID,(U8*)(history_buffer+s),MMI_current_input_type);
return(history_buffer);
}
要注意的问题是,系统为guiBuffer分配空间时,依据的是MAX_GUI_BUFFER,而不是dm_setup_category_functions()所指定的获取guiBuffer大小的函数GetCategoryHistorySize.而且系统中从未使用过该函数指针所指向的函数。奇怪的是——所有窗体模板的制作者都兢兢业业地制作了这个获取guiBuffer大小的函数。在200号窗口里,获取guiBuffer大小的函数如下:
S32GetCategory200HistorySize(void)
{
return(((sizeof(list_menu_category_history)+3)/4)*4+sizeof(singleline_inputbox_category_history));
}
如果怕出错且不怕麻烦的话,也可以未雨绸缪的写一个这样的函数,但恐怕多半是用不上的。
最后的任务就是在显示窗体时分别获取各控件的guiBuffer,然后将这些GUI_Buffer分别传给各个控件的Set函数.
仍然参看200号窗体的代码实现:
h_flag=set_list_menu_category_history(MMI_CATEGORY200_ID,history_buffer);
//第一个控件的Gui_Buffer
if(h_flag)
{
S32s=sizeof(list_menu_category_history);
s=(s+3)/4;
s*=4;
dynamic_list_goto_item_no_redraw(MMI_fixed_list_menu.highlighted_item);
wgui_setup_singleline_inputbox(
input_box_x,
(input_box_y),
input_box_width,
search_box_height,
buffer,
buffer_max_length,
MMI_CATEGORY200_ID,
get_string(right_softkey),
get_image(right_softkey_icon),
INPUT_TYPE_MMI_MULTITAP_BPMF,
(U8*)(history_buffer+s),
//第二个控件的GUI_Buffer起始
1);
五、小结经过这些研究和借鉴.我们在窗体开发工作中所需的技术点已经逐步趋于完善了。后期开发工作中,可能还有一些GUI相关的探索工作需要进行。据现在的情况来看,主要有两方面:
1.inline控件及57号窗体的进一步研究。
必要性很明显。现在使用中的NumberTune就很有必要嵌入到这个57号模板中。对于Inline控件的管理方式的研究是这个工作的前提。
2.touchpanel的相关研究。
主要看控件的touchpanel编译开关内的代码实现。将有助于平台移植。
3.现有控件的进一步熟悉。
如果有可利用的现有控件的话,尽量避免移植自己的控件上来。这对于系统的稳定和GUI的移植都不利。附1:其他HistoryInfo结构体
typedefstruct_history
{
U16scrnID;
FuncPtrentryFuncPtr;
U8inputBuffer[MAX_INPUT_BUFFER];
U8guiBuffer[MAX_GUI_BUFFER];
}history;typedefstruct_historyCallback
{
U16scrnID;
HistoryDelCBPtrhistorydelCBPtr;
}historyCallback;附2:函数接口
(1)voidAddHistory(historyaddHistory);
//添加历史记录节点
(2)voidGoBackHistory(void);
//删除历史记录堆栈顶端节点,并执行EntryFunction(EntryNewScreen指定的函数)
(3)voidDeleteNHistory(U16DeleteCount);
//删除N个节点
(4)U8GetHistory(U16ScreenID,history*ptrHistory);
//通过窗口号获取历史记录数据
(5)U8GoBackToHistory(U16ScreenID);
//返回到指定的窗口号
(6)voidGoBacknHistory(U16nCount);
//删除nCount个历史记录节点,并执行第nCount+1个EntryFunction
(7)U8*GetCurrGuiBuffer(U16ScreenID);
//按窗口号获取指定的Gui_Buffer
(8)U8*GetCurrInputBuffer(U16ScreenID);
//按窗口号获取指定的Input_Buffer
(9)voidExecutecurrHisIndEntryFunc(void);
//获取当前在栈顶的历史记录节点的EntryFunction.
(10)U8GoBeyondMarkerScr(U16ScreenID);
//删除从当前窗口号到指定窗口号之间的一切历史记录节点,并执行最近的EntryFuntion
(11)U8DeleteUptoScrID(U16ScreenID);
//删除从当前窗口号到指定窗口号之间的一切历史记录节点,但不执行EntryFuntion
模块三知识能力试题答案一、名词解释1、饭店人员培训一个有用的饭店培训可以理解为一个系统过程。在这个过程中企业的人力资源通过指导和实践活动获得知识、培养技能、改变态度、增进能力,从而提高企业整体的绩效。2、培训需求分析需求分析就是通过对酒店及其成员的现有状况与理想工作状况的差距进行分析,来确定是否需要培训以及培训的内容的系统方法。需求分析具有很强的指导性,它既是确定培训目标、设计培训计划的前提,也是进行培训评估的基础。3、交叉培训又称工作轮换,指让受训人有计划地从一个岗位换到另一个岗位,以使员工熟悉不同部门或岗位的业务,具备多项专业技能。4、TSFC四步培训法具有科学性的“TSFC四步培训法”,即准备(Tellyou)课前准备并告知学员培训的相关知识和技能示范(Showyou)示范和重复培训步骤练习(Followme)学员在培训师指导下对所学知识和技能进行练习。检查与跟踪(Checkyou)对学员完成的任务进行检查并给予积极支持和及时反馈。二、填空题1、培训评估主要从(反应)(学习)(行为)(结果)四方面进行。2、培训目标主要分为:技能培训、知识传授和(增强能力)。3、培训的特点是(针对性)(多样性)(速成性)(持续性)(强化外语培训)。4、培训应遵循(成人学习)原则。三、单项选择题师傅带徒弟这种培训方式的开发主体是(
D
)。
A.师傅
B.徒弟
C.学校
D.企业或单位在欧美、日本等国家盛行的,不经培训或培训不合格不得进入岗位的培训形式是(C
)。
A.在职培训
B.非在职培训
C.岗前培训
D.脱产培训下列哪项不是在培训过程中教室布置的决定因素(D)。A.参训人员人数B.培训活动形式C.课堂控制程度D.学员参与程度4.下列哪项不是培训的“Learn”教育方法的内容:(E)A.多讨论B.重视经历C.积极参与D.相关内容E.游戏5.培训目标是学员接受培训后所表现出来的工作能力水平的描述。培训目标的要求不包括:(B)A.清楚B.简单C.具体D.可衡量6.培训过程中最复杂最费时的阶段是:(D)A.培训评估B.培训需求分析C.培训设计D.制作培训资料7.“你喜欢这样的培训吗?”“你对培训师的表现是否满意?”这属于培训评估方面的(A)层面。A.反应B.学习C.行为D.结果8.OJT指的是(B)A.职前培训
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025三月份办公楼地下室侧墙防水基面处理劳务协议
- 灌溉自动化控制系统考核试卷
- 环保编织品在绿色建筑内外装饰考核试卷
- 工业机器人焊接工艺与控制考核试卷
- 电子专用材料生命周期评价考核试卷
- 体育赛事服务与观众满意度考核试卷
- 涂料店铺布局优化考核试卷
- 《万里长征》新民主主义革命的兴起课件
- 文案-北京明天第一城商业策划案
- 2025第二季度离婚后量子密钥分发设备处置协议
- 大学语文课程建设与改革实施方案
- 【上海市静安区宝山路街道社区养老问题调查报告】
- 公文筐测验(案例题解示范)
- 大学森林生态教案
- 蛙泳教学教案
- 医学英语词汇学(山东联盟)智慧树知到答案章节测试2023年山东第一医科大学
- 口腔一般检查方法口腔一般检查方法
- 冠状动脉粥样硬化性心脏病 (心内科)
- JJF(纺织)071-2016织物摩擦带电荷密度测试仪(法拉第筒法)校准规范
- GB/T 4857.10-2005包装运输包装件基本试验第10部分:正弦变频振动试验方法
- FZ/T 07004-2019纺织行业绿色工厂评价导则
评论
0/150
提交评论