Symbian 学习之对话框简介

Symbain OS 对话框的基类实在Uikon中定义的CEikDialog类,在此基础上各个界面平台又封装了各种对话框类,例如S60平台的Avkon定义了 CAknDialog类作为S60对话框的基类,而UIQ平台仍然使用CEikDialog类作为对话框基类,但是封装了 CQikSaveFileInFolderDlg类等UIQ平台特有的对话框类。

  Uikon中的CEikDialog实现了三个接口,包括:

  McoeControlObserver,对话框子控件的观察者接口,当子控件状态发生变化时该接口的 HandleControlEventL()函数被调用。

  MeikDialogPageObserver,在多页对话框中,可以通过实现该接口观察页面的变化。

  McoeControlContext,在多个控件之间共享图形上下文的接口。

  CAknDialog类和CEikDialog类最大的不同是前者可以拥有菜单,相应地实现了MEikMenuObserver接口,用于观察 菜单状态的变化。

  CAknDialog是大部分Series60对话框的基类。关于对话框的使用,大体分为以下步骤:1.定义资源。2.执行对话框。3.动态地 初始化标准对话框。4.退出对话框。

  1.定义资源

  使用DIALOG定义资源,资源指定了对话框的布局,在资源中定义对话框应该包含的行数、使用的控件、对话框是否为模态以及使用的软键等。资源 结构在eikon.然后中定义:

  STRUCT DIALOG

  {

  LONG flags=0;

  LTEXT title="";

  LLINK pages=0;

  LLINK buttons=0;

  STRUCT item[];

  LLINK form=0;

  }

  flags:说明了对话框的属性,其中的属性值可参考,可以多个一起用。

  #define EEikDialogFlagWait //等待对话框

  #define EEikDialogFlagNotifyEsc //退出通知,当用户选择某个软键时对话框调用OkToExit()函数

  #define EEikDialogFlagButtonsBelow

  #define EEikDialogFlagButtonsRight

  #define EEikDialogFlagNoUserExit //不允许用户选择退出对话框,即不显示软键

  #define EEikDialogFlagModeless //无模式对话框,使用该

  #define EEikDialogFlagNoTitleBar //无标题栏

  #define EEikDialogFlagAllKeysToButtons

  #define EEikDialogFlagFillScreen

  #define EEikDialogFlagNoDrag //不可拖动

  #define EEikDialogFlagDensePacking

  #define EEikDialogFlagNoBackup

  #define EEikDialogFlagFillAppClientRect //对话框占满整个主面板

  #define EEikDialogFlagCbaButtons //使用CBA按钮

  #define EEikDialogFlagNoBorder

  #define EEikDialogFlagNoShadow

  其中,把标准对话框定义为等待对话框是一种良好的习惯。应该只在合理的时候(例如在主应用程序窗口中)才把标准对话框定义为非等待。

  title:对话框的标题栏文本

  pages:多页对话框中,页面资源的ID

  buttons:指定了使用的软键(按钮资源的 ID),其中的取值可参考

  #define R_AVKON_SOFTKEYS_EMPTY

  #define R_AVKON_SOFTKEYS_EMPTY_WITH_IDS

  #define R_AVKON_SOFTKEYS_OK_EMPTY

  #define R_AVKON_SOFTKEYS_SELECT_CANCEL

  #define R_AVKON_SOFTKEYS_OK_CANCEL

  #define R_AVKON_SOFTKEYS_OK_DETAILS

  #define R_AVKON_SOFTKEYS_CALL_CANCEL

  #define R_AVKON_SOFTKEYS_OPTIONS_BACK

  #define R_AVKON_SOFTKEYS_OPTIONS_DONE

  #define R_AVKON_SOFTKEYS_OPTIONS_CANCEL

  #define R_AVKON_SOFTKEYS_OPTIONS_EXIT

  #define R_AVKON_SOFTKEYS_OK_BACK

  #define R_AVKON_SOFTKEYS_CANCEL

  #define R_AVKON_SOFTKEYS_BACK

  #define R_AVKON_SOFTKEYS_CLOSE

  #define R_AVKON_SOFTKEYS_DONE_BACK

  #define R_AVKON_SOFTKEYS_DONE_CANCEL

  #define R_AVKON_SOFTKEYS_SELECT_BACK

  #define R_AVKON_SOFTKEYS_MARK_BACK

  #define R_AVKON_SOFTKEYS_UNMARK_BACK

  #define R_AVKON_SOFTKEYS_YES_NO

  #define R_AVKON_SOFTKEYS_UNLOCK_EMPTY

  #define R_AVKON_SOFTKEYS_SAVE_BACK

  #define R_AVKON_SOFTKEYS_SHOW_CANCEL

  #define R_AVKON_SOFTKEYS_SHOW_EXIT

  #define R_AVKON_SOFTKEYS_ANSWER_EXIT

  #define R_AVKON_SOFTKEYS_EXIT

  #define R_AVKON_SOFTKEYS_READ_EXIT

  #define R_AVKON_SOFTKEYS_LISTEN_EXIT

  #define R_AVKON_SOFTKEYS_SEARCH_BACK

#define R_AVKON_SOFTKEYS_AGAIN_QUIT

  #define R_AVKON_SOFTKEYS_QUIT

  #define R_AVKON_SOFTKEYS_INSERT_BACK

  items:它定义了对话框包含的实际内容。需要为希望包含到对话框的每个控件分别定义一个DLG_LINE,它也在eikon.rh总定义, 在每个DLG_LINE中至少应该指定以下字段:

  * id :在应用程序中使用该值引用此对话框行,必须在应用程序的.hrh文件中枚举它。

  * type :此对话框行包含的控件类型(在avkon.hrh或uikon.hrh中定义)。

  * control :在此对话框中使用的控件。

  此外,还可以选择在DLG_LINE资源中指定一个itemflags字段,使用该字段决定对话框行的行为。例如弹出字段文本控件可以使用 itemflags说明应该在“选择”键被按下时打开一个弹出窗口,例如 EEikDlgItemTakesEnterKey|EEikDlgItemOfferAllHotKeys。可以在 uikon.hrh中找到 itemflags的值。最常用的可能当属EEikDlgItemSeparatorBefore标志,用于在对话框行之前插入一个水平“分隔符”行。

  本节的MySimpleDlg示例程序中定义了一个显示一个标签的简单的对话框,在.rss中定义的资源如下:

  RESOURCE DIALOG r_simpledlg_dialog

  {

   flags=EEikDialogFlagNoDrag|EEikDialogFlagNoTitleBar|EEikDialogFlagFillAppClientRect|

   EEikDialogFlagCbaButtons|EEikDialogFlagWait|EEikDialogFlagNotifyEsc;

  buttons = R_AVKON_SOFTKEYS_OK_CANCEL;

  items =

  {

  DLG_LINE

  {

  id = ESimpleDlgCtlLabel; //子控件的ID(在下面.hrh中定义)

  type = EEikCtLabel; //子控件的类型

  control = LABEL //子控件的资源定义

  {

  txt = "This is a simple dialog";

  };

  }

  };

  }

  除此之外还要在.hrh中定义:

  enum TSimpleDlgControlIds

  {

  ESimpleDlgCtlLabel = 1

  };

  2.执行对话框

  在c++代码中一般用CEikDialog::ExecuteLD()函数执行对话框,该函数在eikdialg.h中定义:

  //eikdiag.h

  ...

  public:

  virtual TInt ExecuteLD(TInt aResourceId);

 ....

  函数的参数aResourceId是执行对话框的资源ID,如果对话框的属性值包含EEikDialogFlagWait,则表示是一个等待对 话框,此时ExecuteLD()函数调用会挂起,知道对话框关闭后该函数才返回。对于非等待对话框,该函数会立即返回。 对话框在 ExecuteLD()的最后会删除自己。

  本节MySimpleDlg程序中创建了一个CAknDialog对象,并调用它的ExecuteLD()函数,代码如下

  //MySimpleDlgAppUi.cpp

  #include

  ....

  void CMySimpleDlgAppUi::HandleCommandL(TInt aCommand)

  {

  switch ( aCommand )

  {

  ...

  case ESimpleDlgCmdDialog: //在下面的.rss和.hrh中定义

  {

  iEikonEnv->InfoMsg(_L("test"));

  CAknDialog* dialog = new(ELeave)CAknDialog; //创建对话框对象

  if(dialog->ExecuteLD(R_SIMPLEDLG_DIALOG)) //执行对话框并判断返回值

  {

  _LIT(KButtonOk,"OK");

  iEikonEnv->InfoMsg(KButtonOk());

  }

  else

  {

  _LIT(KButtonCancel,"Cancel");

  iEikonEnv->InfoMsg(KButtonCancel());

  }

  break;

  }

  ........

  // TODO: Add Your command handling code here

  default:

  break;

  }

  }

  那么为什么在new之后没有将其压入清除栈呢?因为ExecuteLD()拥有改对话框的所有权,该方法包装了对其他两个方法的调 用:PrepareLC()和RunLD()。PrepareLC()会把对话框的指针放入清除栈,然后完成对话框的创建。RunLD()会显示该对话 框,然后把它从清除栈中弹出。但如果在调用ExecuteLD()之前需要调用任意可能导致异常退出的代码,则应该将其放入清除栈,并在调用 ExecuteLD()前把它弹出。但,如果对话框为非等待的,则会直接从ExecuteLD()返回而不被删除

  在.rss和.hrh文件中定义 ESimpleDlgCmdDialog:

  //MySimpleDlg.rss

  RESOURCE MENU_PANE r_mysimpledlg_menu

  {

  items =

  {

  MENU_ITEM { command = ESimpleDlgCmdDialog; txt = qtn_appl_dialog; },

MENU_ITEM { command = ESimpleDlgCmdPrepare; txt = qtn_appl_prepare; },

  MENU_ITEM { command = ESimpleDlgCmdPreLayout; txt = qtn_appl_prelayout; },

  MENU_ITEM { command = EAknCmdExit; txt = qtn_appl_exit; }

  };

  }

  //MySimpleDlg.hrh

  enum TMySimpleDlgCommandIds

  {

  ESimpleDlgCmdDialog = 1,

  ESimpleDlgCmdPrepare,

  ESimpleDlgCmdPreLayout

  };

  3.动态地初始化标准对话框

  对话框的子控件在定义时被赋予初始值,但在某些情况下应用程序需要在执行对话框之前根据情况改变子控件的值,有两种方法:

  第一种:使用PrepareLC()函数和RunLD()函数

  ExecuteLD()函数内部首先调用PrepareLC()函数从资源中加载对话框,然后调用RunLD()函数弹出对话框,因此可以在这 两个函数之间加入初始化对话框的代码,本节MySimpleDlg示例程序 MySimpleDlgAppUi.cpp文件中代码如下:

  #include

  void CMySimpleDlgAppUi::HandleCommandL(TInt aCommand)

  {

  switch ( aCommand )

  {

  ......

  case ESimpleDlgCmdPrepare:

  {

  CAknDialog* dialog = new(ELeave)CAknDialog;

  dialog->PrepareLC(R_SIMPLEDLG_DIALOG); //从资源文件中加载对话框

  CEikLabel* label = static_cast(dialog->Control(ESimpleDlgCtlLabel)); //获取对话框 的子控件的指针

  _LIT(KMyLabel,"Changed after PrepareLC()");

  label->SetTextL(KMyLabel()); //修改子控件的值

  dialog->RunLD();

  break;

  }

  .......

  // TODO: Add Your command handling code here

  default:

  break;

  }

  }

  注意:需要在.mmp文件中加入eikdlg.lib

  第二种方法:使用PreLayoutDynInitL()函数或PostLayoutDynInitL()函数

  该方法需要自定义对话框类,并重载 CEikDialog::PreLayoutDynInit()函数和CEikDialog::PostLayoutDynInitL()函数。这两个函 数都是虚函数,他们会在显示对话框之前被调用。其中对话框完成控件布局会调用PreLayoutDynInitL()函数,因此该函数常用于完成可能会影 响对话框布局的初始化操作,例如创建新的控件。对话框完成布局之后会调用PostLayoutDynInitL()函数,该函数用于实现不影响对话框布局 的操作,如为控件赋值等。

本节的MySimpleDlg示例程序自定义了一个对话框CMySimpleDialog类,它重载了PreLayoutDynInitL()函 数,MySimpleDialog.cpp主要代码如下:

  #include // for CEikonEnv

  #include // for example label control

  #include "MySimpleDlg.hrh"

  void CMySimpleDialog::PreLayoutDynInitL()

  {

  CEikLabel* label = static_cast(Control(ESimpleDlgCtlLabel)); // 通过CEikDialog::Control()函数获得控件的指针

  _LIT(KMyLabel, "Changed by PreLayoutDynInitL()");

  label->SetTextL(KMyLabel());

  }

  使用此方法可以直接调用ExecuteLD()函数执行对话框,MySimpleDlgAppUi.cpp代码如下:

  #include // for CEikLabel

  #include

  #include //对话框头文件

  #include "MySimpleDialog.h" // for CMySimpleDialog

  .....

  void CMySimpleDlgAppUi::HandleCommandL(TInt aCommand)

  {

  switch ( aCommand )

  {

  ......

  case ESimpleDlgCmdPreLayout:

  {

  CAknDialog* dialog = new(ELeave)CMySimpleDialog; //创建自定义对话框

  dialog->ExecuteLD(R_SIMPLEDLG_DIALOG); //执行对话框

  break;

  }

  // TODO: Add Your command handling code here

  default:

  break;

  }

  }

  注意:Symbian 使用vc6.0开发环境,加入新类以后,最好把.h头文件放在inc文件夹中,.cpp源文件放在src文件夹中(保持统一),必须在.mmp文件中加入 source文件,如本章的.mmp加入如下代码:

  SOURCE MySimpleDialog.cpp

  最后重新编译。

  4.退出对话框

  当为对话框资源指定了 EEikDialogFlagNotifyEsc标记时,对话框会在用户按下软键时调用CEikDialog::OkToExitL()函数。因此可以在 自定义的对话框中重载CEikDialog::OkToExitL()函数。当该函数返回ETrue时,对话框退出,并且由系统销毁。返回EFalse

时,对话框继续保留。

  本节的MySimpleDlg示例程序中的自定义对话框 CMySimpleDialog类,该类重载了此函数,代码如下:

  #include // for CEikonEnv

  TBool CMySimpleDialog::OkToExitL(TInt aButtonId)

  {

  //调用基类的OkTkExitL()函数,完成默认功能,例如弹出菜单等。

  TBool ret = CAknDialog::OkToExitL(aButtonId);

  CEikonEnv* env = CEikonEnv::Static();

  if(aButtonId==EEikBidOk) //用户选择了左软键

  {

  _LIT(KOkToExit, "OK to exit");

  env->InfoMsg(KOkToExit());

  }

  else if(aButtonId==EEikBidCancel) //用户选择了右软键

  {

  _LIT(KCancelToExit, "Cancel to exit");

  env->InfoMsg(KCancelToExit());

  }

  return ret; //返回CAknDialog::OkToExitL()函数的返回值

  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
水资源是人类社会的宝贵财富,在生活、工农业生产中是不可缺少的。随着世界人口的增长及工农业生产的发展,需水量也在日益增长,水已经变得比以往任何时候都要珍贵。但是,由于人类的生产和生活,导致水体的污染,水质恶化,使有限的水资源更加紧张。长期以来,油类物质(石油类物质和动植物油)一直是水和土壤中的重要污染源。它不仅对人的身体健康带来极大危害,而且使水质恶化,严重破坏水体生态平衡。因此各国都加强了油类物质对水体和土壤的污染的治理。对于水中油含量的检测,我国处于落后阶段,与国际先进水平存在差距,所以难以满足当今技术水平的要求。为了取得具有代表性的正确数据,使分析数据具有与现代测试技术水平相应的准确性和先进性,不断提高分析成果的可比性和应用效果,检测的方法和仪器是非常重要的。只有保证了这两方面才能保证快速和准确地测量出水中油类污染物含量,以达到保护和治理水污染的目的。开展水中油污染检测方法、技术和检测设备的研究,是提高水污染检测的一条重要措施。通过本课题的研究,探索出一套适合我国国情的水质污染现场检测技术和检测设备,具有广泛的应用前景和科学研究价值。 本课题针对我国水体的油污染,探索一套检测油污染的可行方案和方法,利用非分散红外光度法技术,开发研制具有自主知识产权的适合国情的适于野外便携式的测油仪。利用此仪器,可以检测出被测水样中亚甲基、甲基物质和动植物油脂的污染物含量,为我国众多的环境检测站点监测水体的油污染状况提供依据。
### 内容概要 《计算机试卷1》是一份综合性的计算机基础和应用测试卷,涵盖了计算机硬件、软件、操作系统、网络、多媒体技术等多个领域的知识点。试卷包括单选题和操作应用两大类,单选题部分测试学生对计算机基础知识的掌握,操作应用部分则评估学生对计算机应用软件的实际操作能力。 ### 适用人群 本试卷适用于: - 计算机专业或信息技术相关专业的学生,用于课程学习或考试复习。 - 准备计算机等级考试或职业资格认证的人士,作为实战演练材料。 - 对计算机操作有兴趣的自学者,用于提升个人计算机应用技能。 - 计算机基础教育工作者,作为教学资源或出题参考。 ### 使用场景及目标 1. **学习评估**:作为学校或教育机构对学生计算机基础知识和应用技能的评估工具。 2. **自学测试**:供个人自学者检验自己对计算机知识的掌握程度和操作熟练度。 3. **职业发展**:帮助职场人士通过实际操作练习,提升计算机应用能力,增强工作竞争力。 4. **教学资源**:教师可以用于课堂教学,作为教学内容的补充或学生的课后练习。 5. **竞赛准备**:适合准备计算机相关竞赛的学生,作为强化训练和技能检测的材料。 试卷的目标是通过系统性的题目设计,帮助学生全面复习和巩固计算机基础知识,同时通过实际操作题目,提高学生解决实际问题的能力。通过本试卷的学习与练习,学生将能够更加深入地理解计算机的工作原理,掌握常用软件的使用方法,为未来的学术或职业生涯打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值