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

来源:互联网 发布:c语言布尔值 编辑:程序博客网 时间:2024/05/01 22:21

预定义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继承而来

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 左腿膝盖内侧疼怎么办 差二本线几分怎么办 吃错东西了想吐怎么办 玩游戏扣的话费怎么办 转笔实在是不会怎么办 滑板l轴承沾水了怎么办 暗影格斗3闪退怎么办 暗影格斗3文档被删怎么办 dnf手残党偷学技能学不了怎么办 打篮球没热身膝盖酸痛是怎么办 无线路由器lan口少怎么办? 电脑ip设置乱了怎么办 监控拍我我偷钱怎么办 网吧上网密码忘记了怎么办 比熊犬晚上叫怎么办 刚买的狗一直叫怎么办 酒驾罚款2年没交怎么办 法院判罚款没有钱怎么办 有人朝你吐口水怎么办 孕妇用了六神花露水怎么办 出车祸人不赔钱怎么办 交通事故对方保险不签字怎么办 肇事车主联系不上怎么办 商标被别人申请无效宣告怎么办 淘宝上传宝贝没有品牌怎么办 萌虎白卡借款2000逾期了怎么办 最里面的牙齿烂了怎么办 金龙沉底不游怎么办 龙鱼尾巴烂了怎么办 微博忘了登录名和密码怎么办 新浪微博密码忘了怎么办 vivo手机用户密码忘了怎么办 微博登录名忘记了怎么办 微信忘记密码钱怎么办 微信密码申诉失败怎么办 微博密码被盗了怎么办 对公密码器丢了怎么办 手机qq忘记旧密码怎么办 qq旧密码忘记了怎么办 微博账户密码忘记了怎么办 三星盖乐世s3忘记密码了怎么办