MMI 实例培训教程
www.fugui.name
MMI 实例培训教程
MTK 无线通信平台
傅贵
MAIL: mail@fugui.name
MSN: fu_gui@msn.com
第 1 页
MMI 实例培训教程
www.fugui.name
第一部份:基础............................................................................................................................................................................. 3
第一章:开始......................................................................................................................................................................... 3
第二章:屏幕......................................................................................................................................................................... 8
第三章:程序....................................................................................................................................................................... 12
第四章:资源....................................................................................................................................................................... 15
第五章:字串资源...............................................................................................................................................................19
第六章:菜单资源...............................................................................................................................................................21
第七章:图像资源...............................................................................................................................................................26
第二部份:绘画...........................................................................................................................................................................28
第八章:开始....................................................................................................................................................................... 28
第九章:文本....................................................................................................................................................................... 32
第十章:图形....................................................................................................................................................................... 36
第十一章:图像 ...................................................................................................................................................................41
第十二章:背景 ...................................................................................................................................................................47
第十三章:层 ....................................................................................................................................................................... 55
第三部份:互动...........................................................................................................................................................................65
第十四章:开始 ...................................................................................................................................................................65
第十五章:控件 ...................................................................................................................................................................70
第十六章:键盘 ...................................................................................................................................................................75
第十七章:触摸屏 ...............................................................................................................................................................81
第十八章:高级控件 ...........................................................................................................................................................86
第十九章:屏幕模板 ...........................................................................................................................................................90
第二十章:高级模板 ...........................................................................................................................................................98
第 2 页
FuGui
MMI 实例培训教程
第一部份:基础
www.fugui.name
第一章:开始
准备
在开始之前,假定你已经能够在手机中看到如下一些画面:
Idle
MainMenu
图 1.1
Hello, World
学程序都由"Hello, World"开始,我们也这样,下面是我们在手机中"Hello, World"的显示效果:
DOS 中的" Hello, World "实现如下:
main ()
{
printf ("Hello, World ") ;
}
图 1.2
代码 1.1
第 3 页
FuGui
MMI 实例培训教程
www.fugui.name
当然,我们平台所用的操作系统不是 DOS,所以 DOS 下的函数我们基本不能用,包括程序入口方式也得改。
程序入口
嵌入式系统与通用系统不同,我们的应用程序通常与整个系统是固定在一起的。通俗一点说,MMI 就是一个大的程序,
我们写小程序就是大程序的一个个固定分支。要写自己的程序,首先就得在大程序中添加一个新入口。当然,添加新
入口有点麻烦,所以我们就暂时借用现有程序的入口 goto_main_menu,这是主菜单的入口函数(在 MainMenu.c 中),
在 Idle 时按左软键就会进入主菜单。
我们要借用的代码如下(注:红色部份为修改后的代码,后同):
void mmi_myapp_entry(void)
{
//我们的程序由此开始!
}
void goto_main_menu(void)
{
//将主菜单切换成我们的程序:
mmi_myapp_entry();
return;
… …
}
下几章会详细介绍怎样添加一个新入口,到时候我们再将此处改回来。
代码 1.2
打印文本
我们用来显示文本串的函数原型如下:
void (*gui_print_text) (UI_string_type _text);
这个函数跟 DOS 中的 printf 使用方式差不多:
void mmi_myapp_entry(void)
{
//我们的程序由此开始!
gui_print_text(L"Hello, World");
}
因为我们平台默认是基于多国语言的,所以基本上与文本相关的函数都只接受 Uinicode 编码,在这里我们以 L"Hello,
World" 方式强制将字串转换为 Uinicode 编码输入。最终运行结果如下(开机以后按左软键):
代码 1.2
第 4 页
FuGui
MMI 实例培训教程
www.fugui.name
可是如图中所示我们看不到任何效果!
为什么会这样?这是因为我们平台里面,当所有绘画动作的代码结束时,如果不强制刷新屏幕是见不到效果的。
图 1.3
刷新屏幕
函数 gui_BLT_double_buffer 用来刷新屏幕:
void mmi_myapp_entry(void)
{
//我们的程序由此开始!
gui_print_text(L"Hello, World");
gui_BLT_double_buffer(0, 0, UI_device_width - 1, UI_device_height - 1);
}
四个参数指明了我们要刷新的范围,一般我们都默认刷新整个屏幕,结果如下:
代码 1.3
"Hello, World"在屏幕的左下角,当然,这样的效果还不能让人满意。
图 1.4
清屏
首先,我们得将背景去掉,因为我系统默认不会做任何事情,所以什么事都得自己来!
第 5 页
FuGui
www.fugui.name
MMI 实例培训教程
使用函数 clear_screen 就可以将整个屏幕刷成白色:
void mmi_myapp_entry(void)
{
//我们的程序由此开始!
clear_screen();
gui_print_text(L"Hello, World");
gui_BLT_double_buffer(0, 0, UI_device_width - 1, UI_device_height - 1);
}
结果如下:
代码 1.4
图 1.5
这样好看多了,下一步就是修改文本显示位置以及文本颜色:
文本属性
函数 gui_move_text_cursor 用来设置文本输出的起始位置,函数 gui_set_text_color 用来修改文本颜色:
void mmi_myapp_entry(void)
{
//我们的程序由此开始!
clear_screen();
gui_move_text_cursor(50, 100);
gui_set_text_color(UI_COLOR_RED);
gui_print_text(L"Hello, World");
gui_BLT_double_buffer(0, 0, UI_device_width - 1, UI_device_height - 1);
}
结果如下:
代码 1.4
第 6 页
FuGui
MMI 实例培训教程
www.fugui.name
因为文本属性设置是针对整个系统的,并且不会有默认值,所以在每次输出文本前我们都要记得重设文本属性。
图 1.5
总结
至此,一个最简单的 MMI 程序已经出来,当然,这只是能够看一下而已,要想让程序正常运行,我们还得进一步完善。
第 7 页
FuGui
MMI 实例培训教程
www.fugui.name
第二章:屏幕
新的屏幕
上一章的屏幕输出后,我们只要稍微等上一会,就会发现屏幕上多出一些不想要的东西,见下图:
图 2.1
仔细看一下就会发现这是 Idle 中的东西,会什么会出现在这里?因为当我们进入一个新的程序时,如果不手动退出上
一个程序,那么上一个程序一直都是活着的,这些多出来的东西就是因为我们没有强制退出 Idle。
退出上一个程序的方法是在进入新程序时调用 EntryNewScreen:
void mmi_myapp_entry(void)
{
EntryNewScreen(MAIN_MENU_SCREENID, NULL, NULL, NULL);
clear_screen();
gui_move_text_cursor(50, 100);
gui_set_text_color(UI_COLOR_RED);
gui_print_text(L"Hello, World");
gui_BLT_double_buffer(0, 0, UI_device_width - 1, UI_device_height - 1);
}
全屏显示
代码 2.1
但是调用 EntryNewScreen 后,我们还是会在屏幕中见到一些别的东西,见下图:
第 8 页
FuGui