Summery about show input info bar of MTK
分类: 技术 2008-12-28 13:40
2.以保存在PHONE为例(30个ASCII码, or 14个汉字)
Show57Screen() mmi_phb_entry_op_add_entry ( )开始装载57Screen。
姓名菜单:
(1)SetInlineItemActivation(&wgui_inline_items[0], KEY_LSK, KEY_EVENT_UP);---相应
(2)mmi_phb_op_fill_inline_item(MMI_PHB_FIELD_NAME,item_index++,MAX_PB_ENTRIES,TitleStrings, DetailPbNameImageList); ---装载详细信息 (2-1)调用SetInlineItemFullScreenEdit()设置全屏输入时的参数:接受地址pbName,长度31,输入类型
(2-1-1) SetInlineItemFullScreenEdit_ext() 令:wgui_inline_items[0] .item = &wgui_inline_text_edit_items[0](0表示第一个全屏编辑菜单,wgui_inline_text_edit_items是个数组,如果有多个全屏编辑菜单,那么就用变量n_inline_text_edit_items来计数) 然后设置wgui_inline_text_edit_items[0]的buffer(pbName), buffer_size(31),title, max_lines,以及一些处理函数。 item->handler = handle_inline_full_screen_edit; 注意:wgui_inline_items[0].texg_p也指向:wgui_inline_text_edit_items[0].buffer。
(3)高亮姓名菜单,按下做软件 (3-1) wgui_inline_item_key_handler() wgui_inline_items[wgui_inline_item_highlighted_index].handler(), 即上面的handle_inline_full_screen_edit. current_wgui_inline_text_edit_item = i;
指向item current_wgui_inline_text_edit_text_p = text_p;
指向pbName wgui_setup_inputbox() wgui_setup_inputbox_ext() create_multiline_inputbox_set_buffer()
创建编辑框 move_multiline_inputbox()
设置输入框实际位置(去掉信息栏位置wgui_inputbox_information_bar_height)
wgui_setup_input_information()
设置输入法信息栏
wgui_inputbox_information_bar_x = 0; wgui_inputbox_information_bar_y = 54;
wgui_inputbox_information_bar_width = 240; wgui_inputbox_information_bar_height = 22;
注册输入法函数,按键相应函数 设置右软件
set_right_softkey_function(wgui_handle_inputbox_right_softkey_down, KEY_EVENT_DOWN); set_right_softkey_function(wgui_handle_inputbox_right_softkey_long_press, KEY_LONG_PRESS); wgui_redraw_remaining_characters_display()
即wgui_redraw_remaining_characters_display_internal。 wgui_redraw_remaining_characters_display_internal()
n = (MMI_multiline_inputbox.text_length >> 1) - 1;
已经输入字符数 max_n = (MMI_multiline_inputbox.available_length >> 1) - 1; 最大字符数 wgui_input_information_background(x1, y1, x2, y2); 画背景 gui_sprintf(str, "%d/%d", n, max_n); gui_move_text_cursor(x2 - 2 - w, y1 + 2); 设置字符数提示信息的位置 gui_print_text(str); 显示 SetKeyHandler(wgui_handle_inputbox_change_input_mode, KEY_POUND, KEY_EVENT_DOWN); 1. 在全屏编辑界面,按下数字键5,进入: MMI_key_5_down() MMI_key_input_handler() multitap_input_key_down() change_multitap_state() multitap input multiline_inputbox_input_callback(), 即:wgui_inline_edit_handle_multiline_inputbox_input() gui_multi_line_input_box_insert_multitap_character(&MMI_multiline_inputbox, c); 加入字符 if (text_length > b->available_length) { UI_editor_play_tone_cannot_insert(); return; } UI_TEST_UCS2_INCREMENT_COUNT_SET_LENGTH_TYPE2() 此函数没有改变MMI_multiline_inputbox.available_length gui_show_multi_line_input_box() wgui_inline_edit_handle_multiline_inputbox_input() wgui_handle_inputbox_input() 改变有软件标签为清除,并设置响应函数 wgui_redraw_remaining_characters_display(); 重绘字符数提示信息 wgui_redraw_remaining_characters_display_internal() n = (MMI_multiline_inputbox.text_length >> 1) - 1; max_n = (MMI_multiline_inputbox.available_length >> 1) - 1; 此时MMI_multiline_inputbox.available_length=62,因此:max_n=31 2.输入第一个字符后,按下6输入第二个字符 只列出关键函数 gui_multi_line_input_box_insert_multitap_character() wgui_redraw_remaining_characters_display_internal() 3.在没有输入字符时,按下#,设置输入法为中文 INCInputKeyPoundPressHandler() INCInputSetLeftSoftKey() ; INCInputRegisterProcess(pInput->iType,pInput->iInputMode) 注册按键相应函数 wgui_handle_inputbox_change_input_mode() wgui_redraw_input_information_bar() 然后按下2: INCInputKey2PressHandler() INCInputEditKeyHandler() INCInputDraw() ; 绘画多选择输入 INCInputResetRightSoftKey() ; INCInputSetLeftSoftKey() 设置左软件:INCInputKeyEnterHandler() 按下左软件,选择一个汉字、 INCInputKeyEnterHandler() INCInputSetLeftSoftKey() INCInputSelectTheHZ() multiline_inputbox_direct_input() gui_multi_line_input_box_insert_character(&MMI_multiline_inputbox, c); gui_multi_line_input_box_insert_character_internal() UI_TEST_UCS2_INCREMENT_COUNT_SET_LENGTH_TYPE2( ) 此函数改变了MMI_multiline_inputbox.available_length wgui_inline_edit_handle_multiline_inputbox_input() multiline_inputbox_input_callback()即: wgui_inline_edit_handle_multiline_inputbox_input() wgui_handle_inputbox_input() 调整右软件标签和响应 wgui_redraw_remaining_characters_display() wgui_redraw_remaining_characters_display_internal() n = (MMI_multiline_inputbox.text_length >> 1) - 1; max_n = (MMI_multiline_inputbox.available_length >> 1) - 1; 此时MMI_multiline_inputbox.available_length=30,因此:max_n=14 二、删除字符 1. 当已经输入2个汉字时,提示信息:2/14。此时按右软件删除1个汉字,提示信息变成:1/14 INCInputRightSoftkeyPressHandler() bEmpty = gui_multi_line_input_box_get_text_length(&MMI_multiline_inputbox)==0 ;判断此时是否为空 if(bEmpty) else 进入这里,不为空 INCInputKeyClearHandler() multiline_inputbox_delete_character() gui_multi_line_input_box_delete_character(&MMI_multiline_inputbox); 删除一个汉字 UI_TEST_UCS2_DECREMENT_COUNT_SET_LENGTH( )。 重新设置最大字符数。此时第二个参数:b->UCS2_count为2(2个汉字),MMI_multiline_inputbox.available_length不会改变。 multiline_inputbox_input_callback()即:wgui_inline_edit_handle_multiline_inputbox_input() wgui_handle_inputbox_input()设置右软件标签和响应 wgui_redraw_remaining_characters_display()重绘提示字符信息 2.再次按下右软件,删除全部汉字,还进入else分支:再次进入UI_TEST_UCS2_DECREMENT_COUNT_SET_LENGTH()时, 第二个参数:b->UCS2_count为1(1个汉字),MMI_multiline_inputbox.available_length被改变,因此改变重绘提示字符信息。 3.输入为空时,再按下右软件,进入上面的if分支。返回history screen。 4.如果已经输入的不是汉字,而是ASCII码如:ab,按下右软件时: wgui_handle_inputbox_right_softkey_down() multiline_inputbox_delete_character() gui_multi_line_input_box_delete_character(&MMI_multiline_inputbox); 同样调用UI_TEST_UCS2_DECREMENT_COUNT_SET_LENGTH(),第二个参数:b->UCS2_count为0(0个汉字),MMI_multiline_inputbox.available_length不改变 multiline_inputbox_input_callback()即:wgui_inline_edit_handle_multiline_inputbox_input() wgui_handle_inputbox_input() wgui_redraw_remaining_characters_display() 重绘提示符信息 总结: 1.无论在哪种输入法下,当输入字符时,都进入:gui_multi_line_input_box_insert_character_internal()。在此函数中调用: UI_TEST_UCS2_INCREMENT_COUNT_SET_LENGTH_TYPE2()设置可输入的最大字符数,关键是根据第一个参数的编码来判断。 2.当删除字符时,都进入:multiline_inputbox_delete_character(),调用gui_multi_line_input_box_delete_character(),然后调用:、UI_TEST_UCS2_DECREMENT_COUNT_SET_LENGTH()设置设置可输入的最大字符数。