一个元对象获取焦点,分为被动获取焦点和主动获取焦点
被动焦点
一个对象被动的设置焦点,包括下面两种情况:
l 该对象是由用户的鼠标输入操作导致获取焦点,比如左键点击
l 该对象的某个子对象,由于被移除/隐藏/Disable导致失去焦点,焦点传递到自身导致获取焦点
元对象可以获取被动焦点,至少需要满足下面几个条件:
l 可见
l Enable
l 挂接了至少一个鼠标或者键盘事件
l 位置不为空等
被动焦点策略由元对象的focusstrategy属性来控制,包括下面两种情况:
l fuzzy 默认的焦点策略,只要对象收到了特定的鼠标事件,不管该事件是用户主动发起还是由于重定向、RouteToFather导致的,都会导致该对象被设置焦点
1) 对象挂接了鼠标/键盘消息,这样在收到了左键、中键或者右键的单击、双击消息,都会被设置焦点
2) 对象挂接了鼠标/键盘消息,并且收到了某个对象通过RouteToFather或者消息重定向而来的鼠标消息,包括左键、中键或者右键的单击、双击消息,那么也会被设置焦点
3) 对象的某个子对象,由于被移除/隐藏/Disable导致失去焦点,而对象本身也满足获取被动焦点的条件,那么焦点会传递到自身导致获取焦点
l auto 智能焦点策略,在满足上面所述的fuzzy策略下,并且满足下面条件的对象才会被设置焦点:
1) EditObject、RichEditObject、WindowlessFlashObject和EmbedTreeObject不管什么情况都可以设置被动焦点
2) 如果对象配置了有效taborder,那么可以设置被动焦点
3) 如果对象挂接了键盘相关事件,那么可以设置被动焦点(只挂接鼠标事件则不可获取被动焦点了)
4) 如果对象设置了默认的redirect,或者对键盘消息设置了redirect,那么可以设置被动焦点
主动焦点
主动焦点一般由用户显示的调用SetFocus来设置焦点,包括
l 直接调用元对象的SetFocus来设置焦点
l 对于RichEditObject和EmbedTreeObject,内嵌对象/内嵌hostwnd 设置焦点,而导致的获取焦点
元对象可以获取主动焦点,至少需要满足下面几个条件:
l 可见
l Enable
l 位置不为空等
主动焦点不受焦点策略影响,也不受对象是否挂接鼠标/键盘消息的影响