第七章使用控件.ppt_第1页
第七章使用控件.ppt_第2页
第七章使用控件.ppt_第3页
第七章使用控件.ppt_第4页
第七章使用控件.ppt_第5页
免费预览已结束,剩余27页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,第七章使用控件,2,完成本章内容之后我们将能够:掌握控件和相关的API,本章目标,3,控件,在SymbianOS中,控件提供应用程序和用户之间交互的主要方式。应用程序大量使用控件:应用程序的每个视图都是个控件,控件构成全部对话框和菜单窗格的基础。控件占据屏幕的个矩形区域,除了响应用户、应用程序和系统产生的事件,它还可以显示文本和图像的任意组合。基于特定用户界面,用户产生的事件可能包括:按键(字母数字或特定设备的按钮)。指针事件,用户用触笔点击屏幕产生。,4,控件,绘制控件的内容可以由应用程序本身启动,例如当控件的可显示数据更改时。系统也可以启动绘制,例如由于覆盖控件(可能属于同一个或另一个应用程序)的消失,暴露了控件的全部或部分。记住,SymbianOS是个完全多任务处理系统,多个应用程序可以并发运行,屏幕是必须在所有这些应用程序之间共享的惟一资源。通过关联个或多个窗口与每个应用程序,处理控件和屏幕之间的交互,SymbianOS用以实现这种共享。窗口由窗口服务器管理,保证个或多个正确的窗口显示,根据需要管理覆盖、暴露和隐藏的窗口。,5,为了获得对屏幕的访问权,每个控件必须与一个窗口关联,但是不需要每个控件都拥有个单独的窗口。一些称为“拥有窗口的控件(window-owningcontr01)”的控件使用个完整窗口,但是许多其他称为“非拥有窗口的控件(non-window-owningcontr01)”的控件ConstructL(ClientRect();,简单控件,15,应用程序是否需要处理这两种类型的事件部分依赖于目标手机的UI。Series60UI的个设计考虑是,它应该支持单手操作。因此,Series60手机没有触摸屏幕,因此特别为该UI编写的应用程序不需要处理指针事件。运行在基于指针的手机UI(例如UIQ)的应用程序,通常应当处理这两种类型的事件。这样的手机通常使用一些键和与手写识别或(屏幕上的)虚拟键盘等相关联的前端处理器(FEP)来生成键事件。,处理键和指针事件,16,是否选择处理某一种或全部两种类型的事件,可能也取决于应用程序的本质。一般而言,如果没有特别的相反原因,处理两种类型的事件将使得转换应用程序以运行在使用不同UI的手机上更容易。两种类型的事件有一些基本差别。指针事件发生在屏幕的特定位置,通常对应个特定应用程序的窗口,更准确地说,是一个与该窗口关联的特定控件。键事件与特定控件无此内在连接。应用程序的内部逻辑确定这个连接,并且情况常常是,不同类型的键事件可能被应用程序内不同的控件处理。,处理键和指针事件,17,这个基本差别反映在SymbianOS处理两种类型事件的方式上。键事件由TKeyEvent的一个实例和键事件类型表示,键事件类型可以是EEventKeyDown,EEventKey或EEventKeyUp之一。除非应用程序对检测何时按下键或释放键特别感兴趣,否则,可以安全地忽略非EEventKey类型的键事件。TKeyEvent类有四个数据成员:iCode、iModifiers、iRepeats和iScanCode。其中包含键的字符码的iCode通常对应用程序最有意义。其他数据成员的意义参见表4.2。,键事件,18,键事件,表4.2其他数据成员,19,如前所见,控件应该通过调用appUI的AddToStackL()函数,添加到控件栈,注册它对处理键事件的要求。控件可能处理的全部键事件,无论它们从真实的按键还是从前端处理器(FEP)生成,都由控件栈的OfferKeyL()来处理。这个函数调用控件栈上每个对象的OfferKeyEventL()函数,直到下列两种情况之一发生:为全部控件提供该键事件,并通过返回EKeyWasNotConsumed指示它们不能处理该事件。控件可以处理该键事件,并且通过返回值EKeyWasConsumed指示它已经完成了处理。,键事件,20,由此可见,如果响应键事件时,控件不做任何事情,它的OfferKeyEventL()实现必须保证该函数返回EKeyWasNotConsumed,否则,可能阻止其他控件或对话框接收该键事件。CcoeControl的OfferKeyEventL()函数的默认操作正是返回EKeyWasNotConsumed。,键事件,21,运行模拟器中的ConsLauncher应用程序说明,它响应指针事件,即使该应用程序源没有显式代码处理它们也是如此。为了验证这一点,需要确保在模拟的c:systemprograms目录(epoc32csystemprograms,其中是wins、winsb或winscw之一,与所使用的编译器和IDE有关)中存在两个或更多.exe文件。然后,你会发现可以通过单击任何列出的项而选择它。,指针事件,22,Series60特定的控件不需要响应指针事件,但是SymbianOS中所有可用的通用控件以及UIQ特定的所有控件均响应指针和键事件。与键事件不同,框架代码将指针事件定向到适当的控件,而没有应用程序本身的任何显式协助。指针事件在数字化仪(digitizer)驱动器中发生,数字化仪驱动器将它们传递到窗口服务器。通常,窗口服务器关联指针事件和窗口矩形围绕事件位置的最前面窗口(但是也有例外,我们将在后面描述)。窗口服务器将事件发送给拥有包含特定窗口的窗口组的应用程序。,指针事件,23,在应用程序内,将事件传递给appUI的HandleWsEventL()函数。如前所见,这个函数是与处理键事件相同的函数。这个函数将该事件识别为与特定窗口关联的指针事件,并调用拥有该窗口的控件的ProeessPointerEventL()。该函数反过来调用该控件的HandlePointerEventL()函数。如果该控件有组件,HandlePointerEventL()的默认实现扫描可见的非拥有窗口的组件,定位包含事件位置的组件。如果找到一个组件,HandlePointerEventL()调用它的ProcessPointerEventL()函数。,指针事件,24,因此,为了在简单控件中自定义对指针事件的响应,应该重写它的HandlePointerEventL()函数。在复合控件中,通常不重写这个函数,但是如果重写,确保不要阻止指针事件传递给组件控件。,指针事件,25,常常有必要让控件将重要的事件通知给某些其他类,做这件事情的标准机制是使用观察器界面。控件框架定义了CoeControlObserver界面类,它拥有单个成员函数HandleControlEventL(),提供接收和处理各种常见控件事件通知的机制。任何派生于这个界面的类被称为控件观察器。控什的观察器经常是该控件的容器,但不一定必须如此。,观察控件,26,控件的观察器可以使用它的SetObserver()函数设置,并在以后通过Observer()函数引用。希望给它的观察器报告事件的控件应该调用ReportEventL(),传递下面列出的枚举事件类型之一。如果控件的观察器以前已经通过调用SetObserver()进行设置,ReportEventL()将只报告事件。,观察控件,27,HelloBlank和ConsLauncher示例应用程序都为它们的视图使用空白控件。杀三子程序为它的视图和棋盘的棋格使用自定义控件,两个控件都需要绘制自己的特定内容。自定义控件绘制其内容的标准方法是实现Draw()函数,因此,前面的简单空白控件的类定义需要更改为:,绘制控件,28,classCBlankAppView:publicCCoeControlpublic:CBlankAppView();CBlankAppView();voidConstructL(constTRect,绘制控件,29,显然,视图的ConstructL()函数不应该调用SetBlank(),因此变为:voidCHelloBlankAppView:ConstructL(constTRect/激活控件,准备进行绘制,绘制控件,30,Draw()函数必须能够绘制到该控件占据的矩形区域内的每个像素。拥有窗口空白控件的简单实现可以是:voidCHelloBlankAppView:Draw(constTRect/清除整个窗口,绘制控件,31,绘制需要一个图形上下文;通过调用CCoeControl:System

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论