18.5.6 如何处理触笔事件
我们已经了解了这个问题的各个方面,现在全面介绍触笔事件的处理。
触笔事件最先由数字转换器驱动程序产生,并传递给窗口服务器。触笔事件一般与某个窗口关联,该窗口的屏幕区域中就包含着这个触笔事件。但是,正如我们刚才看到的,触笔抓取可用于将事件关联到与按下触笔的事件相关联的窗口上,或者触笔捕获可用于将该事件强制送到对话框。
该窗口是窗口组的一个成员,窗口组对应于应用程序。窗口服务器将事件发送到相关应用程序中。调用控件环境的CCoeEnv::RunL(),将事件传递给CCoeAppUi::HandleWsEventL(),这与键事件的处理过程是相同的。HandleWsEventL()将它标识为与特定窗口关联的触笔事件。
控件环境会查找与该窗口关联的、拥有窗口的控件,并调用它的(非虚)函数ProcessPointer EventL()。
ProcessPointerEventL()调用 HandlePointerEventL()来处理该事件。它也会进行一些预处理工作,这稍后将做介绍。
HandlePointerEventL()是虚函数:当实现一个简单控件时,可以按照你的意愿任意地实现该函数来处理触笔事件。如果不实现这个函数的话,则获得默认实现(在CCoeControl类中),它将搜索所有可见的非窗口拥有的组件控件,查找包含对应事件的控件,然后,在该控件上调用ProcessPointerEventL()。这个默认实现对于复合控件很理想,但改写这一实现很危险。
因此,触笔事件最终会被传送到正确的非复合控件中,这样就可以通过改写 Handle Pointer-EventL()来处理这一触笔事件。不过,请注意,我们在这一节中所看到的复杂性因素对ProcessPointerEventL()和HandlePointerEventL()均会造成影响。
控件环境的触笔处理函数支持触笔抓取,因此一旦执行触笔抓取,在触笔抬起之前所有的事件都将被发送到相同的控件中。
控件环境并不支持触笔捕获,因此必须使用窗口(以及窗口拥有的控件)来实现。 ProcessPointerEventL()在组件间转移焦点所需的容器中实现事件报告:它为变灰控件生成拒绝交互事件。触笔按下时,为未聚焦控件生成焦点准备转移事件,并在调用HandlePointerEventL()后,为焦点准备转移时未拒绝聚焦的控件生成请求焦点事件。
如果使用触笔缓冲来捕获高分辨率的触笔事件序列,控件环境用ProcessPointerBufferReadyL()来处理,同时必须用HandlePonterBufferReadyL()进行处理。
窗口服务器提供了对触击屏幕或者按键时自定义声音的支持。如果手机允许(手机厂商可以不让你这样做),可以创建一个实现 CClickMaker 接口的 DLL 来更改声音。然后,可以使用RSoundPlugIn 类载入和运用 DLL。载入 DLL 后,只要按键事件和触笔事件发生,就调用它的KeyEvent()和→PointerEvent()实现。用于检查是否可以卸载手机当前DLL和载入自己的DLL的函数是:
- TBool RSoundPlugIn::IsLoaded(TBool& aIsChangeable);
返回值告诉是否载入了某个DLL,参数返回是否允许更改。欲了解上述类与函数的更多信息,请参阅SDK。
【责任编辑:
董书 TEL:(010)68476606】