@
目录简介
MMI界面说明
基础
在界面上打印 Hello World
下面是我们要实现的效果,在手机上面实现打印 Hello World:
程序入口
借用现有的程序入口 goto_main_menu,这个是主菜单的入口函数(在MainMenu.c中),在Idle时按左软件就会进入主菜单。
我们要借用的代码如下:
void mmi_myapp_entry(void)
{
//我们的程序由此开始
}
void goto_main_menu(void)
{
// 将主菜单切换成我们的程序
mmi_myapp_entry();
return;
}
打印文本
入口函数写好了,接下来我们使用显示文本串函数
void UI_print_text(UI_string_type text);
这个函数跟DOS中的printf使用方式差不多
extern void UI_print_text(UI_string_type text);
#define gui_print_text UI_print_text
void mmi_myapp_entry(void)
{
//我们的程序由此开始
//因为我们平台默认是多国语言的,所以基本上文本相关的函数都只接受Uinicode编码
//所以这里使用强制转换成Uinicode编码输入
gui_print_text(L"Hello World");
}
可是如图中所示,我们看不到任何效果!
为什么会这样?这是因为我们平台里面,当所有绘画动作代码结束时,如果不强制刷新屏幕是看不到效果的。
刷新屏幕
函数 gui_BLT_double_buffer 用来刷新屏幕:
void mmi_myapp_entry(void)
{
//我们的程序由此开始
//因为我们平台默认是多国语言的,所以基本上文本相关的函数都只接受Uinicode编码
//所以这里使用强制转换成Uinicode编码输入
gui_print_text(L"Hello World");
// 刷新屏幕 四个参数指明了刷新的范围 一般默认为刷新整个屏幕
gui_BLT_double_buffer(0, 0, UI_device_width - 1, UI_device_height - 1);
}
"Hello World"在屏幕的左下角,当然,这样的效果还不能让人满意。
清屏
此时需要将背景去掉
void mmi_myapp_entry(void)
{
//我们的程序由此开始
//将整个屏幕刷成白色的
clear_screen();
//因为我们平台默认是多国语言的,所以基本上文本相关的函数都只接受Uinicode编码
//所以这里使用强制转换成Uinicode编码输入
gui_print_text(L"Hello World");
// 刷新屏幕 四个参数指明了刷新的范围 一般默认为刷新整个屏幕
gui_BLT_double_buffer(0, 0, UI_device_width - 1, UI_device_height - 1);
}
这样一来就好看多了
文本属性
函数 gui_move_text_cursor 用来设置文本输出的起始位置,
函数 gui_set_text_color 用来修改文本颜色
void mmi_myapp_entry(void)
{
//我们的程序由此开始
//将整个屏幕刷成白色的
clear_screen();
//修改显示位置
gui_move_text_cursor(30, 69);
//设置文本红色
gui_set_text_color(UI_COLOR_RED);
//因为我们平台默认是多国语言的,所以基本上文本相关的函数都只接受Uinicode编码
//所以这里使用强制转换成Uinicode编码输入
gui_print_text(L"Hello World");
// 刷新屏幕 四个参数指明了刷新的范围 一般默认为刷新整个屏幕
gui_BLT_double_buffer(0, 0, UI_device_width - 1, UI_device_height - 1);
}
因为文本属性设置时针对整个系统的,并且不会有默认值,所以在每次设置文本的时候都要设置文本属性。
总结
至此,完成一个简单的mmi界面功能。
屏幕
新的屏幕
上一章的屏幕输出后,我们只要稍微等上一会,就会发现屏幕上多出一些不想要的东西。
是因为Idle中的东西出现在这里,因为当我们进入一个新的程序的时候,如果上一个程序没有手动退出,那么上一个程序一直都是存活的,
而这些多出来的东西就是因为我们没有强制退出Idle。
void mmi_myapp_entry(void)
{
//我们的程序由此开始
//退出上一个程序,进入新程序
EntryNewScreen(MAIN_MENU_SCREENID, NULL, NULL, NULL);
entry_full_screen();
//将整个屏幕刷成白色的
clear_screen();
//修改显示位置
gui_move_text_cursor(30, 69);
//设置文本红色
gui_set_text_color(UI_COLOR_RED);
//因为我们平台默认是多国语言的,所以基本上文本相关的函数都只接受Uinicode编码
//所以这里使用强制转换成Uinicode编码输入
gui_print_text(L"Hello World");
// 刷新屏幕 四个参数指明了刷新的范围 一般默认为刷新整个屏幕
gui_BLT_double_buffer(0, 0, UI_device_width - 1, UI_device_height - 1);
}
屏幕历史
在我们的系统中建立了一套屏幕历史管理机制,只要在调用EntryNewScreen时传入我们新进入屏幕的ID及屏幕的入口函数,系统就会在下次调用
EntryNewScreen时,自动将我们的屏幕加入到历史记录中,当新的屏幕退出后,系统也会将我们的屏幕从历史中弹出并显示出来。
U8 EntryNewScreen(U16 newscrnID, FuncPtr newExitHandler, FuncPtr newEntryHandler, void *flag);
第一个参数:新显示屏幕的序号,每个屏幕都有一个全局唯一的序号,这样方便系统管理
第二个参数:屏幕的退出函数,系统在强制退出我们的屏幕时会自动调用此函数,我们可以在其中做一些资源释放等方面的工作,没有则设置为NULL
第三个参数:屏幕的入口函数,只有传入此参数,系统才会将屏幕自动加入历史。
第四个参数:暂不使用
void mmi_myapp_entry(void)
{
//我们的程序由此开始
//退出上一个程序,进入新程序
EntryNewScreen(MAIN_MENU_SCREENID, NULL, mmi_myapp_entry, NULL);
entry_full_screen();
//将整个屏幕刷成白色的
clear_screen();
//修改显示位置
gui_move_text_cursor(30, 69);
//设置文本红色
gui_set_text_color(UI_COLOR_RED);
//因为我们平台默认是多国语言的,所以基本上文本相关的函数都只接受Uinicode编码
//所以这里使用强制转换成Uinicode编码输入
gui_print_text(L"Hello World");
// 刷新屏幕 四个参数指明了刷新的范围 一般默认为刷新整个屏幕
gui_BLT_double_buffer(0, 0, UI_device_width - 1, UI_device_height - 1);
}
我们的屏幕是独占整个显示系统及交互系统的,也就是说我们的系统在任何时候只能由一个屏幕来控制。
返回最近的屏幕
有进入就有退出,退出屏幕也需要手动执行,我们通常用GoBackHistory通知系统将历史中最后一次显示的屏幕弹出来
void mmi_myapp_entry(void)
{
//我们的程序由此开始
//退出上一个程序,进入新程序
EntryNewScreen(MAIN_MENU_SCREENID, NULL, mmi_myapp_entry, NULL);
entry_full_screen();
//将整个屏幕刷成白色的
clear_screen();
//修改显示位置
gui_move_text_cursor(30, 69);
//设置文本红色
gui_set_text_color(UI_COLOR_RED);
//因为我们平台默认是多国语言的,所以基本上文本相关的函数都只接受Uinicode编码
//所以这里使用强制转换成Uinicode编码输入
gui_print_text(L"Hello World");
//刷新屏幕 四个参数指明了刷新的范围 一般默认为刷新整个屏幕
gui_BLT_double_buffer(0, 0, UI_device_width - 1, UI_device_height - 1);
// 返回历史记录中最近的一个
SetKeyHandler(GoBackHistory, KEY_RSK, KEY_EVENT_UP);
}
我们通常将右软件设为返回最近显示的屏幕。
总结
至此,一个可观看可操作的简单MMI程序已经出来了,接下来将程序标准化,规范化。