18.4.2 焦点
我们可以再次看到焦点和键处理一般如何关联的,但它们并不总是关联。
窗口服务器将大部分键发送给具有焦点的应用程序,或发送给激活的前端处理器—但不是它自己的热键或者其他捕获的键。
控件栈机制通常导致键被具有焦点的控件所处理:最上层的对话框、可见的菜单或应用程序视图;键总是提供给调试键控件,它总是不可见的;如果无对话框显示,键总是提供给菜单栏,即使它不可见也是如此。换句话说,即使这些键不与焦点关联,也能得到处理。
对话框一般将键发送到聚焦的行,但方向键和确认键的处理方式不一样。
菜单栏维护一个拥有焦点的窗格和一个拥有焦点的选项,通常给它们提供按键操作方式;但是如果有快捷键,这些快捷键的处理将不受焦点的控制。
在连三子应用程序的按键事件的处理中,焦点并没有扮演很重要的角色。如我们已经看到的,应用程序视图传递那些它不处理的当前拥有焦点的棋格的按键事件。
所有 Symbian 操作系统图形组件都支持焦点。首先,窗口服务器将焦点与窗口组(window group)关联起来。窗口服务器向当前拥有焦点的窗口组的应用程序发送按键。窗口组拥有应用程序的所有窗口,包括应用视图、菜单、对话框等。当应用程序的窗口组获得焦点和失去焦点时,窗口服务器就向应用程序发送获得焦点和失去焦点的事件。 对于窗口服务器的焦点改变事件,大多数应用程序都没有反应。不必重绘控件来表明它们已经失去了焦点,因为不管怎样,在屏幕上已经看不到失去焦点的应用程序了。
控件环境维护控件栈栈顶的可聚焦控件,并在焦点改变的时候调用控件栈上的FocusChanged()函数。与此相似,当容器控件改变焦点时,它们也应该调用包含控件的FocusChanged()函数。 控件应当根据是否具有焦点来改变自己的外观。如果需要可视化地表示焦点,则在绘图代码中使用IsFocused()来绘制适当的加亮效果或者光标。处理FocusChanged()以改变焦点状态(如重绘、激活或禁止光标)。FocusChanged()包含一个参数TBool aRedrawNow,表示是否需要即时重绘。
可以用 SetFocus()控制和询问焦点。它不遍历组件控件:每个容器根据它自己的需要处理SetFocus()的传播。
可以使用 SetNonFocusing()及相关函数来设置控件是否允许聚焦。对于一些控件来说(它们不处理输入),这可能是永久性状态;对于其他一些控件来说(类似于变灰),这可能是临时状态。 作为小结,下面列出了CCoeControl中与焦点相关的函数。
【责任编辑:
董书 TEL:(010)68476606】