mmi培訓(xùn)資料-自定義模板TSFC四步培訓(xùn)法_第1頁(yè)
mmi培訓(xùn)資料-自定義模板TSFC四步培訓(xùn)法_第2頁(yè)
mmi培訓(xùn)資料-自定義模板TSFC四步培訓(xùn)法_第3頁(yè)
mmi培訓(xùn)資料-自定義模板TSFC四步培訓(xùn)法_第4頁(yè)
mmi培訓(xùn)資料-自定義模板TSFC四步培訓(xùn)法_第5頁(yè)
已閱讀5頁(yè),還剩19頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

mtk平臺(tái)mmi培訓(xùn)資料(中文)2008-06-0621:48本文詳細(xì)說(shuō)明了如何建設(shè)一個(gè)自定義列表窗體模板。原理部分請(qǐng)參見(jiàn)《MTK平臺(tái)(1)——如何添加一個(gè)窗體模板》。

最終實(shí)現(xiàn)的是一個(gè)字典輸入界面。布局為:該模板不包含業(yè)務(wù)邏輯,僅提供頁(yè)面顯示和InputBox框輸入事件后的ListBox的Redraw事件的注冊(cè),以及基本的輸入法設(shè)置、清空后的返回函數(shù)。

一、添加用戶(hù)自定義列表模板的過(guò)程

(一)在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ù)中添加用戶(hù)處理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中添加用戶(hù)事件定義接口

//右鍵事件注冊(cè)

voidSetCategoryCustomListRightSoftkeyFunction(void(*f)(void))

{

wgui_singleline_inputbox_RSK_function=f;

}//key_0到key_9按下時(shí)的事件注冊(cè)

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)用右鍵事件注冊(cè)函數(shù),注冊(cè)文本框被清空后的事件(如返回等)SetCategoryCustomListRightSoftkeyFunction。

4、調(diào)用key_0至key_9的事件注冊(cè)函數(shù),SetCategoryCustomListNumKeyFunction()。

三、參數(shù)詳細(xì)說(shuō)明

①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,

//標(biāo)題文本指針

U16title_icon,

//標(biāo)題圖標(biāo)ID

U16left_softkey,

//左鍵文本ID

U16left_softkey_icon,

//左鍵圖標(biāo)ID

U16right_softkey,

//右鍵文本ID

U16right_softkey_icon,

//右鍵圖標(biāo)ID

U8*custom_single_input_buffer,//Input輸入Buffer

S32number_of_items,

//列表?xiàng)l目數(shù)

U8**list_of_items,

//列表項(xiàng)文本指針數(shù)組

U16*list_of_icons,

//列表項(xiàng)Icon

S32highlighted_item,

//當(dāng)前高亮顯示的列表?xiàng)l目

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管理

對(duì)于我們上層用戶(hù)而言,經(jīng)常接觸到的History管理是這樣的:

voidEntryFunc()

{

U8*guiBuffer;

EntryNewScreen(Screen_ID,Exit_Func,Entry_Func,NULL);

guiBuffer=GetCurrGuiBuffer(SCR_ID_WORDMAIN_LIST);

ShowCategroyXXScreen(Title_ID,…,guiBuffer);

}

但是,無(wú)論是EntryNewScreen的調(diào)用,還是guiBuffer的傳入,我們都很少考慮過(guò)對(duì)這些指針和函數(shù)在GUI的管理起到了什么樣的作用。下面我們就要了解,以上的代碼與History管理之間存在的關(guān)系。

在MTK環(huán)境中,每當(dāng)我們進(jìn)入一個(gè)窗口,系統(tǒng)將先提取前一個(gè)窗口需保留的數(shù)據(jù)。這些數(shù)據(jù)包括:

1.

窗口ID;

2.

進(jìn)入窗口時(shí)調(diào)用的函數(shù)和退出調(diào)用的函數(shù)--Exit_Func和Entry_Func;

3.

組成窗體的控件的屬性(如,列表控件當(dāng)前高亮顯示的條目、當(dāng)前屏的首末條目等)。舉例說(shuō)明這些數(shù)據(jù)在實(shí)際中是如何被使用的。

假設(shè)存在AB兩個(gè)窗口,A窗口需要保留的數(shù)據(jù)為data_A。我們先從A窗口進(jìn)入到B窗口。data_A將在B窗口調(diào)用EntryNewScreen()的時(shí)候,被壓入一個(gè)結(jié)構(gòu)類(lèi)似于棧的數(shù)據(jù)存儲(chǔ)區(qū)域;當(dāng)從B調(diào)用GoBackHistory()返回A時(shí),data_A從棧頂被彈出,然后A利用data_A將自身還原到其進(jìn)入B之前的狀態(tài)。

這就是History管理的作用。簡(jiǎn)言之,就是要保持窗口的外觀狀態(tài)。

二、History管理的機(jī)制

現(xiàn)在,我們來(lái)了解一下前面所說(shuō)的data_A的數(shù)據(jù)結(jié)構(gòu)是什么樣的。

typedefstruct_history

{

U16scrnID;

//(1)ScreenID(窗口號(hào))

FuncPtrentryFuncPtr;

//(2)EntryNewScreen時(shí)要進(jìn)入的Entry_Func

U8inputBuffer[MAX_INPUT_BUFFER];

//(3)沒(méi)遇到過(guò)其使用,都是NULL。

U8guiBuffer[MAX_GUI_BUFFER];

//(4)窗體中控件的一些需保存的信息的Buffer,通常//在使用時(shí)被轉(zhuǎn)化成各控件自定義的結(jié)構(gòu)體如:list_menu_category_history。

}history;

而存放data_A的類(lèi)似于堆棧的數(shù)據(jù)區(qū)則以全局變量的形式定義在系統(tǒng)中:

historyNodehistoryData[MAX_HISTORY];(MAX_HISTORY=50):設(shè)當(dāng)前窗口A所對(duì)應(yīng)的數(shù)據(jù)是historyData[EntryScreenNum–1],那么它是何時(shí)、是如何被賦值的?又是何時(shí)、如何被使用的?

經(jīng)過(guò)跟蹤調(diào)試,我們已經(jīng)知道,在由窗口A進(jìn)入到窗口B(調(diào)用EntryNewScreen)的時(shí)候,我們將data_A記錄到了historyNode的結(jié)構(gòu)體變量中。但是,在EntryNewScreen的時(shí)候傳入的,卻是data_B,data_A是如何被記錄和使用的呢?我們摘選EntryNewScreen的子函數(shù)中所包含的較核心的代碼來(lái)說(shuō)明這個(gè)問(wèn)題。這三段代碼是按照現(xiàn)在的排放順序來(lái)執(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時(shí)所記錄的currExitScrnID,currEntryFuncPtr以history結(jié)構(gòu)為載體記錄入棧;然后執(zhí)行了記錄中的currExitFuncPtr;最后將本窗口的scrnID、exitFuncPtr、entryFuncPtr分別記錄入全局變量currExitScrnID、currExitFuncPtr和currEntryFuncPtr,留待下次調(diào)用EntryNewScreen時(shí)使用。下面有數(shù)據(jù)出入棧流程,有興趣的話(huà)可以跟蹤一下。以先后順序代表包含關(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的三個(gè)結(jié)構(gòu)體成員是如何記錄的了,最后來(lái)重點(diǎn)看一下history.guiBuffer是如何被記錄和使用的。

三、GUIBuffer對(duì)控件屬性的記錄

由上2節(jié)我們知道,guiBuffer是窗體中某些控件的需保存的屬性的Buffer,通常在使用時(shí)被轉(zhuǎn)化成各控件自定義的結(jié)構(gòu)體。如:list_menu_category_history。

現(xiàn)在有幾個(gè)問(wèn)題需要我們解答:

1.

guiBuffer指向的Buffer是如何被分配的?該塊數(shù)據(jù)是動(dòng)態(tài)的還是靜態(tài)的?

2.

這塊Buffer是何時(shí)被寫(xiě)入數(shù)據(jù)的?

3.

如何釋放(動(dòng)態(tài)分配時(shí))或清空(固定地址時(shí))該塊Buffer?讓我們逐一解答上面的三個(gè)問(wèn)題,以清晰我們對(duì)guiBuffer的認(rèn)識(shí)。

1.

答:在voidAddHistoryReference(history*addHistory)中,調(diào)用OslMalloc(MAX_GUI_BUFFER)動(dòng)態(tài)申請(qǐng)了一塊內(nèi)存,用來(lái)保存在GenericExitScreen中獲取的history.guiBuffer。[參見(jiàn)出入棧流程]2.

如何釋放(動(dòng)態(tài)分配時(shí))或清空(固定地址時(shí))該塊Buffer?

答:在staticvoiddecrement(void)函數(shù)中,該buffer被釋放:OslMfree(historyData[currHistoryIndex].guiBuffer);。[參見(jiàn)出入棧流程]3.

答:只要一個(gè)窗體模板有需要保存狀態(tài)的控件,它們都調(diào)用了這個(gè)函數(shù)——dm_setup_category_functions()。函數(shù)定義如下:

voiddm_setup_category_functions(

FuncPtrredraw_function,

U8*(*get_history_function)(U8*buffer),

S32(*get_history_size_function)(void)

)

{

//指向窗體重畫(huà)函數(shù)的函數(shù)指針

RedrawCategoryFunction=redraw_function;

//指向獲取窗體guiBuffer的函數(shù)指針

GetCategoryHistory=get_history_function;

//指向獲取窗體guiBuffer大小的函數(shù)指針

GetCategoryHistorySize=get_history_size_function;

}

在只有一個(gè)控件的狀態(tài)需要保存的窗體中,會(huì)這樣傳參給這個(gè)函數(shù):

dm_setup_category_functions(dm_redraw_category_screen,dm_get_category_history,dm_get_category_history_size);

GenericExitScreen()函數(shù)中,將使用GetCategoryHistory()獲取某個(gè)控件的GuiBuffer[參見(jiàn)出入棧流程]。如果按照上面的設(shè)置,GetCategoryHistory指向了

dm_get_category_history這個(gè)函數(shù)??纯催@個(gè)函數(shù)做了什么:

control_set_ptr=dm_search_control_set((U16)p_dm_data->s32CatId,&coordinate_set_p);//獲取窗體模板內(nèi)的控件類(lèi)型數(shù)組control_set_ptr

u8NoOfUICtrls=control_set_ptr[0];//獲取數(shù)組內(nèi)變量個(gè)數(shù),即控件的個(gè)數(shù)

/*根據(jù)控件類(lèi)型,獲取控件的guiBuffer.值得注意的是,1.這里的histroy_Buffer的名稱(chēng)起的不好,應(yīng)該起名為guiBuffer,不應(yīng)混淆視聽(tīng);2.最終history_buffer將指向模板中定義的最后一個(gè)控件的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不為空,則說(shuō)明該模板的顯示函數(shù)是在GoBackHistory()的時(shí)候被調(diào)用的,而不是進(jìn)入新窗口時(shí)被調(diào)用的。那么控件必然有一些保留的屬性需要被還原。以6號(hào)窗口的List為例。在ShowCategory6Screen()中,調(diào)用下面的函數(shù)來(lái)恢復(fù)List設(shè)置:

h_flag=set_list_menu_category_history(MMI_CATEGORY6_ID,history_buffer);

這樣guiBuffer的Get和Set就統(tǒng)一起來(lái)了?,F(xiàn)在,我們已經(jīng)知道了guiBuffer所起到的作用。但是,如果一個(gè)窗體模板內(nèi)有兩個(gè)或兩個(gè)以上需要記錄狀態(tài)的控件,又該怎么辦呢?

ps:該死的字?jǐn)?shù)限制,只能把剩下的放到《MTK平臺(tái)(3)——History管理[下]》了。四、靈活使用guiBuffer在我們自己設(shè)計(jì)窗體模板時(shí),經(jīng)常會(huì)出現(xiàn)一個(gè)窗體中有多個(gè)控件的情況。但是,如果一個(gè)窗體中有兩個(gè)控件、卻依然調(diào)用dm_get_category_history()獲取控件的GuiBuffer的話(huà),就會(huì)出現(xiàn)問(wèn)題。比如,我們?cè)谥谱鰿ustomList窗體時(shí),初期使用了這樣的代碼:

(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()來(lái)解析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進(jìn)入到B時(shí),EntryNewScreen函數(shù)調(diào)用了我們?cè)O(shè)置的獲取guiBuffer函數(shù)dm_get_category_history,它先保存了A中InputBox的屬性,再保存A中List的屬性——此時(shí)它將把輸入框的屬性覆蓋掉。當(dāng)從B窗口返回到A窗口時(shí),ShowCategoryCustomListScreen()函數(shù)先把history_buffer傳給了set_list_menu_category_history,由于guiBuffer中存儲(chǔ)的是List的數(shù)據(jù),因此在交付fixed_list_goto_item_no_redraw進(jìn)行設(shè)置屬性的時(shí)候,不會(huì)出現(xiàn)問(wèn)題。但wgui_setup_singleline_inputbox()就會(huì)因?yàn)間uiBuffer中存儲(chǔ)的不是輸入框存儲(chǔ)的數(shù)據(jù)而出現(xiàn)錯(cuò)誤。

因此,權(quán)宜之計(jì)是,將更改傳給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);

這樣,雖然死機(jī)bug避免了,但是特定情況下InputBox需要保存的屬性,將全部丟失掉.因此,更加合適的做法是,提取dm_setup_category_functions()中使用的函數(shù)接口:

get_singleline_inputbox_category_history

get_list_menu_category_history

這樣可以分別獲取inputbox和list的屬性,然后將得到的兩個(gè)屬性的數(shù)據(jù)連續(xù)存放在一塊動(dòng)態(tài)分配的Buffer中.如200號(hào)窗口的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);

}

要注意的問(wèn)題是,系統(tǒng)為guiBuffer分配空間時(shí),依據(jù)的是MAX_GUI_BUFFER,而不是dm_setup_category_functions()所指定的獲取guiBuffer大小的函數(shù)GetCategoryHistorySize.而且系統(tǒng)中從未使用過(guò)該函數(shù)指針?biāo)赶虻暮瘮?shù)。奇怪的是——所有窗體模板的制作者都兢兢業(yè)業(yè)地制作了這個(gè)獲取guiBuffer大小的函數(shù)。在200號(hào)窗口里,獲取guiBuffer大小的函數(shù)如下:

S32GetCategory200HistorySize(void)

{

return(((sizeof(list_menu_category_history)+3)/4)*4+sizeof(singleline_inputbox_category_history));

}

如果怕出錯(cuò)且不怕麻煩的話(huà),也可以未雨綢繆的寫(xiě)一個(gè)這樣的函數(shù),但恐怕多半是用不上的。

最后的任務(wù)就是在顯示窗體時(shí)分別獲取各控件的guiBuffer,然后將這些GUI_Buffer分別傳給各個(gè)控件的Set函數(shù).

仍然參看200號(hào)窗體的代碼實(shí)現(xiàn):

h_flag=set_list_menu_category_history(MMI_CATEGORY200_ID,history_buffer);

//第一個(gè)控件的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),

//第二個(gè)控件的GUI_Buffer起始

1);

五、小結(jié)經(jīng)過(guò)這些研究和借鑒.我們?cè)诖绑w開(kāi)發(fā)工作中所需的技術(shù)點(diǎn)已經(jīng)逐步趨于完善了。后期開(kāi)發(fā)工作中,可能還有一些GUI相關(guān)的探索工作需要進(jìn)行。據(jù)現(xiàn)在的情況來(lái)看,主要有兩方面:

1.inline控件及57號(hào)窗體的進(jìn)一步研究。

必要性很明顯?,F(xiàn)在使用中的NumberTune就很有必要嵌入到這個(gè)57號(hào)模板中。對(duì)于Inline控件的管理方式的研究是這個(gè)工作的前提。

2.touchpanel的相關(guān)研究。

主要看控件的touchpanel編譯開(kāi)關(guān)內(nèi)的代碼實(shí)現(xiàn)。將有助于平臺(tái)移植。

3.現(xiàn)有控件的進(jìn)一步熟悉。

如果有可利用的現(xiàn)有控件的話(huà),盡量避免移植自己的控件上來(lái)。這對(duì)于系統(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é)點(diǎn)

(2)voidGoBackHistory(void);

//刪除歷史記錄堆棧頂端節(jié)點(diǎn),并執(zhí)行EntryFunction(EntryNewScreen指定的函數(shù))

(3)voidDeleteNHistory(U16DeleteCount);

//刪除N個(gè)節(jié)點(diǎn)

(4)U8GetHistory(U16ScreenID,history*ptrHistory);

//通過(guò)窗口號(hào)獲取歷史記錄數(shù)據(jù)

(5)U8GoBackToHistory(U16ScreenID);

//返回到指定的窗口號(hào)

(6)voidGoBacknHistory(U16nCount);

//刪除nCount個(gè)歷史記錄節(jié)點(diǎn),并執(zhí)行第nCount+1個(gè)EntryFunction

(7)U8*GetCurrGuiBuffer(U16ScreenID);

//按窗口號(hào)獲取指定的Gui_Buffer

(8)U8*GetCurrInputBuffer(U16ScreenID);

//按窗口號(hào)獲取指定的Input_Buffer

(9)voidExecutecurrHisIndEntryFunc(void);

//獲取當(dāng)前在棧頂?shù)臍v史記錄節(jié)點(diǎn)的EntryFunction.

(10)U8GoBeyondMarkerScr(U16ScreenID);

//刪除從當(dāng)前窗口號(hào)到指定窗口號(hào)之間的一切歷史記錄節(jié)點(diǎn),并執(zhí)行最近的EntryFuntion

(11)U8DeleteUptoScrID(U16ScreenID);

//刪除從當(dāng)前窗口號(hào)到指定窗口號(hào)之間的一切歷史記錄節(jié)點(diǎn),但不執(zhí)行EntryFuntion

模塊三知識(shí)能力試題答案一、名詞解釋1、飯店人員培訓(xùn)一個(gè)有用的飯店培訓(xùn)可以理解為一個(gè)系統(tǒng)過(guò)程。在這個(gè)過(guò)程中企業(yè)的人力資源通過(guò)指導(dǎo)和實(shí)踐活動(dòng)獲得知識(shí)、培養(yǎng)技能、改變態(tài)度、增進(jìn)能力,從而提高企業(yè)整體的績(jī)效。2、培訓(xùn)需求分析需求分析就是通過(guò)對(duì)酒店及其成員的現(xiàn)有狀況與理想工作狀況的差距進(jìn)行分析,來(lái)確定是否需要培訓(xùn)以及培訓(xùn)的內(nèi)容的系統(tǒng)方法。需求分析具有很強(qiáng)的指導(dǎo)性,它既是確定培訓(xùn)目標(biāo)、設(shè)計(jì)培訓(xùn)計(jì)劃的前提,也是進(jìn)行培訓(xùn)評(píng)估的基礎(chǔ)。3、交叉培訓(xùn)又稱(chēng)工作輪換,指讓受訓(xùn)人有計(jì)劃地從一個(gè)崗位換到另一個(gè)崗位,以使員工熟悉不同部門(mén)或崗位的業(yè)務(wù),具備多項(xiàng)專(zhuān)業(yè)技能。4、TSFC四步培訓(xùn)法具有科學(xué)性的“TSFC四步培訓(xùn)法”,即準(zhǔn)備(Tellyou)課前準(zhǔn)備并告知學(xué)員培訓(xùn)的相關(guān)知識(shí)和技能示范(Showyou)示范和重復(fù)培訓(xùn)步驟練習(xí)(Followme)學(xué)員在培訓(xùn)師指導(dǎo)下對(duì)所學(xué)知識(shí)和技能進(jìn)行練習(xí)。檢查與跟蹤(Checkyou)對(duì)學(xué)員完成的任務(wù)進(jìn)行檢查并給予積極支持和及時(shí)反饋。二、填空題1、培訓(xùn)評(píng)估主要從(反應(yīng))(學(xué)習(xí))(行為)(結(jié)果)四方面進(jìn)行。2、培訓(xùn)目標(biāo)主要分為:技能培訓(xùn)、知識(shí)傳授和(增強(qiáng)能力)。3、培訓(xùn)的特點(diǎn)是(針對(duì)性)(多樣性)(速成性)(持續(xù)性)(強(qiáng)化外語(yǔ)培訓(xùn))。4、培訓(xùn)應(yīng)遵循(成人學(xué)習(xí))原則。三、單項(xiàng)選擇題師傅帶徒弟這種培訓(xùn)方式的開(kāi)發(fā)主體是(

D

)。

A.師傅

B.徒弟

C.學(xué)校

D.企業(yè)或單位在歐美、日本等國(guó)家盛行的,不經(jīng)培訓(xùn)或培訓(xùn)不合格不得進(jìn)入崗位的培訓(xùn)形式是(C

)。

A.在職培訓(xùn)

B.非在職培訓(xùn)

C.崗前培訓(xùn)

D.脫產(chǎn)培訓(xùn)下列哪項(xiàng)不是在培訓(xùn)過(guò)程中教室布置的決定因素(D)。A.參訓(xùn)人員人數(shù)B.培訓(xùn)活動(dòng)形式C.課堂控制程度D.學(xué)員參與程度4.下列哪項(xiàng)不是培訓(xùn)的“Learn”教育方法的內(nèi)容:(E)A.多討論B.重視經(jīng)歷C.積極參與D.相關(guān)內(nèi)容E.游戲5.培訓(xùn)目標(biāo)是學(xué)員接受培訓(xùn)后所表現(xiàn)出來(lái)的工作能力水平的描述。培訓(xùn)目標(biāo)的要求不包括:(B)A.清楚B.簡(jiǎn)單C.具體D.可衡量6.培訓(xùn)過(guò)程中最復(fù)雜最費(fèi)時(shí)的階段是:(D)A.培訓(xùn)評(píng)估B.培訓(xùn)需求分析C.培訓(xùn)設(shè)計(jì)D.制作培訓(xùn)資料7.“你喜歡這樣的培訓(xùn)嗎?”“你對(duì)培訓(xùn)師的表現(xiàn)是否滿(mǎn)意?”這屬于培訓(xùn)評(píng)估方面的(A)層面。A.反應(yīng)B.學(xué)習(xí)C.行為D.結(jié)果8.OJT指的是(B)A.職前培訓(xùn)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論