当前位置:首页 >> 计算机软件及应用 >>

展讯MMI开发平台


MMI软件开发平台 MMI软件开发平台

Created by:Phoebe Chen : Figo Feng Lin Lin Date:3/3/2005 :

Contents
1. 2. 3. 4. 平台介绍和计划安排 Kenel接口 接口 GUI接口 接口 开发和调试实例

2011年1月11日

Proprietary and Confidential Information

2

平台介绍和计划
Spreadtrum提供了一套基于类似 mini widows机制 提供了一套基于类似 机制 开发平台, 源码。 的MMI开发平台,并且提供了与网络相关部分的 开发平台 并且提供了与网络相关部分的MMI源码。 源码 同时我们也提供了MMI开发的配套工具软件包。客户可以 开发的配套工具软件包。 同时我们也提供了 开发的配套工具软件包 基于此方便的做二次开发。现已有多款手机使用此平台进 基于此方便的做二次开发。 行开发。 行开发。

2011年1月11日

Proprietary and Confidential Information

3

平台结构
Call SMS CBS SS PB Game …. MMI E-Mail

MMS/WEB
ATC

Multimedia Applications Audio/Video/Test

Java App

PTT SIP

H.324/M RTP/RTCP

J2ME

WAP

SOFTWARE APPLICATION PLATFORM MMI Platform DAL(LCD,KPD,CHR) ( ) AUDIO, VIDEO MIDI MP3 MPEG4 H.263 Engines

OSA EFS

MN (Call,CB,NV,SS,SMS,GPRS) TCP/UDP IP/PPP Layer 3 Layer 2

RTOS

Diagnostics

Drivers(HAL)

Layer 1

2011年1月11日

Proprietary and Confidential Information

4

一个MMI示例 示例 一个

MMI

Kernel, Kernel,窗口 管理, 管理,消息队 列管理

Common Interface 1 3

通话记录
4

置 设

乐 娱

具 工

PB
5 6 7

2

GUI Control

CC

SMS

MMS

SS

开关机

STK WAP

Control Interface 12 9 10 13 14 11 15 16
1

17 18

USSD

DAL
2011年1月11日

GSM/GPRS

19

Proprietary and Confidential Information

5

简述MMI开发平台的三个重要概念 开发平台的三个重要概念 简述 Application :描述了 描述了MMI Kernel中处理 消息非常重要的模块, 中处理PS消息非常重要的模块, 描述了 中处理 消息非常重要的模块
例如sms, cc….. 例如

WINDOW:窗口,用于处理 窗口,用于处理focus消息(在此窗口下面才需要处理 消息( 消息
的消息) 的消息)…

Control:控件,也就是窗口要用到的公共的特性,比如编辑特性、 控件,也就是窗口要用到的公共的特性,比如编辑特性、
Text显示特性、动画特性等等… 显示特性、动画特性等等 显示特性

2011年1月11日

Proprietary and Confidential Information

6

Application、Window和Control的关系 、 和 的关系
APPLICATION

WINDOW CONTROL

CONTROL

CONTROL

2011年1月11日

Proprietary and Confidential Information

7

2.Kernel接口 接口
MMI Kernel主要提供完善的消息驱动流程和窗口管理 主要提供完善的消息驱动流程和窗口管理 主要提供完善的消息驱动流程和 机制。 机制。 为各种上层应用( 、 为各种上层应用(CC、SMS、WAP、MMS等)提供 、 、 等 良好的支持。 良好的支持。

2011年1月11日

Proprietary and Confidential Information

8

Kernel提供的功能 提供的功能
1.对消息流程进行管理 对消息流程进行管理 外部消息 ? 主要包括 消息、key消息、Timer消息和一些由其它模块 主要包括PS消息 消息、 消息、 消息 消息和一些由其它模块 发送过来的消息; 发送过来的消息; 内部消息 ? MMI模块内部发送、接收和处理的消息,不与其它模块发生 模块内部发送、 模块内部发送 接收和处理的消息, 任何关系.(现在我们用到的就是 现在我们用到的就是focus消息, 由窗口处理 , 消息, 任何关系 现在我们用到的就是 消息 由窗口处理, 这类消息使用最多最频繁) 这类消息使用最多最频繁 2.提供窗口管理机制 提供窗口管理机制 了解Kernel对窗口的管理机制: 对窗口的管理机制: 了解 对窗口的管理机制 ? 通过维护一个全局变量: 是 MMI Kernel中一个非常核心的数据结 通过维护一个全局变量: 中一个非常核心的数据结 它是整个窗口调度过程的核心,这个数据结构由MMI Kernel 构 , 它是整个窗口调度过程的核心, 这个数据结构由 维护。 维护。

2011年1月11日

Proprietary and Confidential Information

9

Application的概念 的概念
? Application:描述了MMI Kernel中非常重要的应用处理模块。 :描述了 中非常重要的应用处理模块。 中非常重要的应用处理模块 ? 可以分为两类: 可以分为两类: 需要注册系统消息的( 需要注册系统消息的(SMS Application, Call Application, Stk Application…) ) 不需要注册系统消息的(DC, Multimedia) 不需要注册系统消息的( )

2011年1月11日

Proprietary and Confidential Information

10

注册消息APPLICATION举例 举例 注册消息
? 系统消息由 系统消息由Application处理。如果需要系统消息,Application在初 处理。如果需要系统消息, 处理 在初 始化时要注册需处理的消息。 只会根据注册的Application来 始化时要注册需处理的消息 。Kernel只会根据注册的 只会根据注册的 来 分发。 分发。 ? 一个 消息可以被多个 一个PS消息可以被多个 消息可以被多个Application注册,Kernel会依次分发消息给 注册, 注册 会依次分发消息给 各个Application。 各个 。

我们现在需要注册消息的应用: 我们现在需要注册消息的应用: g_main_app g_cc_app g_sms_app g_mmiphone_app g_stk_app ……. ? 静态的,全局,一般在初始化时建立。 静态的,全局,一般在初始化时建立。 ?

2011年1月11日

Proprietary and Confidential Information

11

Window的概念 的概念
? Window:窗口是最终用户可以直接看到的一个个实在的屏幕,是直 :窗口是最终用户可以直接看到的一个个实在的屏幕, 接和用户打交道的,专门处理用户的按键输入等操作, 接和用户打交道的,专门处理用户的按键输入等操作,并且将最终用 户输入后的处理结果显示在屏幕上。 户输入后的处理结果显示在屏幕上。 ? 窗口的消息处理函数,用来处理最终用户的直接输入。 窗口的消息处理函数,用来处理最终用户的直接输入。 ? 窗口还要管理其所属的控件,将部分消息交给控件处理。 窗口还要管理其所属的控件,将部分消息交给控件处理。

2011年1月11日

Proprietary and Confidential Information

12

Control的概念 的概念
? Control:控件 , 也就是窗口要用到的公共的特性 , 比如编辑特性 、 : 控件,也就是窗口要用到的公共的特性,比如编辑特性、 Text显示特性、动画特性等等。 显示特性、 显示特性 动画特性等等。 ? 使用控件可以使开发人员专注于应用的功能开发,而不是过多限制在 使用控件可以使开发人员专注于应用的功能开发, 界面的开发。 界面的开发。

2011年1月11日

Proprietary and Confidential Information

13

Kernel中的窗口管理 中的窗口管理
? 窗口管理是 窗口管理是MMI Kernel中非常重要的部分,直接决定了上层应用的 中非常重要的部分, 中非常重要的部分 开发。 开发。 ? 窗口管理主要包括应用窗口和控件之间的管理和通信、各个窗口间稳 窗口管理主要包括应用窗口和控件之间的管理和通信、 定的切换。 定的切换。 ? 应用窗口负责上层的应用和显示等。 应用窗口负责上层的应用和显示等。

2011年1月11日

Proprietary and Confidential Information

14

Kernel中的窗口管理, 举例 中的窗口管理, 中的窗口管理
建立窗口的一些常量的属性:建立窗口 建立窗口的一些常量的属性:建立窗口wintab: WINDOW_TABLE( MMISMS_EDIT_WIN_TAB ) = { CLEAR_LCD, //清屏 清屏 WIN_PRIO( WIN_ONE_LEVEL ), //窗口优先级 窗口优先级 WIN_TITLE_ID( TXT_SMS_WRITE ), /固定的 固定的title 固定的 WIN_FUNC((uint32) HandleEditWinMsg ), //窗口消息处理函数 窗口消息处理函数 WIN_ID( MMISMS_EDIT_WIN_ID ), //ID CREATE_TEXTEDITBOX_CTRL( MMISMS_FULLSCREEN_CLIENT_LEFT, MMISMS_FULLSCREEN_CLIENT_TOP, MMISMS_FULLSCREEN_CLIENT_RIGHT, MMI_INPUT_EDITBOX_BOTTOM, MMISMS_MAX_UCS2_MESSAGE_LEN, MMISMS_MAX_MESSAGE_LEN, T9_PINYIN | T9_STROKE | T9_ENGLISH | T9_CHARACTER | T9_DIGITAL, T9_PINYIN_MODE, MMISMS_EDITWIN_EDITCTRL_ID), //控件 控件 END_WIN }; 详细的讲解请见后面应用实例

2011年1月11日

Proprietary and Confidential Information

15

窗口Priority 窗口
? 设置窗口优先级的目的是为了保护那些重要的窗口在处于 设置窗口优先级的目的是为了保护那些重要的窗口在处于Focus状态 状态 下不被打断,比如Call窗口,在Call的过程中不应该出现被 窗口, 的过程中不应该出现被SMS或者 下不被打断,比如 窗口 的过程中不应该出现被 或者 Alarm窗口打断,否则会影响 窗口打断, 的过程。 窗口打断 否则会影响Call的过程。 的过程 ? 我 们 在 这 里 暂 时 制 定 了 4 个 优 先 级 : WIN_LOWEST_LEVEL ,WIN_ONE_LEVEL,WIN_TWO_LEVEL, , , WIN_THREE_LEVEL。 。 ? 我 们 提 供 了 操 作 窗 口 优 先 级 的 两 个 函 数 : GetWinPriority , SetWinPriority。用户可以根据应用来调用这两个操作窗口优先级的 。 函数。在窗口的初始化(针对静态常口)和创建(针对动态窗口) 函数。在窗口的初始化(针对静态常口)和创建(针对动态窗口)过 程中,需要对窗口优先级进行设置。 程中,需要对窗口优先级进行设置。

2011年1月11日

Proprietary and Confidential Information

16

窗口Priority (续) 窗口
电 电 低 示 口 池 量 提 窗 等 3 级 关 窗 机 口

等 2 级

等 1 级

所 应 的 口 别 低 量 示 口 在 通 状 下 钟 间 有 用 窗 级 , 电 提 窗 , 非 话 态 闹 时 到 的 口 cc的 口 窗 , 窗

最 等 低 级

新 息 示 口 未 电 提 窗 , 钟 间 的 口 IDLE窗 信 提 窗 , 接 话 示 口 闹 时 到 窗 , 口

2011年1月11日

Proprietary and Confidential Information

17

虚拟窗口
? 虚拟窗口主要是指那种已经打开了但是无法得到 虚拟窗口主要是指那种已经打开了但是无法得到Focus的应用窗口。 的应用窗口。 的应用窗口 比如在打电话的过程中来了一条短信,因为Call的窗口的等级比较高, 的窗口的等级比较高, 比如在打电话的过程中来了一条短信,因为 的窗口的等级比较高 这个时候来短信的窗口无法得到Focus,也无法显示出来。 这个时候来短信的窗口无法得到 ,也无法显示出来。 ? 当前应用窗口结束后,系统会优先使虚拟窗口链表中的应用窗口得到 当前应用窗口结束后, Focus。 。 ? 等级越高的应用窗口越先打开,当应用窗口处于同一等级时,按照先 等级越高的应用窗口越先打开,当应用窗口处于同一等级时, 进先出方式(后打开的得到Focus )打开应用窗口。 打开应用窗口。 进先出方式(后打开的得到

2011年1月11日

Proprietary and Confidential Information

18

Kernel中的消息机制 中的消息机制

2011年1月11日

Proprietary and Confidential Information

19

消息分类
? 从消息的接收情况,分为 从消息的接收情况, 外部消息 ? 主要包括 消息、key消息、Timer消息和一些由其它模块发 主要包括PS消息 消息、 消息、 消息 消息和一些由其它模块发 送过来的消息; 送过来的消息; 内部消息, 内部消息, ? MMI模块内部发送、接收和处理的消息,不与其它模块发生任 模块内部发送、 模块内部发送 接收和处理的消息, 何关系. 何关系 ? 在App_Task的消息循环当中总是处理完内部消息之后再处理外部消 的消息循环当中总是处理完内部消息之后再处理外部消 息。

2011年1月11日

Proprietary and Confidential Information

20

消息分类( 消息分类(续)
? 根据不同的消息发送和处理流程来划分,消息分为4个类别: 根据不同的消息发送和处理流程来划分,消息分为4个类别: 第一类消息为系统消息(主要为PS消息和其它一些System消息) 第一类消息为系统消息( 主要为 PS 消息和其它一些 System 消息) , PS消息和其它一些System消息 只有App在注册后才能够处理这条消息,对于没有注册的系统消息, 只有App在注册后才能够处理这条消息,对于没有注册的系统消息, App在注册后才能够处理这条消息 将交给默认的MainApp处理。一条系统消息可以被多个App 将交给默认的 MainApp 处理 。 一条系统消息可以被多个 App 注册和处 MainApp处理 App注册和处 理。 第二类为Focus 消息, 第二类为 Focus 消息 , 系统直接将这种类型的消息直接发送给处于 Focus消息 状态的APP 对消息进行处理。 Focus状态的APP, APP对消息进行处理 Focus状态的APP,由APP对消息进行处理。 第三类广播消息,将根据Application的链表, 第三类广播消息,将根据Application的链表,调用每一个的消息处 Application的链表 理过程,这属于每一个App都要处理的过程,每个App 理过程, 这属于每一个 App 都要处理的过程,每个 App 只处理自己感 App都要处理的过程 App只处理自己感 兴趣的消息,至于App的处理方式(是交给Window处理还是App 兴趣的消息, 至于 App 的处理方式(是交给 Window 处理还是 App 本身 App的处理方式 Window处理还是App本身 处理) 系统没有任何限制。 这个暂时没有用过) 处理),系统没有任何限制。(这个暂时没有用过) 第四类定时器消息,由于定时器使用的比较广泛, 第四类定时器消息, 由于定时器使用的比较广泛 ,而且无法将其归 为系统消息或Focus消息,为了更好的处理,将其单独的作为一类消 消息, 为系统消息或 消息 为了更好的处理, 息处理。 息处理。
2011年1月11日
Proprietary and Confidential Information

21

外部消息处理
? 外部消息由 外部消息由Application来处理; 来处理; 来处理 ? 外部消息需要Application事先在 事先在mmk_regapp.def中定义 外部消息需要 事先在 中定义 应用所关心的消息; 应用所关心的消息; ? 外部消息队列由嵌入式操作系统维护; 外部消息队列由嵌入式操作系统维护;

2011年1月11日

Proprietary and Confidential Information

22

内部消息处理
? ? ? ? 内部消息不需要应用模块进行注册; 内部消息不需要应用模块进行注册; 内部消息由Window,Control处理; 处理; 内部消息由 , 处理 内部消息队列由Kernel模块维护; 模块维护; 内部消息队列由 模块维护 内部消息定义在mmk_msg.h中; 内部消息定义在 中

2011年1月11日

Proprietary and Confidential Information

23

消息处理流程

Queue (external) APPLICATION Queue (internal) MMI KERNEL

WINDOW

Control

2011年1月11日

Proprietary and Confidential Information

24

窗口通信
一般的窗口(包括应用窗口和控件)都需要彼此之间能够传送消息, 一般的窗口( 包括应用窗口和控件) 都需要彼此之间能够传送消息, 比如应用窗口需要将消息传给控件(一个刷新的消息)或者一个控件 比如应用窗口需要将消息传给控件(一个刷新的消息) 需要另一个控件处理消息等,这些都会涉及到窗口间的通信,一般有 需要另一个控件处理消息等,这些都会涉及到窗口间的通信, 两种通信方式: 两种通信方式: ? 异步通信方式,用MMK_PostMsg()函数来实现。 异步通信方式, MMK_PostMsg()函数来实现。 ()函数来实现 异步通信方式主要将消息发送到内部消息队列中, 异步通信方式主要将消息发送到内部消息队列中,即当发送消息的窗 口返回后,这条消息才会被处理。因为这是一种Focus消息, Focus消息 口返回后,这条消息才会被处理。因为这是一种Focus 消息,所以接 收的窗口必须是应用窗口,只有应用窗口才可以得到Focus Focus。 收的窗口必须是应用窗口,只有应用窗口才可以得到Focus。 ? 同步通信方式,用MMK_SendMsg()函数来实现。 同步通信方式, MMK_SendMsg 函数来实现 函数来实现。

2011年1月11日

Proprietary and Confidential Information

25

3 GUI接口 接口
? GUI 模块的主要功能就是给应用开发提供最基本的 图形控件接口,并跟窗口系统、消息机制结合, 图形控件接口,并跟窗口系统、消息机制结合,处 理基本的人机操作。 理基本的人机操作。

2011年1月11日

Proprietary and Confidential Information

26

Control的基本属性 的基本属性
? ? ? ? ? 图形化, 图形化,和用户交互 可以Active 可以 可接受消息, 可接受消息,有消息处理函数 依赖于窗口存在 每个具体的control有唯一 有唯一ID 每个具体的 有唯一

2011年1月11日

Proprietary and Confidential Information

27

控件的使用
有2种形式 种形式 ? 1. 在wintable中加入一个控件 中加入一个控件 ? 2. 动态创建

2011年1月11日

Proprietary and Confidential Information

28

控件的使用--wintable 控件的使用
? ? ? ? ? CREATE_MENU_CTRL CREATE_LISTBOX_CTRL CREATE_TEXTEDITBOX_CTRL CREATE_ANIMATION ……….

2011年1月11日

Proprietary and Confidential Information

29

控件的使用—动态创建 控件的使用 动态创建
? 创建控件: GUIANIMATE_Init() 创建控件 ? 将该控件加入到 将该控件加入到window中 MMK_CreateDynaCtrl() 中 ? 设定控件的参数:GUIANIMATE_SetParam 设定控件的参数

2011年1月11日

Proprietary and Confidential Information

30

GUI提供的控件 提供的控件
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Menu控件:菜单控件 控件: 控件 EditBox控件:编辑框控件 控件: 控件 ListBox控件:列表框控件 控件: 控件 TextBox控件:文本框控件 控件: 控件 Animate控件:图形控件 控件: 控件 MessageBox控件:消息框控件 控件: 控件 ProgressBox控件:进度条控件 控件: 控件 Punctuation控件:标点符号控件 控件: 控件 SoftKey控件:软键盘控件 控件: 控件 Calendar控件:日历控件 控件: 控件 字库: 字库:字体 LCD:显示屏 : T9:输入法 :

2011年1月11日

Proprietary and Confidential Information

31

Menu控件介绍 控件介绍
树状结构, 树状结构,显示多级菜单 实现菜单项的设定,显示,上下左右按键选择, 实现菜单项的设定,显示,上下左右按键选择, 选中后自动进入下级子菜单, 选中后自动进入下级子菜单,或者执行相应的操 作 菜单项文字过长滚动显示 分为两类:静态菜单,动态菜单 分为两类:静态菜单, 目前已实现的风格:文字菜单,旋转图, 目前已实现的风格:文字菜单,旋转图,九宫格

2011年1月11日

Proprietary and Confidential Information

32

添加静态菜单
1.添加 添加menu id (mmi_menutable.h) 添加 2.添加 添加menu and menu item (mmi_menutable.c) 添加 3.将新增加的 将新增加的menu加入 加入menutable中(mmi_menutable.def) 将新增加的 加入 中 4.为菜单项写处理函数 为菜单项写处理函数

2011年1月11日

Proprietary and Confidential Information

33

添加动态菜单
1. 调用 调用GUIMENU_InsertNode

2011年1月11日

Proprietary and Confidential Information

34

EditBox控件 控件
? 能正确编辑、录入数字号码、密码、字母及文字 能正确编辑、录入数字号码、密码、 ? 包括标题、软键盘;日期 、 时间 、 秒表 、 密码 、 包括标题 、 软键盘 ; 日期、时间、秒表、密码、 数字号码、字母、 数字号码、字母、非ascii码文字等正文的各种特 码文字等正文的各种特 殊显示 ? 显示编辑中的光标 ? 显示编辑中候选字的显示; 显示编辑中候选字的显示; ? 自动分页 ? 支持滚动条 ? 支持的输入法:T9 支持的输入法:

2011年1月11日

Proprietary and Confidential Information

35

ListBox控件 控件
?分为三类:单选,多选,文字 分为三类:单选,多选, 分为三类 ?支持上下滚动,连续滚动 支持上下滚动, 支持上下滚动 ?支持数据分批载入 支持数据分批载入 ?在标题上显示当前项和总项数(例如 2/200) 在标题上显示当前项和总项数( 在标题上显示当前项和总项数 ) ?动态添加,删除,更改 动态添加,删除, 动态添加

2011年1月11日

Proprietary and Confidential Information

36

TextBox控件 控件
? ? ? ? ? ? 显示一段文本 包括标题、软键盘; 包括标题、软键盘;文本内容 文本内容超过屏幕大小自动换行 支持滚动条 响应向上键向上卷动或翻页 响应向下键向下卷动或翻页

2011年1月11日

Proprietary and Confidential Information

37

Animate控件 控件
? 显示图形、图象、动画。 显示图形、图象、动画。 ? bmp, icon图像以及 图像以及jpg, gif等流行的图像格式示,自定义动画以及 等流行的图像格式示, 图像以及 等流行的图像格式示 gif等流行的动画格式的显示。 等流行的动画格式的显示。 等流行的动画格式的显示

2011年1月11日

Proprietary and Confidential Information

38

MessageBox控件 控件
?显示弹出框 显示弹出框 ?支持图片,动画,文字,softkey,背景色的设定 支持图片, 支持图片 动画,文字, , ?支持多种显示风格 支持多种显示风格

2011年1月11日

Proprietary and Confidential Information

39

Punctuation控件 控件
?显示当前支持的所有标点符号 显示当前支持的所有标点符号 ?和编辑框配合使用,将选中的标点符号插入到文本 和编辑框配合使用, 和编辑框配合使用 中

2011年1月11日

Proprietary and Confidential Information

40

Calendar控件 控件
?显示日历 显示日历 ?一页显示一个月的内容,12个月份有不同的背景图 一页显示一个月的内容, 个月份有不同的背景图 一页显示一个月的内容 年月,周日~周六 日期, 周六, 片,年月,周日 周六,日期,当前日与其他日有不 一样的颜色 ?响应上键向前移一月,响应下键向后移一月,响应 响应上键向前移一月, 响应上键向前移一月 响应下键向后移一月, 左键向前移一天,响应右键向后移一天。 左键向前移一天,响应右键向后移一天。

2011年1月11日

Proprietary and Confidential Information

41

其他控件
? SoftKey控件: 控件: 控件 可设定文字,背景, 可设定文字,背景,icon ? ProgressBox控件 控件 显示当前进度 可设定最大值,最小值, 可设定最大值,最小值,当前值 ? Label控件 控件 显示一行文字, 显示一行文字,过长则滚动显示 可动态更改显示区域, 可动态更改显示区域,文字

2011年1月11日

Proprietary and Confidential Information

42

GUI_LCD
? 直接在屏幕上画线,显示图片 直接在屏幕上画线, ? 对底层 驱动进行包装 对底层lcd驱动进行包装 ? LCD_DrawHLine, LCD_DrawVLine, LCD_DrawRect, LCD_FillRect, LCD_DisplayCompressedBmp, LCD_DrawLine….

2011年1月11日

Proprietary and Confidential Information

43

GUI_Font
? 直接在屏幕上显示字符串 ? 获得字体的高度,宽度 获得字体的高度, ? GUI_GetFontWidth,GUI_GetFontHeight, , , LCD_DisplayStringInRect,LCD_DisplayString….. ,

2011年1月11日

Proprietary and Confidential Information

44

Control风格 风格
? 每一类 每一类control和window的缺省显示风格定义在文件 和 的缺省显示风格定义在文件 mmi_theme.c/h中 中 ? 用户可自定义各种不同的字体,背景色,前景色 用户可自定义各种不同的字体,背景色, ? mmidisplay_data.c/h

2011年1月11日

Proprietary and Confidential Information

45

GUI接口的参考 接口的参考
详情参考GUI接口说明书及其相关头文件。 接口说明书及其相关头文件。 详情参考 接口说明书及其相关头文件

2011年1月11日

Proprietary and Confidential Information

46

应用实例:(以 应用为例) 应用实例:(以SMS应用为例) :( 应用为例
开发实例一、 开发实例一、Application的创建 的创建 开发实例二、利用 开发实例二、利用Window Table设计窗口 设计窗口 开发实例三、 开发实例三、更改图片铃声资源

2011年1月11日

Proprietary and Confidential Information

47

开发实例一、 开发实例一、Application的创建 的创建
Step 1:创建工作目录和相应的文件。 :创建工作目录和相应的文件。 Step 2:定义 变量。 :定义Application变量。 变量 Step 3:在mmk_ext_app.h中增加 中增加sms全局应用变量。 全局应用变量。 : 中增加 全局应用变量 Step 4:注册系统消息。 :注册系统消息。 Step 5:初始化 应用模块。 :初始化sms应用模块。 应用模块 Step 6:编写应用消息处理函数。 :编写应用消息处理函数。

2011年1月11日

Proprietary and Confidential Information

48

Step 1:创建工作目录和相应的文件。 :创建工作目录和相应的文件。
建立以下三个目录: 建立以下三个目录: ..\MS_APP\BMMI\Source\App\SMS ..\MS_APP\BMMI\Source\App\SMS\c ..\MS_APP\BMMI\Source\App\SMS\h 增加以下C/H文件 根据模块需要而定 文件(根据模块需要而定 增加以下 文件 根据模块需要而定) mmismsapp_main.c mmismsapp_order.c mmismsapp_wintab.c mmisms_api.h mmisms_app.h mmismsapp_wintab.h

2011年1月11日

Proprietary and Confidential Information

49

Step 2:定义 变量。 :定义Application变量。 变量
变量定义: 在mmisms_main.c中增加变量定义: 中 MMI_APPLICATION_T g_mmisms_app;//SMS的实体 的实体

2011年1月11日

Proprietary and Confidential Information

50

Step 3:在mmk_ext_app.h中增加 中增加sms : 中增加 全局应用变量
#ifdef __cplusplus extern "C" { #endif . . . extern MMI_APPLICATION_T extern MMI_APPLICATION_T extern MMI_APPLICATION_T . . . #ifdef __cplusplus } #endif
2011年1月11日

g_cc_app; g_mmisms_app;//SMS的实体 的实体 g_mmipb_app;

Proprietary and Confidential Information

51

Step 4:注册系统消息 :
文件中增加此应用模块希望处理的系统消息。 在mmk_regapp.def文件中增加此应用模块希望处理的系统消息。 文件中增加此应用模块希望处理的系统消息 例如, 应用可以接收消息ID号码在 例如,SMS应用可以接收消息 号码在 应用可以接收消息 号码在APP_MN_SMS_READY_IND到 到 APP_MN_SMSCB_REJ_IND之间的消息。则在 之间的消息。 之间的消息 则在mmk_regapp.def文件中增 文件中增 加: REG_APP(APP_MN_SMS_READY_IND, APP_MN_SMSCB_REJ_IND,&g_mmisms_app)

2011年1月11日

Proprietary and Confidential Information

52

Step 5:初始化 应用模块。 :初始化sms应用模块。 应用模块
中增加对sms应用模块的初始化: 应用模块的初始化: 在MMIMAIN.C中增加对 中增加对 应用模块的初始化 void APP_Init(void) { . . . MMIPHONE_AppInit(); MMISMS_AppInit();//sms应用模块的初始化 应用模块的初始化 MMIPB_InitApp(); . . . }

2011年1月11日

Proprietary and Confidential Information

53

Step 5:初始化 应用模块(续 :初始化sms应用模块 续) 应用模块
模块的初始化函数中指定消息处理函数和component类型 在sms模块的初始化函数中指定消息处理函数和 模块的初始化函数中指定消息处理函数和 类型 void MMISMS_AppInit() { . . . g_mmisms_app.ProcessMsg = HandlePsMsg; g_mmisms_app.component_type = CT_APPLICATION; . . . }

2011年1月11日

Proprietary and Confidential Information

54

Step 6:编写应用消息处理函数 :
LOCAL MMI_RESULT_E HandlePsMsg ( PWND app_ptr, uint16 msg_id, DPARAM

param) { uint8 result = MMI_RESULT_TRUE; switch ( msg_id ) { case APP_MN_SMS_READY_IND: break; case APP_MN_READ_SMS_CNF: break;

2011年1月11日

Proprietary and Confidential Information

55

Step 6:编写应用消息处理函数(续) :编写应用消息处理函数(
case APP_MN_UPDATE_SMS_STATE_CNF: break; . . . default: result = MMI_RESULT_FALSE; break; } return ( result ); }

2011年1月11日

Proprietary and Confidential Information

56

开发实例二、利用 开发实例二、利用Window Table设计窗口 设计窗口
请参考MMK_Window_Table开发说明书 开发说明书.doc 请参考 开发说明书

Step 1:在win.def文件中声明窗口表。 文件中声明窗口表。 : 文件中声明窗口表 Step 2:在mmk_type.h文件中声明窗口 。 文件中声明窗口ID。 : 文件中声明窗口 Step 3:在mmk_type.h文件中声明控件 。 文件中声明控件ID。 : 文件中声明控件 Step 4:在mmi_text.def文件中声明文本的 。 文件中声明文本的ID。 : 文件中声明文本的 Step 5:创建 :创建Window Table表。 表 Step 6:使用 表打开窗口。 :使用Window Table表打开窗口。 表打开窗口 Step 7:实现窗口的消息处理函数。 :实现窗口的消息处理函数。 Step 8:依次类似编写每个 :依次类似编写每个Window。 。

2011年1月11日

Proprietary and Confidential Information

57

Step 1:在win.def文件中声明窗口表。 文件中声明窗口表。 : 文件中声明窗口表
. . . WIN_DEF( MMISMS_MENUWIN_TAB ) WIN_DEF( MMISMS_EDIT_WIN_TAB ) WIN_DEF( MMISMS_EDITOPTION_WIN_TAB ) . . .

2011年1月11日

Proprietary and Confidential Information

58

Step 2:在mmk_type.h文件中声明窗口 文件中声明窗口ID : 文件中声明窗口
typedef enum { BEGIN_WIN_ID, . . . MMISMS_MENU_WIN_ID, MMISMS_EDIT_WIN_ID, MMISMS_EDITOPTION_WIN_ID, . . . }MMI_WINDOW_ID_E;

2011年1月11日

Proprietary and Confidential Information

59

Step 3:在mmk_type.h文件中声明控件 文件中声明控件ID : 文件中声明控件
typedef enum { BEGIN_CTRL_ID, . . . MMISMS_MENU_CTRL_ID, MMISMS_EDITWIN_EDITCTRL_ID, MMISMS_SENDNUMOPTION_LISTCTRL_ID, . . . }MMI_CONTROL_ID_E;

2011年1月11日

Proprietary and Confidential Information

60

Step 4:在mmi_text.def文件中声明文本的 : 文件中声明文本的 ID。 。
. . . TEXT_DEF(TXT_SMS_WRITE, "Write", "\x06\x51\x99\x6d\x88\x60\x6f")//写消息 写消息 . . .

2011年1月11日

Proprietary and Confidential Information

61

Step 5:创建 :创建Window Table表。 表
WINDOW_TABLE( MMISMS_EDIT_WIN_TAB ) = { CLEAR_LCD, WIN_PRIO( WIN_ONE_LEVEL ), WIN_TITLE_ID( TXT_SMS_WRITE ), WIN_FUNC((uint32) HandleEditWinMsg ), WIN_ID( MMISMS_EDIT_WIN_ID ), CREATE_TEXTEDITBOX_CTRL(0, 20, 127, 110, MMISMS_MAX_UCS2_MESSAGE_LEN, MMISMS_MAX_MESSAGE_LEN, T9_PINYIN | T9_STROKE | T9_ENGLISH | T9_CHARACTER | T9_DIGITAL, T9_PINYIN_MODE, MMISMS_EDITWIN_EDITCTRL_ID), END_WIN };
2011年1月11日
Proprietary and Confidential Information

62

Step 5:创建 :创建Window Table表(续) 表
说明: 说明: WINDOW_TABLE:是用来定义 数组的, :是用来定义Table数组的,后面的参数是数组名, 数组的 后面的参数是数组名, 在应用调用MMK_CreateWin的时候需要用到。 的时候需要用到。 在应用调用 的时候需要用到 CLEAR_LCD:清除 :清除LCD Buffer。 。 WIN_PRIO:设置窗口优先级的,参数为 :设置窗口优先级的,参数为MMI_WIN_PRIORITY_E枚举 枚举 类型。 类型。 WIN_TITLE_ID:用于设置窗口的标题。后面的参数是窗口文本的 。 :用于设置窗口的标题。后面的参数是窗口文本的ID。 WIN_FUNC:设置窗口的消息处理函数。后面的参数是该窗口的消息 :设置窗口的消息处理函数。 处理函数。 处理函数。 WIN_ID:设置窗口 ,参数为 枚举类型。 :设置窗口ID,参数为MMI_WINDOW_ID_E枚举类型。 枚举类型 CREATE_TEXTEDITBOX_CTRL:用于创建一个 控件。 :用于创建一个Text EditBox控件。 控件 END_WIN:Window Table的结束标志,每一个 的结束标志, : 的结束标志 每一个Window Table的最后 的最后 一个成员必须是END_WIN宏。 一个成员必须是 宏

2011年1月11日

Proprietary and Confidential Information

63

Step 6:使用 表打开窗口。 :使用Window Table表打开窗口。 表打开窗口

MMK_CreateWin((uint32*)MMISMS_EDIT_WIN_TAB, PNULL);

2011年1月11日

Proprietary and Confidential Information

64

Step 7:实现窗口的消息处理函数 :
LOCAL MMI_RESULT_E HandleEditWinMsg( MMI_WINDOW_ID_E win_id, MMI_MESSAGE_ID_E msg_id, DPARAM param ) { MMI_RESULT_E recode = MMI_RESULT_TRUE; TEXTEDIT_STRING_INFO_T edit_string; switch(msg_id) { case MSG_OPEN_WINDOW: break; case MSG_FULL_PAINT: break;
2011年1月11日
Proprietary and Confidential Information

65

Step 7:实现窗口的消息处理函数(续) :实现窗口的消息处理函数(
case MSG_CLOSE_WINDOW: break; . . . default: recode = MMI_RESULT_FALSE; break; } return recode; }

2011年1月11日

Proprietary and Confidential Information

66

Step 8:依次类似编写每个 :依次类似编写每个Window

2011年1月11日

Proprietary and Confidential Information

67

2011年1月11日

Proprietary and Confidential Information

68


赞助商链接
相关文章:
展讯学习笔记(整理)
展讯平台 MMI学习笔记 9页 免费 展讯平台窗口创建流程 6页 免费 展讯 开机流程...展讯开发模式和 MTK 的很类似, 基本也是给厂家提供整体解决方案, 与 MTK 的...
展讯_软件发布流程
展讯_软件发布流程_信息与通信_工程科技_专业资料。展讯_软件发布流程软件...export IM_HANDWRITING = S9 export MMI_S9_FONT_SIZE20 = TRUE (240*320 ...
更多相关标签: