《第六章Symbian基础窗口界面程序设计》由会员分享,可在线阅读,更多相关《第六章Symbian基础窗口界面程序设计(36页珍藏版)》请在金锄头文库上搜索。
1、第六章Symbian 基础窗口界面程序设计1完成本章内容之后我们将能够:掌握与UI相关的API和组件知道如何处理用户的输入了解Series 60 和UIQ UI的相同和不同之处本本 章章 目目 标标2概述 Series 60是Nokia创建的一系列开发人员平台之一,它有几个版本。1.0、1.1和1.2版本(统称为Series 60平台1.x)基于Symbian OS 6.1。本章描述的Series 60平台2.0基于Symbian OS 7.0。平台2.0引入的影响到应用程序UI的主要功能是皮肤(skin)和双向文本支持。皮肤允许用户通过更改背景位图、图标和颜色方案自定义UI。皮肤在本章后面描
2、述。双向文本支持功能支持从右向左书写的语言(例如希伯来语和阿拉伯语)的编辑和显示。它也影响到整个UI中控件的顺序和对齐方式。3 概述 所有Series 60手机都使用一个允许在4个方向导航的导航控制器、一个确认键和屏幕下面两个称为软键(softkey)的硬件按钮。这些按钮使Series 60手机易于单手使用。用户可以使用手机的键盘输入文本并可以选择使用预测式文本输入系统。 UIQ由UIQ Technology AB(Symbian Ltd的一家子公司)生产。UIQ 1.0在2000年9月发布,此后还发布了几个版本。本章介绍运行在Symbian OS 7.0上的2.1版本。4 UIQ手机有一个大
3、的触摸屏(6cmScm或4cm6cm),使用触笔作为它们的主输入设备。不过,像Series 60一样,所有UIQ手机都提供一个硬件确认键和其他导航硬件键,至少包括向上和向下键,可选的包括向左和向右键,以便于单手浏览手机的内容。触摸屏允许使用一些文本输入方法(如手写识别)和一个屏幕虚拟键盘。 对于用户,这些UI有很大差异,但是对于程序员,它们有很多共同点。它们有同样的基础框架,这意味着,为这两种UI编写的应用程序具有同样的结构、应用程序基础、文档、app UI和视图类。 概述5 Series 60和UIQ都支持很多种设备。手机制造商可以自定义UI的风格,例如图标、颜色方案、字体和文本,但是运行在
4、同样平台的全部手机具有相同的基本屏幕布局和UI组件。自定义风格自定义风格 Symbian OS包括一个抽象风格层,在一个称为Uiklaf的组件中由UI实现。Uikon使用这个组件得到关于UI的信息。例如,Uiklaf定义UI的标准字体和控件周围边框的外观。在一些手机中,应用程序也在移动到背景之前简单淡出。这个行为在Uiklaf中定义。屏幕布局屏幕布局6 全部Uiklaf类有一个Laf前缀。它们只是打算在Uikon内部使用。 作为一个例外,淡出在其他情况中使用。例如在两种UI中,当一个对话框显示时,前台应用程序都淡出;只有在Series 60中,当菜单窗格显示时,它才淡出。屏幕布局屏幕布局7 S
5、eries 60Series 60在Series 60中,屏幕分为3个区域或窗格(如图3.1所示)。这3个窗格称为状态窗格、主窗格和控制(或软键)窗格。屏幕布局屏幕布局8 状态窗格状态窗格 状态窗格(通常显示在屏幕的顶端)显示前台应用程序的相关信息,包括它的标题和图标,以及手机相关的常规信息,例如信号强度。 它由6个子窗格组成。这些子窗格从左到右布局(或在某些情况下从右到左,例如在阿拉伯和希伯来布局中,其中许多控件的顺序相反)。 屏幕布局屏幕布局9 1.信号窗格(信号强度指示符)。2.上下文窗格(显示应用程序的图标)。3.标题窗格(显示应用程序的标题)。4.导航窗格(可以包含选项卡、图像或文本
6、,或者为空)。5.电池窗格(电池强度指示符)。6.小指示符窗格(包含连接和一些其他指示符)。 其中,只有标题窗格、上下文窗格和导航窗格可以由应用程序编写人员自定义。 屏幕布局屏幕布局10 导航窗格默认为空,但是它可以包含一个选项卡组,多页对话框中表示当前页以及是否有更多视图或页。 在单一视图应用程序中,导航窗格可以包含一个标签或图像,而不是一个选项卡组。当视图中的项是一个序列的一部分时,这可以发挥作用。在这种情况下,左和右箭头位图可以说明有下一项或前一项。例如,日历应用程序在导航标签中显示日期并使用这个标签进行导航。 屏幕布局屏幕布局11 当应用程序在文本编辑状态时,导航窗格自动显示一个编辑指
7、示符,说明输入模式是数字还是字母,以及是大写还是小写(使用非西方语言的手机有不同的输入模式)。 应用程序的初始状态窗格在应用程序的EIK_APP_INFO资源(全部应用程序的资源文件都需要)中定义。 屏幕布局屏幕布局12 状态窗格由STATUS_PANE_APP_MODEL资源定义,它的子窗格由SPANE_PANES定义。有下列类型的子窗格资源:lTITLE_PANE。可以选择包含图标,而不用文本,但是不能两者都包含。默认是从它的aif文件读取应用程序的标题。l CONTEXT_PANE。包含表示应用程序的图标。这个图标显示在标题旁边。默认是从它的aif文件读取应用程序的图标。l NAVI_D
8、ECORATOR。可以包含不同类型的控件,包括选项卡组(TAB_GROUP)、文本标签(NAVI_LABEL)或图像(NAVI_IMAGE)。 屏幕布局屏幕布局13 控制窗格控制窗格 控制窗格包含软键标签和滚动指示符。软键标签是一个字符串,通常是标识与软键关联的操作的单一短字。标签基于应用程序的状态而改变。常常,左侧软键标记为“选项(Option)”,它激活菜单窗格。它也可以用于发出确认的命令,例如“Ok”、“选择”和“是”,而右侧软键用于“否”、“后退”、“取消”和“退出(Exit)”命令。 屏幕布局屏幕布局14 两个软键都使用CBA资源结构来定义,该结构包含定义左侧和右侧软键的两个CBA_
9、BUTTONS的数组。这些结构在uikon.rh中声明。 Series 60在avkon.rsg中声明许多标准CBA资源,名称以R_AVKON_SOFTKEYS开始。可以重新使用这些资源或定义自己的资源。 屏幕布局屏幕布局15 例如,下面是Series 60对于“是”和“否”软键的资源定义:RESOURCE CBA_r avkon_softkeys_yes_nobuttons=CBA_BUTTON id=EAknSoftkeyYes; txt=text_softkey_yes; ,CBA_BUTTON id=EAknSoftkeyNo; txt=text_softkey_no; ;屏幕布局屏幕
10、布局16 txt和id字段用于定义软键标签和它调用的命令ID。注意,“是/否”文本在一个包含本地化文本字符串的单独文件中定义。软键发出的命令ID在avkon.hrh中定义。一些常见命令ID:1.EaknSoftkeyOk。2.EaknSoftkeyCancel。3.EaknSoftkeySelect。4.EaknSoftkeyOptions。5.EaknSoftkeyBack。6.EakaSoftkeyDone。7.EakaSoftkeyClose。8.EaknSoftkeyExit。 屏幕布局屏幕布局17 软键可以在以下几个位置定义:lcba字段在EIK_APP_INFO资源中。lbutto
11、ns字段在DIALOG资源中。lcba字段在AVKON_VIEW资源中。lsoftkeys字段在AVKON_LIST_QUERY资源中。lsoftkeys字段AVKON_MULTIPLESELECTION_LIST_QUERY资源中。 应用程序的初始软键在EIK_APP_INFO资源中定义;常常是“选项(Option)”和“退出(Exit)”(R_AVKON_SOFTKEYS_OPTIONS_EXIT)。“选项”菜单窗格由EIK_APP_INFO的menubar字段定义。 屏幕布局屏幕布局18 3.3.主窗格主窗格 这是状态窗格和控制窗格之间的区域,通常是应用程序可以进行绘制的区域它是appU
12、I的ClientRect()函数返回的区域。3.3.33.3.3UIQUIQ UIQ中的屏幕分为5个区域(如图3.2所示),其中之一的工具栏是可选的。屏幕布局屏幕布局19 屏幕布局屏幕布局20 1 1应用程序选取器应用程序选取器 它用于在应用程序间切换。最右边的图标切换到应用程序启动器,它提供对全部已安装应用程序的访问。用户可以更改在应用程序选取器中显示的应用程序。屏幕布局屏幕布局21 2 2菜单栏菜单栏 UIQ没有控制窗格或软键。它使用在应用程序选取器下面总是可见的菜单栏。每个视图一般具有它自己的菜单栏。大多数UIQ菜单栏有两个左对齐菜单标题和一个右对齐“文件夹”菜单。最左边的标题应该是应用
13、程序的名称。它提供首要的菜单窗格,有标准功能如“新建”、“查找”和“另存为”。右边的下一个菜单标题(如果不需要,可以被忽略)通常提供标准“编辑”命令,如“剪切”、“复制”、“粘贴”和“缩放”。UIQ菜单窗格应该简短并且不使用级联菜单窗格。如果菜单窗格包含比适当屏幕更多的项,将添加一个滚动栏,不过,应该避免这样做。屏幕布局屏幕布局22 注意,UIQ菜单不包括“退出”或“关闭”选项;除了在调试生成中,对于检查应用程序在关闭时是否释放全部资源,它可能有用。它们也不应该提供“保存”选项;UIQ应用程序应该不需要用户干预,就可以保存它们的数据。屏幕布局屏幕布局23 本节介绍如何定义、创建和使用两种UI中
14、都存在的UI组件,包括两种实现之间的差异。3.4.13.4.1菜单栏菜单栏菜单在资源文件中定义,由下列四个组件组成:l菜单栏在UIQ中是一个包含菜单标题的水平栏。在Series 60中,它从不显示。它使用一个MENU_BAR资源定义(在C+中使用CEikMenuBar)。l菜单标题。这些标题定义一个菜单窗格,在UIQ中,定义菜单栏中显示的文本。它们由MENU_TITLE资源定义。注意,在Series 60中,在控制窗格中显示的标签不在ENU_TITLE资源中定义,而是在定义软键的CBA资源中定义。常见常见UIUI组件组件24 l菜单窗格,是当用户在UIQ中选择菜单标题或在Series 60中选
15、择“选项”软键时显示的菜单项垂直列表。它们由MENU_PANE资源定义(在C+中使用 CEikMenuPane)。Series60和UIQ都支持级联菜单窗格,尽管在UIQ中已淘汰。l菜单项,是菜单窗格中可以由用户选择的项。它们由MENU_ITEM资源定义,与显示在菜单窗格中的标签和选择该项时发出的命令ID关联。常见常见UIUI组件组件25 UIQ中的菜单栏总是可见。它支持多菜单标题,每个标题与一个菜单窗格关联。在Series 60中,使用控制窗格,而不是菜单栏。不过,在大多数Series 60应用程序中,菜单栏仍然需要定义,因为它定义“选项”软键激活的菜单窗格。 在Series 60和UIQ中
16、,当应用程序启动时,使用的初始菜单栏在EIK_APP_INFO资源结构中的menubar字段中定义。常见常见UIUI组件组件26 不同的视图通常需要不同的菜单栏,因此当视图更改时,菜单栏也应该更改。在UIQ中,菜单栏切换在视图的ViewActivatedL()函数中进行,使用如下代码:MEikAppUiFactory* factory=iEikonEnv-AppUiFactory();factory-MenuBar()-ChangeMenuBarL(0,R_NEW_MENUBAR, EFalse);CEikMenuBar:ChangeMenuBarL()的第二个参数是新视图菜单栏的资源ID。另
17、外两个参数在UIQ中不使用。常见常见UIUI组件组件27 在Series 60中,如果需要动态更改菜单栏,可以使用如下代码:MEikAppUiFactory* factory=iEikonEnv-AppUiFactory();factory-MenuBar()-SetMenuTitleResourceId(R_NEW_MENUBAR);与UIQ不同,Series 60不实现CEikMenuBar:ChangeMenuBarL();你必须使用SetMenu TitleResourceId()。 常见常见UIUI组件组件28 然而,对于在视图特定的菜单栏之间的切换,Series60通常使用不同的方
18、案。Series 60视图由AVKON_VIEW资源定义,与视图关联的菜单栏和软键在资源中定义:STRUCT AVKON_ VIEWLLINK hotkyes=0;LLINK menubar=0;LLINK cba=0;常见常见UIUI组件组件29 在视图的ConstructL()中,调用CAknView:BaseConstructL(),给它传递AVKON_VIEW资源的ID。当视图激活时,自动使用它的菜单栏和软键。 在Series 60中,对话框可以定义它们自己的菜单栏。Series 60对话框基类CAknDialog拥有一个菜单栏,该菜单栏的资源ID在构造对话框时定义。该对话框使用的软键
19、在DIALOG资源的buttons字段中定义。当该对话框启动时,它的软键标签改写以前显示的标签,将它的菜单栏添加到控件栈,以便它在现有菜单栏之前接收键事件。注意,不需要“选项”菜单窗格的Series 60对话框可以从CeikDialog派生。常见常见UIUI组件组件30 窗体(CAknForm)是一种派生于CAknDialog的对话框。窗体提供它们自己的默认菜单栏和菜单窗格。列表查询对话框(CAknListQueryDialog)也派生于CAknDialog。它们由AVKON_LIST_QUERY资源定义(使用一个名为softkeys的字段而不是buttons来定义它的软键)。对话框和窗体我们
20、将在本章后面介绍。 常见常见UIUI组件组件31 3.4.2 3.4.2 菜单窗格菜单窗格 菜单窗格的内容可能也需要根据应用程序的状态更改。使菜单项可用或不可用的的函数是CEikMenuPane:SetItemDimmed()。在UIQ中,用ETrue调用这个函数,导致该项保留在菜单中,但是它显示为浅灰色。在Series 60中,为了保存屏幕空间并使菜单导航更快,该菜单项被移除。再次用EFalse调用该函数取消浅灰色或导致它重新出现。 常见常见UIUI组件组件32 另一方面,CEikMenuPane:DeleteMenuItem()完全移除菜单项,CEikMenuPane:AddMenuIte
21、mL()添加某一项。这两个函数都具有允许同时添加或删除多个菜单项的变量。注意,UIQ淘汰了动态添加和移除菜单项,因为这可能使用户混淆;相反,应该设置浅灰色和取消浅灰色。如果用户选择浅灰色菜单项,可以选择使用解释为什么该项不可用的提示信息。 常见常见UIUI组件组件33 在app UI的DynInitMenuPaneL()实现中对菜单项进行添加、删除、设置浅灰色和取消浅灰色。这个函数正好在菜单窗格显示之前被框架调用。对于Series 60的拥有菜单栏的对话框,DynInitMenuPaneL()由该对话框而不是由app UI实现。CAknDialog定义一个为空的DynInitMenuPaneL
22、()函数,但是CAknForm重写它,以设置不需要的项为浅灰色。 常见常见UIUI组件组件34 菜单窗格中的相关项可以使用分隔符分组。为此,对于分隔符之前的MENU_ITEM,在菜单窗格的资源定义中使用如下代码:flags=EEikMenuItemSeparatorAfter;Series 60和UIQ支持该标志。uikon.hrh中的其他菜单项标志定义EEikMenuItemSeparatorAfter。 级联菜单窗格是另一个窗格内的窗格,如图3.4所示。常见常见UIUI组件组件35 级联菜单窗格由MENU_ITEM的cascade字段定义。由于它们增加了复杂性,所以UIQ淘汰了它们的使用。常见常见UIUI组件组件36