版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
mtk平臺mmi培訓(xùn)資料(中文)2008-06-0621:48本文詳細說明了如何建設(shè)一個自定義列表窗體模板。原理部分請參見《MTK平臺(1)——如何添加一個窗體模板》。
最終實現(xiàn)的是一個字典輸入界面。布局為:該模板不包含業(yè)務(wù)邏輯,僅提供頁面顯示和InputBox框輸入事件后的ListBox的Redraw事件的注冊,以及基本的輸入法設(shè)置、清空后的返回函數(shù)。
一、添加用戶自定義列表模板的過程
(一)在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()函數(shù)中加入:
//設(shè)定列表位置和大?。ú灰浫肿兞縈MI_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++;
}
//設(shè)定輸入框位置和大小
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中定義模板顯示函數(shù)
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()函數(shù)中添加用戶處理key_0~key_9的按鍵事件的函數(shù):
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;
}//設(shè)置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;
}
//設(shè)置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、調(diào)用SetCustomList_Inputbox_Size和SetCustomList_Listbox_Size設(shè)置列表框和輸入框的大小。
2、調(diào)用顯示窗體的接口ShowCategoryCustomListScreen。
3、調(diào)用右鍵事件注冊函數(shù),注冊文本框被清空后的事件(如返回等)SetCategoryCustomListRightSoftkeyFunction。
4、調(diào)用key_0至key_9的事件注冊函數(shù),SetCategoryCustomListNumKeyFunction()。
三、參數(shù)詳細說明
①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):函數(shù)地址。
③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,
//列表條目數(shù)
U8**list_of_items,
//列表項文本指針數(shù)組
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管理
對于我們上層用戶而言,經(jīng)常接觸到的History管理是這樣的:
voidEntryFunc()
{
U8*guiBuffer;
EntryNewScreen(Screen_ID,Exit_Func,Entry_Func,NULL);
guiBuffer=GetCurrGuiBuffer(SCR_ID_WORDMAIN_LIST);
ShowCategroyXXScreen(Title_ID,…,guiBuffer);
}
但是,無論是EntryNewScreen的調(diào)用,還是guiBuffer的傳入,我們都很少考慮過對這些指針和函數(shù)在GUI的管理起到了什么樣的作用。下面我們就要了解,以上的代碼與History管理之間存在的關(guān)系。
在MTK環(huán)境中,每當我們進入一個窗口,系統(tǒng)將先提取前一個窗口需保留的數(shù)據(jù)。這些數(shù)據(jù)包括:
1.
窗口ID;
2.
進入窗口時調(diào)用的函數(shù)和退出調(diào)用的函數(shù)--Exit_Func和Entry_Func;
3.
組成窗體的控件的屬性(如,列表控件當前高亮顯示的條目、當前屏的首末條目等)。舉例說明這些數(shù)據(jù)在實際中是如何被使用的。
假設(shè)存在AB兩個窗口,A窗口需要保留的數(shù)據(jù)為data_A。我們先從A窗口進入到B窗口。data_A將在B窗口調(diào)用EntryNewScreen()的時候,被壓入一個結(jié)構(gòu)類似于棧的數(shù)據(jù)存儲區(qū)域;當從B調(diào)用GoBackHistory()返回A時,data_A從棧頂被彈出,然后A利用data_A將自身還原到其進入B之前的狀態(tài)。
這就是History管理的作用。簡言之,就是要保持窗口的外觀狀態(tài)。
二、History管理的機制
現(xiàn)在,我們來了解一下前面所說的data_A的數(shù)據(jù)結(jié)構(gòu)是什么樣的。
typedefstruct_history
{
U16scrnID;
//(1)ScreenID(窗口號)
FuncPtrentryFuncPtr;
//(2)EntryNewScreen時要進入的Entry_Func
U8inputBuffer[MAX_INPUT_BUFFER];
//(3)沒遇到過其使用,都是NULL。
U8guiBuffer[MAX_GUI_BUFFER];
//(4)窗體中控件的一些需保存的信息的Buffer,通常//在使用時被轉(zhuǎn)化成各控件自定義的結(jié)構(gòu)體如:list_menu_category_history。
}history;
而存放data_A的類似于堆棧的數(shù)據(jù)區(qū)則以全局變量的形式定義在系統(tǒng)中:
historyNodehistoryData[MAX_HISTORY];(MAX_HISTORY=50):設(shè)當前窗口A所對應(yīng)的數(shù)據(jù)是historyData[EntryScreenNum–1],那么它是何時、是如何被賦值的?又是何時、如何被使用的?
經(jīng)過跟蹤調(diào)試,我們已經(jīng)知道,在由窗口A進入到窗口B(調(diào)用EntryNewScreen)的時候,我們將data_A記錄到了historyNode的結(jié)構(gòu)體變量中。但是,在EntryNewScreen的時候傳入的,卻是data_B,data_A是如何被記錄和使用的呢?我們摘選EntryNewScreen的子函數(shù)中所包含的較核心的代碼來說明這個問題。這三段代碼是按照現(xiàn)在的排放順序來執(zhí)行的。
第一段(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的函數(shù)的指針
AddHistory(h);
//數(shù)據(jù)入棧
第二段:
if(currExitFuncPtr)
{
//…
(*currExitFuncPtr)();
//執(zhí)行Exit_Func
}
第三段(記錄Screen_ID,Exit_Func和EntryFunc):
currExitScrnID=scrnID;
currExitFuncPtr=exitFuncPtr;
currEntryFuncPtr=entryFuncPtr;
這樣,我們就可以看出,EntryNewScreen函數(shù)先將上次執(zhí)行EntryNewScreen時所記錄的currExitScrnID,currEntryFuncPtr以history結(jié)構(gòu)為載體記錄入棧;然后執(zhí)行了記錄中的currExitFuncPtr;最后將本窗口的scrnID、exitFuncPtr、entryFuncPtr分別記錄入全局變量currExitScrnID、currExitFuncPtr和currEntryFuncPtr,留待下次調(diào)用EntryNewScreen時使用。下面有數(shù)據(jù)出入棧流程,有興趣的話可以跟蹤一下。以先后順序代表包含關(guān)系,如下:
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);
//更改棧指針現(xiàn)在我們已經(jīng)知道了history的三個結(jié)構(gòu)體成員是如何記錄的了,最后來重點看一下history.guiBuffer是如何被記錄和使用的。
三、GUIBuffer對控件屬性的記錄
由上2節(jié)我們知道,guiBuffer是窗體中某些控件的需保存的屬性的Buffer,通常在使用時被轉(zhuǎn)化成各控件自定義的結(jié)構(gòu)體。如:list_menu_category_history。
現(xiàn)在有幾個問題需要我們解答:
1.
guiBuffer指向的Buffer是如何被分配的?該塊數(shù)據(jù)是動態(tài)的還是靜態(tài)的?
2.
這塊Buffer是何時被寫入數(shù)據(jù)的?
3.
如何釋放(動態(tài)分配時)或清空(固定地址時)該塊Buffer?讓我們逐一解答上面的三個問題,以清晰我們對guiBuffer的認識。
1.
答:在voidAddHistoryReference(history*addHistory)中,調(diào)用OslMalloc(MAX_GUI_BUFFER)動態(tài)申請了一塊內(nèi)存,用來保存在GenericExitScreen中獲取的history.guiBuffer。[參見出入棧流程]2.
如何釋放(動態(tài)分配時)或清空(固定地址時)該塊Buffer?
答:在staticvoiddecrement(void)函數(shù)中,該buffer被釋放:OslMfree(historyData[currHistoryIndex].guiBuffer);。[參見出入棧流程]3.
答:只要一個窗體模板有需要保存狀態(tài)的控件,它們都調(diào)用了這個函數(shù)——dm_setup_category_functions()。函數(shù)定義如下:
voiddm_setup_category_functions(
FuncPtrredraw_function,
U8*(*get_history_function)(U8*buffer),
S32(*get_history_size_function)(void)
)
{
//指向窗體重畫函數(shù)的函數(shù)指針
RedrawCategoryFunction=redraw_function;
//指向獲取窗體guiBuffer的函數(shù)指針
GetCategoryHistory=get_history_function;
//指向獲取窗體guiBuffer大小的函數(shù)指針
GetCategoryHistorySize=get_history_size_function;
}
在只有一個控件的狀態(tài)需要保存的窗體中,會這樣傳參給這個函數(shù):
dm_setup_category_functions(dm_redraw_category_screen,dm_get_category_history,dm_get_category_history_size);
GenericExitScreen()函數(shù)中,將使用GetCategoryHistory()獲取某個控件的GuiBuffer[參見出入棧流程]。如果按照上面的設(shè)置,GetCategoryHistory指向了
dm_get_category_history這個函數(shù)。看看這個函數(shù)做了什么:
control_set_ptr=dm_search_control_set((U16)p_dm_data->s32CatId,&coordinate_set_p);//獲取窗體模板內(nèi)的控件類型數(shù)組control_set_ptr
u8NoOfUICtrls=control_set_ptr[0];//獲取數(shù)組內(nèi)變量個數(shù),即控件的個數(shù)
/*根據(jù)控件類型,獲取控件的guiBuffer.值得注意的是,1.這里的histroy_Buffer的名稱起的不好,應(yīng)該起名為guiBuffer,不應(yīng)混淆視聽;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;
}
//...
}
//...
}
而在模版顯示函數(shù)(ShowCategroyXXScreen)中,則根據(jù)guibuffer的情況設(shè)置控件的屬性。如果guibuffer不為空,則說明該模板的顯示函數(shù)是在GoBackHistory()的時候被調(diào)用的,而不是進入新窗口時被調(diào)用的。那么控件必然有一些保留的屬性需要被還原。以6號窗口的List為例。在ShowCategory6Screen()中,調(diào)用下面的函數(shù)來恢復(fù)List設(shè)置:
h_flag=set_list_menu_category_history(MMI_CATEGORY6_ID,history_buffer);
這樣guiBuffer的Get和Set就統(tǒng)一起來了?,F(xiàn)在,我們已經(jīng)知道了guiBuffer所起到的作用。但是,如果一個窗體模板內(nèi)有兩個或兩個以上需要記錄狀態(tài)的控件,又該怎么辦呢?
ps:該死的字數(shù)限制,只能把剩下的放到《MTK平臺(3)——History管理[下]》了。四、靈活使用guiBuffer在我們自己設(shè)計窗體模板時,經(jīng)常會出現(xiàn)一個窗體中有多個控件的情況。但是,如果一個窗體中有兩個控件、卻依然調(diào)用dm_get_category_history()獲取控件的GuiBuffer的話,就會出現(xiàn)問題。比如,我們在制作CustomList窗體時,初期使用了這樣的代碼:
(1)模板中的組件設(shè)置:
constU8custom_define_list[]=
{
5,
DM_BASE_LAYER_START,
DM_SCR_BG,
DM_BASE_CONTROL_SET1,
DM_SINGLELINE_INPUTBOX1,
//單行輸入控件
DM_LIST1
//列表控件
};
(2)窗體顯示函數(shù)ShowCategoryCustomListScreen部分源碼:
voidShowCategoryCustomListScreen(...,U8*guiBuffer)
{
//...
//根據(jù)MMI_CATEGORY_CUSTOM_LIST的guiBuffer,為全局結(jié)構(gòu)體變量//MMI_fixed_list_menu賦值.
h_flag=set_list_menu_category_history(MMI_CATEGORY_CUSTOM_LIST,guiBuffer);
//而后利用MMI_fixed_list_menu,設(shè)置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);
}
//...
//再設(shè)置單行輸入框的屬性
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函數(shù)中調(diào)用了//set_singleline_inputbox_category_history()來解析guiBuffer
//...
dm_setup_category_functions(dm_redraw_category_screen,dm_get_category_history,dm_get_category_history_size);
//...
}
繼續(xù)使用前3節(jié)的假設(shè)。窗口A使用了CustomList窗體模板。從A進入到B時,EntryNewScreen函數(shù)調(diào)用了我們設(shè)置的獲取guiBuffer函數(shù)dm_get_category_history,它先保存了A中InputBox的屬性,再保存A中List的屬性——此時它將把輸入框的屬性覆蓋掉。當從B窗口返回到A窗口時,ShowCategoryCustomListScreen()函數(shù)先把history_buffer傳給了set_list_menu_category_history,由于guiBuffer中存儲的是List的數(shù)據(jù),因此在交付fixed_list_goto_item_no_redraw進行設(shè)置屬性的時候,不會出現(xiàn)問題。但wgui_setup_singleline_inputbox()就會因為guiBuffer中存儲的不是輸入框存儲的數(shù)據(jù)而出現(xiàn)錯誤。
因此,權(quán)宜之計是,將更改傳給wgui_setup_singleline_inputbox的入?yún)?
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()中使用的函數(shù)接口:
get_singleline_inputbox_category_history
get_list_menu_category_history
這樣可以分別獲取inputbox和list的屬性,然后將得到的兩個屬性的數(shù)據(jù)連續(xù)存放在一塊動態(tài)分配的Buffer中.如200號窗口的GetCategroyHistory函數(shù)所示:
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);
}
要注意的問題是,系統(tǒng)為guiBuffer分配空間時,依據(jù)的是MAX_GUI_BUFFER,而不是dm_setup_category_functions()所指定的獲取guiBuffer大小的函數(shù)GetCategoryHistorySize.而且系統(tǒng)中從未使用過該函數(shù)指針所指向的函數(shù)。奇怪的是——所有窗體模板的制作者都兢兢業(yè)業(yè)地制作了這個獲取guiBuffer大小的函數(shù)。在200號窗口里,獲取guiBuffer大小的函數(shù)如下:
S32GetCategory200HistorySize(void)
{
return(((sizeof(list_menu_category_history)+3)/4)*4+sizeof(singleline_inputbox_category_history));
}
如果怕出錯且不怕麻煩的話,也可以未雨綢繆的寫一個這樣的函數(shù),但恐怕多半是用不上的。
最后的任務(wù)就是在顯示窗體時分別獲取各控件的guiBuffer,然后將這些GUI_Buffer分別傳給各個控件的Set函數(shù).
仍然參看200號窗體的代碼實現(xiàn):
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);
五、小結(jié)經(jīng)過這些研究和借鑒.我們在窗體開發(fā)工作中所需的技術(shù)點已經(jīng)逐步趨于完善了。后期開發(fā)工作中,可能還有一些GUI相關(guān)的探索工作需要進行。據(jù)現(xiàn)在的情況來看,主要有兩方面:
1.inline控件及57號窗體的進一步研究。
必要性很明顯?,F(xiàn)在使用中的NumberTune就很有必要嵌入到這個57號模板中。對于Inline控件的管理方式的研究是這個工作的前提。
2.touchpanel的相關(guān)研究。
主要看控件的touchpanel編譯開關(guān)內(nèi)的代碼實現(xiàn)。將有助于平臺移植。
3.現(xiàn)有控件的進一步熟悉。
如果有可利用的現(xiàn)有控件的話,盡量避免移植自己的控件上來。這對于系統(tǒng)的穩(wěn)定和GUI的移植都不利。附1:其他HistoryInfo結(jié)構(gòu)體
typedefstruct_history
{
U16scrnID;
FuncPtrentryFuncPtr;
U8inputBuffer[MAX_INPUT_BUFFER];
U8guiBuffer[MAX_GUI_BUFFER];
}history;typedefstruct_historyCallback
{
U16scrnID;
HistoryDelCBPtrhistorydelCBPtr;
}historyCallback;附2:函數(shù)接口
(1)voidAddHistory(historyaddHistory);
//添加歷史記錄節(jié)點
(2)voidGoBackHistory(void);
//刪除歷史記錄堆棧頂端節(jié)點,并執(zhí)行EntryFunction(EntryNewScreen指定的函數(shù))
(3)voidDeleteNHistory(U16DeleteCount);
//刪除N個節(jié)點
(4)U8GetHistory(U16ScreenID,history*ptrHistory);
//通過窗口號獲取歷史記錄數(shù)據(jù)
(5)U8GoBackToHistory(U16ScreenID);
//返回到指定的窗口號
(6)voidGoBacknHistory(U16nCount);
//刪除nCount個歷史記錄節(jié)點,并執(zhí)行第nCount+1個EntryFunction
(7)U8*GetCurrGuiBuffer(U16ScreenID);
//按窗口號獲取指定的Gui_Buffer
(8)U8*GetCurrInputBuffer(U16ScreenID);
//按窗口號獲取指定的Input_Buffer
(9)voidExecutecurrHisIndEntryFunc(void);
//獲取當前在棧頂?shù)臍v史記錄節(jié)點的EntryFunction.
(10)U8GoBeyondMarkerScr(U16ScreenID);
//刪除從當前窗口號到指定窗口號之間的一切歷史記錄節(jié)點,并執(zhí)行最近的EntryFuntion
(11)U8DeleteUptoScrID(U16ScreenID);
//刪除從當前窗口號到指定窗口號之間的一切歷史記錄節(jié)點,但不執(zhí)行EntryFuntion
模塊三知識能力試題答案一、名詞解釋1、飯店人員培訓(xùn)一個有用的飯店培訓(xùn)可以理解為一個系統(tǒng)過程。在這個過程中企業(yè)的人力資源通過指導(dǎo)和實踐活動獲得知識、培養(yǎng)技能、改變態(tài)度、增進能力,從而提高企業(yè)整體的績效。2、培訓(xùn)需求分析需求分析就是通過對酒店及其成員的現(xiàn)有狀況與理想工作狀況的差距進行分析,來確定是否需要培訓(xùn)以及培訓(xùn)的內(nèi)容的系統(tǒng)方法。需求分析具有很強的指導(dǎo)性,它既是確定培訓(xùn)目標、設(shè)計培訓(xùn)計劃的前提,也是進行培訓(xùn)評估的基礎(chǔ)。3、交叉培訓(xùn)又稱工作輪換,指讓受訓(xùn)人有計劃地從一個崗位換到另一個崗位,以使員工熟悉不同部門或崗位的業(yè)務(wù),具備多項專業(yè)技能。4、TSFC四步培訓(xùn)法具有科學性的“TSFC四步培訓(xùn)法”,即準備(Tellyou)課前準備并告知學員培訓(xùn)的相關(guān)知識和技能示范(Showyou)示范和重復(fù)培訓(xùn)步驟練習(Followme)學員在培訓(xùn)師指導(dǎo)下對所學知識和技能進行練習。檢查與跟蹤(Checkyou)對學員完成的任務(wù)進行檢查并給予積極支持和及時反饋。二、填空題1、培訓(xùn)評估主要從(反應(yīng))(學習)(行為)(結(jié)果)四方面進行。2、培訓(xùn)目標主要分為:技能培訓(xùn)、知識傳授和(增強能力)。3、培訓(xùn)的特點是(針對性)(多樣性)(速成性)(持續(xù)性)(強化外語培訓(xùn))。4、培訓(xùn)應(yīng)遵循(成人學習)原則。三、單項選擇題師傅帶徒弟這種培訓(xùn)方式的開發(fā)主體是(
D
)。
A.師傅
B.徒弟
C.學校
D.企業(yè)或單位在歐美、日本等國家盛行的,不經(jīng)培訓(xùn)或培訓(xùn)不合格不得進入崗位的培訓(xùn)形式是(C
)。
A.在職培訓(xùn)
B.非在職培訓(xùn)
C.崗前培訓(xùn)
D.脫產(chǎn)培訓(xùn)下列哪項不是在培訓(xùn)過程中教室布置的決定因素(D)。A.參訓(xùn)人員人數(shù)B.培訓(xùn)活動形式C.課堂控制程度D.學員參與程度4.下列哪項不是培訓(xùn)的“Learn”教育方法的內(nèi)容:(E)A.多討論B.重視經(jīng)歷C.積極參與D.相關(guān)內(nèi)容E.游戲5.培訓(xùn)目標是學員接受培訓(xùn)后所表現(xiàn)出來的工作能力水平的描述。培訓(xùn)目標的要求不包括:(B)A.清楚B.簡單C.具體D.可衡量6.培訓(xùn)過程中最復(fù)雜最費時的階段是:(D)A.培訓(xùn)評估B.培訓(xùn)需求分析C.培訓(xùn)設(shè)計D.制作培訓(xùn)資料7.“你喜歡這樣的培訓(xùn)嗎?”“你對培訓(xùn)師的表現(xiàn)是否滿意?”這屬于培訓(xùn)評估方面的(A)層面。A.反應(yīng)B.學習C.行為D.結(jié)果8.OJT指的是(B)A.職前培訓(xùn)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版冷鏈物流專用木箱紙箱銷售合同
- 二零二五年度電視節(jié)目版權(quán)購買與播映合同4篇
- 2025年電梯門套安裝工程安全防護合同4篇
- 2025年度企業(yè)內(nèi)部員工退休生活補貼合同3篇
- 二零二五年度美容院品牌形象授權(quán)及宣傳推廣合同4篇
- 個人汽車按揭貸款合同(2024版)
- 二零二五年度垃圾處理設(shè)施建設(shè)承包施工合同3篇
- 二零二五版鎳氫電池產(chǎn)品知識產(chǎn)權(quán)保護合同范本4篇
- 二零二五年度苗木種植與生態(tài)農(nóng)業(yè)示范區(qū)建設(shè)合同3篇
- 個人收藏品買賣合同(2024版)2篇
- 道路瀝青工程施工方案
- 2025年度正規(guī)離婚協(xié)議書電子版下載服務(wù)
- 《田口方法的導(dǎo)入》課件
- 內(nèi)陸?zhàn)B殖與水產(chǎn)品市場營銷策略考核試卷
- 醫(yī)生給病人免責協(xié)議書(2篇)
- 損傷力學與斷裂分析
- 2024年縣鄉(xiāng)教師選調(diào)進城考試《教育學》題庫及完整答案(考點梳理)
- 車借給別人免責協(xié)議書
- 應(yīng)急預(yù)案評分標準表
- “網(wǎng)絡(luò)安全課件:高校教師網(wǎng)絡(luò)安全與信息化素養(yǎng)培訓(xùn)”
- 鋰離子電池健康評估及剩余使用壽命預(yù)測方法研究
評論
0/150
提交評論