美化MTK的拨号窗口

来源:互联网 发布:java模拟鼠标点击 编辑:程序博客网 时间:2024/05/19 07:42

除待机,主菜单,多媒体窗口外,拨号窗口也许是我们最经常为其动手术的一个窗口了。除了花里胡哨的界面,各种新技术新器件的应用外,最经常修改的大概是拨号窗口的字符显示。许多时候客户都会嫌弃字符过小,即使换成最大字体,有时照样有客户抱怨字符不够大。字库里的大号字已经满足不了有些客户的需求,客户有时需要更漂亮的字体,有时需要更大的字体,频繁的修改字库,有时既满足不了用户需求,客户的需求各不相同,为了满足单个客户的需求,这无疑是个很愚蠢的主意。于是有些人就想到了贴图,其实字在字库也是存储为小图片的点阵信息。这说明这个方法是完全可行的。其实写这篇文章是应一个同学的要求写的,由于一直很忙,没有写,总觉得的欠下一笔债,今天就一并还了。

原理其实是很简单的,要使用贴图替换MTK自己的输出字符函数,并对应用户的按键。首先要解决的问题是找到替换的地方,如果使用自己贴图,光标也要自己绘制。使用模拟器,可以很容易找到替换的地方。

gui_show_dialer_input_box_ext这个函数是MTK绘制拨号窗口EDIT控件的函数,也是我们今天主要动手术的函数。这里我使用宏(__MMI_DIALING_NUM_PICTURE__),首先找到这个函数中初始化字符的宽度的语句,替换,

#if defined(__MMI_DIALING_NUM_PICTURE__)
 character_width=get_number_image_width();
 #else
    character_width = gui_get_character_width(0x31);
 #endif
然后找到高度

 #if defined(__MMI_DIALING_NUM_PICTURE__)
  character_height=get_number_image_hight();
 #else
        #if( defined(__MMI_TOUCH_DIAL_SCREEN__))
         character_height = gui_get_character_height() + 1;
        #else
         character_height = gui_get_character_height() + 2;
        #endif
 #endif
找到输出字符的地方

    #if defined(__MMI_DIALING_NUM_PICTURE__)
    {
     U16 image_id;
          if(is_dial_number_big_pic())
     {
       image_id=get_image_id_by_char(current_character,FALSE);
      gdi_image_draw_id(text_x,text_y,image_id);
     }
     else
     {
       image_id=get_image_id_by_char(current_character,TRUE);
      gdi_image_draw_id(text_x,text_y,image_id);
     }
    }
    #else                        
                            gui_print_character(current_character);
    #endif
另一个地方也要替换

    #if defined(__MMI_DIALING_NUM_PICTURE__)
    {
     U16 image_id;
          if(is_dial_number_big_pic())
     {
       image_id=get_image_id_by_char(current_character,FALSE);
      gdi_image_draw_id(text_x,text_y,image_id);
     }
     else
     {
       image_id=get_image_id_by_char(current_character,TRUE);
      gdi_image_draw_id(text_x,text_y,image_id);
     }
    
    }     
                        #else
                           
                            gui_set_text_color(*(current_MMI_theme->dialer_inputbox_text_color));
                            gui_set_text_border_color(*(current_MMI_theme->dialer_inputbox_text_border_color));
                            gui_print_bordered_character(current_character);
                        #endif
还有一个地方也要替换

  #if defined(__MMI_DIALING_NUM_PICTURE__)
   {
    U16 image_id;
       if(is_dial_number_big_pic())
    {
      image_id=get_image_id_by_char(current_character,FALSE);
     gdi_image_draw_id(text_x,text_y,image_id);
    }
    else
    {
      image_id=get_image_id_by_char(current_character,TRUE);
     gdi_image_draw_id(text_x,text_y,image_id);
    }

   }    
      #else
                       
                        gui_set_text_color(*(current_MMI_theme->dialer_inputbox_text_color));
                        gui_set_text_border_color(*(current_MMI_theme->dialer_inputbox_text_border_color));
                        gui_print_bordered_character(current_character);
      #endif               
还有一个函数gui_dialer_input_box_next_line,里面字符的高度宽度也要改成我们自己的,在该函数中,找到字符高度宽度的地方,替换为我们自己的,

再有函数dialer_inputbox_next_line,函数gui_dialer_input_box_prev_line,函数dialer_inputbox_prev_line,同上操作,替为我们自己的。

最后一个函数dialer_input_box_change_callback,也要采有同上的方法修改替换。

大致改的就这些地方的,怎么计划,怎么设计,各人有各人的方法,怎么方便就怎么干,贴的代码是从工程里直接复制出来的,有些乱,懒的改了。呵呵

 

 

6楼 wongshan 发表于 2009-12-21 10:45:00
效果图在这里 http://img9.tianya.cn/photo/2009/12/21/16575175_14289990.jpg http://img9.tianya.cn/photo/2009/12/21/16575176_14289990.jpg 我的是320*240的屏
5楼 wongshan 发表于 2009-12-21 9:56:00
还要注意一点,35里拨号数字输入出字符接口是mmi_fe_show_string_bordered_baseline(...).这个通用接口我还没有看是怎么实现的.:(
4楼 wongshan 发表于 2009-12-21 9:52:00
还有个is_dial_number_big_pic()函数体,贾哥没有提供,我直接用了个BOOL变量MMI_dialer_inputbox.Issmall来实现. BOOL is_dial_number_small_pic(void) { return MMI_dialer_inputbox.Issmall; } 在wgui_inputs_dialer_change_callback里加#ifdef MMI_DIALING_NUM_PICTURE MMI_dialer_inputbox.Issmall = FALSE; #endif 还要在计算是否需要换行的算法里改成 for (i = 0; i < text_length; i++) { UI_STRING_GET_NEXT_CHARACTER(b_text, ch); #ifdef MMI_DIALING_NUM_PICTURE text_width += get_number_image_width(); #else text_width = gui_get_character_width(ch); #endif text_width += MMI_dialer_inputbox.text_gap; if (text_width + 1 > MMI_dialer_inputbox.width - right_x*2) { if (max_char_height_in_dialer_box > 0) { if (++j >= (((MMI_dialer_inputbox.height - 1) / (max_char_height_in_dialer_box)))) { #ifdef MMI_DIALING_NUM_PICTURE MMI_dialer_inputbox.Issmall = TRUE; #endif MMI_dialer_inputbox.text_font = (gui_font_get_type(GUI_FONT_SIZE_DIALER_SMALL)); break; } else { #ifdef MMI_DIALING_NUM_PICTURE text_width = get_number_image_width(); #else text_width = gui_get_character_width(ch); #endif text_width += MMI_dialer_inputbox.text_gap; } } } } 应该可以显示咯!!!
3楼 wongshan 发表于 2009-12-21 9:51:00
我再来补个35平台下扩大数字窗口为全屏显示,拨号数字用图片代替吧.35平台处理拨号界面与25稍微有点不同. 1.把gui_dialer_input_box_next_line()里gui_get_character_width(current_character);和gui_get_character_width(0x31);都换成get_number_image_width();,这里是处理游标上下游动的位置. 2.在这个(wgui_inputs_dialer_change_callback)CALL back里 #ifdef MMI_DIALING_NUM_PICTURE text_height = get_number_image_hight(); #else text_height = query.pHeight; #endif #ifdef MMI_DIALING_NUM_PICTURE text_width = get_number_image_width(); #else text_width = gui_get_character_width(0x31); #endif #ifdef MMI_DIALING_NUM_PICTURE text_width += get_number_image_width(); #else text_width = gui_get_character_width(ch); #endif 这个CALL back是处理插入字符时回调函数,由键盘中断触发回调.没有包括处理游标.到此为至结合贾哥的方法就可以正确显示图片数字.下面来实现扩大拨号窗口为全屏显示,增加拨号数字个数.定义个宏吧:#define DIALER_EDIT 3.处理边框和计算图片大小的函数是DrawCate16CategoryDialingBoxBg();以后靠它里面的图片自动计算输入数字多少,换行等. #ifdef DIALER_EDIT x = 0;//MMI_CAT16_DIALING_BOX_BG_X - 60; #else x = MMI_CAT16_DIALING_BOX_BG_X; #endif #ifdef DIALER_EDIT x = w;//MMI_CAT16_DIALING_BOX_BG_X + w; #else x = MMI_CAT16_DIALING_BOX_BG_X + w; #endif #ifdef DIALER_EDIT x = 0;//MMI_CAT16_DIALING_BOX_BG_X - 60; #else x = MMI_CAT16_DIALING_BOX_BG_X; #endif 这时候大窗口已经显示出来了,前提是你必需把拨号窗口的图片弄成为全屏的.:)这时游标是定位不准的,再处理一下. ShowCategory16Screen().这个16号窗口只有在拨号时可以见,嘿嘿,我就直接深入里面去改了. #ifdef DIALER_EDIT w = img_w + 28; #else w = img_w; #endif gdi_image_get_dimension_id(IMG_DIALING_SCREEN_BG_LEFT, &img_w, &img_h); #ifdef DIALER_EDIT x = 7;//img_w;//MMI_CAT16_DIALING_BOX_BG_X + img_w - 65; h = img_h + 5; #else x = img_w ;//MMI_CAT16_DIALING_BOX_BG_X + img_w; h = img_h; #endif
2楼 blogercn 发表于 2009-8-13 15:37:00
这是我们写的一个函数,把字符转化为图片。定义一个结构体 typedef struct { UI_character_type charactor; U16 image_id; U16 image_small_id; }t_number_map_picture; 定义一个数组,把输入支字符与对应的图片对应: t_number_map_picture number_map_picture_table[15]= { {'0',IMG_DIALING_NUM_0,IMG_DIALING_NUM_0_SMALL}, {'1',IMG_DIALING_NUM_1,IMG_DIALING_NUM_1_SMALL}, {'2',IMG_DIALING_NUM_2,IMG_DIALING_NUM_2_SMALL}, {'3',IMG_DIALING_NUM_3,IMG_DIALING_NUM_3_SMALL}, {'4',IMG_DIALING_NUM_4,IMG_DIALING_NUM_4_SMALL}, {'5',IMG_DIALING_NUM_5,IMG_DIALING_NUM_5_SMALL}, {'6',IMG_DIALING_NUM_6,IMG_DIALING_NUM_6_SMALL}, {'7',IMG_DIALING_NUM_7,IMG_DIALING_NUM_7_SMALL}, {'8',IMG_DIALING_NUM_8,IMG_DIALING_NUM_8_SMALL}, {'9',IMG_DIALING_NUM_9,IMG_DIALING_NUM_9_SMALL}, {'+',IMG_DIALING_NUM_PLUS,IMG_DIALING_NUM_PLUS_SMALL}, {'*',IMG_DIALING_NUM_STAR,IMG_DIALING_NUM_STAR_SMALL}, {'#',IMG_DIALING_NUM_HASH,IMG_DIALING_NUM_HASH_SMALL}, {'p',IMG_DIALING_NUM_P,IMG_DIALING_NUM_P_SMALL}, {'w',IMG_DIALING_NUM_W,IMG_DIALING_NUM_W_SMALL} }; 写一个函数: U16 get_image_id_by_char(UI_character_type charactor,BOOL is_small) { int i; for(i=0;i<15;i++) { if(charactor==number_map_picture_table[i].charactor) { if(is_small) return number_map_picture_table[i].image_small_id; else return number_map_picture_table[i].image_id; } } return 0xffff; }
1楼 moonboy008 发表于 2009-8-13 15:24:00
楼主,get_image_id_by_char这个函数是啥啊,你怎么根据当前字符取得相应的图片的啊,这个才是要点啊,楼主没说明白啊

原创粉丝点击