第18章 图形交互
第17章介绍了Symbian操作系统使用MVC模式的方式,以及在控件和窗口上下文中如何进行绘图。本章将介绍如何使用控件让用户与程序进行交互。
从理论上讲,与程序进行交互并不难。就像控件提供虚函数Draw()进行绘图一样,它们也提供两个虚函数处理交互:用HandlePointerEventL()处理触笔事件,用OfferKeyEventL()处理按键事件。你只需要简单地计算出触笔事件的坐标或按键事件的键码,再决定下一步采取什么措施。
基本交互处理实际上需要了解如何使用这两个函数,因此这一章从描述这两个函数开始。本章还将说明交互很好地适合于MVC:将按键事件和触笔事件转换成命令以更新模型,然后,让模型处理重绘。不过,对按键事件和触笔事件处理的介绍只是交互内容的一小部分。要处理的交互问题还有很多:
按键事件通常与光标位置或更一般性概念上的焦点相关联,但并不是所有的事件都进入当前焦点位置,而有一些按键事件将导致焦点更改;
偏离当前焦点处的“触笔按下”事件通常导致焦点的更改。不过,有时更改焦点并不好—也许因为当前处于焦点的控件不是处于有效状态,或者因为事件发生所在的控件并不接受焦点;
焦点应当用一些视觉效果来提示(通常用光标或高亮来指示)。同样,暂时不可接受焦点也应当通过视觉效果提示(通常将其变灰,或者让整个控件不可见);
控制焦点以及转移焦点的原则应该易于被用户理解—最好是根本不需要做任何解释。对于程序员,也应当容易理解。
交互中的一些大问题均密切相关,如绘图、触笔处理、按键处理、模型更新、组件控件、焦点、有效性、临时不可用性、易用性、易编程(www.cppentry.com)性等。在Symbian操作系统的早期开发过程中,为了解决这些问题,GUI和控件环境重写过两次。
解释相关原理比设计它们只是稍微容易一些。
18.1 按键、触笔和命令的基础知识
如前所述,处理交互的基本函数是HandlePointerEventL()和OfferKeyEventL()。在第15章中,连三子应用程序视图的交互核心中,显示了这些函数如何在COandXAppView中实现。
可以有三种方式处理触笔事件和按键事件(通过更仔细地检查连三子游戏的工作方式可以看到):
如果不是可以识别的键,或者不是当前需要使用的键,或者不是一个触笔按下事件则忽略该事件;忽略触笔事件的另一个原因是如果点击的控件部分不是一个可以响应触笔事件的控件;
可以完全在控件内处理事件。比如,移动光标,或者(如果它是数字编辑器)更改控件所编辑的数字的内部值和视觉表达效果,或者对于触笔事件,通过在点击的位置上绘制些什么;
可以生成某些能在控件之外处理的命令,如对话框中的选项列表项可能通过告诉我们选项列表中所显示的某个值更改了,来响应一个向上或者向下的箭头键事件;连三子应用程序通过传递给游戏引擎一个在棋格中下子的请求来响应触笔事件。
在某些情况下,对控件的按键可能被解释为一个对应用程序的命令,它对应用程序的状态有大范围的影响,它可能影响到应用程序的不同部分的控件或者视图。处理这样的命令的方法是定义 M 类— 一个混合接口类。可以通过应用程序的核心类实现它,并且每个想调用这样的命令的控件都可以使用它。
【责任编辑:
董书 TEL:(010)68476606】