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