S60用户界面控件设计(二)

预定义UI控件
*在S60中有许多预定义的UI控件
 - Menu(菜单)
 - Dialog(对话框)
 - Editor(编辑器)
 - Form(表单)
 - List(列表框,包括栅格)

菜单
*菜单栏
 - 菜单构造的起点
 - 应用程序可以有默认的菜单栏,或者每个视图都有一个默认的菜单栏
 - 由CEikMenuBar封装
*菜单面板
 - 定义菜单的各个部分
 - 包含菜单项列表,每一项都包括一个文本字符串和一个命令ID
 - 由CEikMenuPane封装

菜单资源
*MENU_BAR资源必须定义
*可以包含一个或多个MENU_PANE结构体
*MENU_PANE包含一个MENU_ITEM结构体的列表
*通过向MENU_ITEM添加"cascade"参数和子菜单面板的资源名称,可以指定子菜单面板
*MENU_BAR可以是EIK_APP_INFO结构体的部分,或者是AVKON_VIEW结构体的部分

菜单资源-示例
RESOURCE MENU_BAR r_example_menubar
{
 titles =
 {
  MENU_TITLE{txt = "Example Menu"; menu_pane = r_example_menupane;}
 };
}
RESOURCE MENU_PANE r_example_menupane
{
 items =
 {
  MENU_ITEM{command = EExampleCmdAdd; txt = "Add entry";},
  MENU_ITEM{command = EExampleCmdEdit; txt = "Edit entry";},
  MENU_ITEM{command = EExampleCmdDel;txt = "Delete entry";},
  MENU_ITEM{command = EAknSoftkeyExit; txt = "Exit";}
 };
}

处理菜单命令
*当用户选择一个菜单项时,激活状态视图中的HandleCommandL()就会被调用
*开发者必须添加处理菜单命令各种情况的代码
*如果用末知的命令UI来调用函数,那么AppUI的ProcessCommandL()函数将使用系统默认的命令来处理
*示例
void CMyView2::HandleCommandL(TInt aComand)
{
 switch(aCommand)//判断菜单命令并做出反应
 {
  case EAknSoftkeyBack:
   AppUi()->ProcessCommandL(EAknCmdExit);
   break;
   ....
 }
}


动态改变菜单
*菜单的内容有时需要根据应用程序的状态来改变
*动态菜单可以通过重写如下函数来实现:
 - MEikMenuObserver::DynInitMenuPaneL(...)
 - MEikMenuObserver::DynInitMenuBarL(...);
*可以实现菜单项的添加/删除
*可以实现菜单项的激活/去激活(变灰)
*在菜单读取资源文件之后,菜单显示之前调用
 
动态改变菜单-示例
void CMyView1::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane)
{
 if (R_EXAMPLE1_MENU == aResourceId)
 {
  if (EExampleMenuStateNo == iState)
  {
   aMenuPane->DeleteMenuItem(EExampleMenuCmd1);
   aMenuPane->DeleteMenuItem(EExampleMenuCmd2);
  }
 }
 else if (R_EXAMPLE2_MENU == aResourceId)
 {
  if (EExampleMenuStateDim1 == iState)
  {
   aMenuPane->SetItemDimmed(EExampleMenuCmd1,ETrue);
   aMenuPane->SetItemDimmed(EExmapleMenuCmd2,EFalse);
  }
  esle if (EExmapleMenuStateDim2 == iState)
  {
   aMenuPane->SetItemDimmed(EExampleMenuCmd1,EFalse);
   aMenuPane->SetItemdimmed(EExampleMenuCmd2,ETrue);
  }
 }
}

 

对话框
* 对话框是显示信息和用户输入数据的控件
*包含一个或多个控件
 - 各条线都包含一个控件
 - 对话框处理不同控件之间焦点的改变
  @不需要开发者手动设置
  @但是,如果你在容器中添加了编辑器控件,那么你就必须手动处理焦点的转变
 - 按键事件将自动传递至获得焦点的控件
*从CAknDialog或CEikDialog继承而来
*CAknDialog由CEikDialog继承而来,并将菜单功能添加到对话框中

 

对话框类
CAknQueryDialog和CAknForm继承自CAknDialog
CAknDialog和CAknNoteDialog继承自CEikDialog

CAknDialog
*将菜单功能添加到对话框中

CAknNoteDialog
*为用户显示信息
*进一步派生出封装类和进度对话框

CAknQueryDialog
*处理用户输入
*进一步派生出特定的输入对话框
 - 文本、事件、数字、IP地址等

CAknForm
*双重模式-视图和编辑


对话框-函数
*构造、激活和析构
 - PrepareLC(TInt aDialogResourceId)
  @由资源文件构造对话框
 — RunLD()
  @显示对话框框并在离开时销毁
  @返回与用户离开对话框方式有关的值
 - ExecuteLD(TInt aDialogResourceId)
  @是PrepareLD(..)和RunLD()的结合
*需要重写CAknDialog的
 - 使用菜单
  @ConstructL(TInt aMenuTitleResource)
   - 构造菜单
  @DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane)
   - 动态创建菜单控件
 - 命令和事件处理
  @ProcessCommandL(TInt aCommand)
   - 处理菜单命令
  @OfferKeyEventL(const TKeyEvent& aKeyEvent, const TEventCode aType)
   - 处理按键事件
*其它函数
 - PreLayoutDynInit()
  @在菜单确定尺寸大小和显示前由框架调用
  @用于修改对话框版式
 - OkToExit()
  *当用户离开对话框是由框架调用
  *在对话框销毁之前从对话框变量中提取数据
  *检查输入编辑器控件的数据的有效性
  *必须返回ETrue来关闭对话框


对话框资源
*对话框版面和内容在资源文件中定义
 - 扩展名为.rss
*资源文件为预定义的结构体分配取值
 - 结构体定义在.rh文件中
 - 定义的值与.hrh文件中的资源的代码相同
*DIALOG是定义对话框的资源结构体
 - 包含一个或多个DLG_LINE结构体
 - 定义对话框中的各个控件
*对话框可以由DIALOG id来构造
*取值可以通过对话框方式在代码中动态改变

对话框资源-示例
*DIALOG资源示例
RESOURCE DIALOG r_example_dialog
{
 title = "Example Dialog";
 flags = EEikDialogFlagWait|EEikDialogFlagNoDrag;
 buttons = R_AVKON_SOFTKEYS_OK_CANCEL;
 items = {
  DLG_LINE {
   type = EEikCtEdwin;
   id = EExampleId;
   prompt = "Insert Text:";
   control = EDWIN {
      winth = 20;
      maxlength = 20;
       };
     }
   };
}


对话框用法
*使用对话框意味着创建和显示它
*一般的方法是
 - 调用new(ELeave)或调用静态NewL()对话框构造函数来创建对话框类的实例
 - 调用对话框ExecuteLD(TInt aResourceId),这将调用如下函数
  *PrepareLC(aResourceId);
  *return(RunLD());
*也可以执行静态RunDlgLD()函数
 -通过调用一个函数来创建和显示对话框

通知对话框
*通知用户当前情况
*通常包含文本和图标
*持续显示一段时间,然后自动关闭
*可以及有声音伴奏
*创建通知对话框的两种方法
 - 使用CAknNoteDialog
  *需要对话框资源
 - 使用在封装类中定义的AVKON
  *由AVKON预定义的资源
*进度通知对话框也是由CAknNoteDialog继承而来

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值