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