一、 元对象的光标
所有非实窗口对象,均可以通过属性cursor,来指定光标资源id,从而控制光标在该对象上时候的状态
由于对象树上存在很多对象,每个对象可能配置了不同的光标,也有部分对象没有配置光标,那么光标的命中策略如下:
1. 核心策略:按照zorder由高到低,依次进行命中测试,需要注意的是,如果两个对象zorder相同,那么结果随机
2. 当选取到了某个对象,首先查看该对象状态:
a) 如果该对象visible=false或alpha=0,那么光标命中忽略该对象,也即不影响下面其它对象;否则继续命中测试
b) 如果该对象enable=false,那么会拦截当前的光标命中,并且无论该对象是否配置了有效的cursor,都不会选取,也即会使用默认光标;否则继续命中测试
3. 如果该对象状态满足2,那么查看该对象是否配置了cursor:
a) 如果该对象配置了有效的cursor,那么会拦截当前的光标命中,命中测试终止
b) 如果该对象配置了透明光标<cursor>transparent</cursor>,那么光标命中忽略该对象,也即不影响下面其它对象,继续命中测试
c) 如果该对象没有配置有效的cursor,那么看该对象的直接/间接ownercontrol是否提供了有效的cursor,如果有,那么使用ownercontrol配置的cursor,拦截当前的光标命中,命中测试终止
需要注意的是,如果查找到某个ownercontrol是被disable了,不管其有没有配置cursor,都会终止继续查找
d) 如果该对象没有配置有效的cursor,并且也没有ownercontrol配置有效的cursor,那么该对象也会拦截当前的光标命中,但会使用默认光标
之所以提供对ownercontrol光标的查找,主要是方便xmlcontrol,只需要在ownercontrol自身配置一个光标,那么所有control里面的子对象都会使用该光标
下面几个对象的光标策略较为特殊:
1. WindowlessFlashObject
光标一般由所加载的flash素材提供,但如果强制在属性里面配置了cursor,那么会优先使用该cursor
2. EditObject和RichEditObject
光标是由文本排版核心提供,但如果强制在属性里面配置了cursor,那么会优先使用该cursor
3. 实窗口对象
光标直接由嵌入的实窗口决定,不属于引擎光标策略管理的范围
二、 HostWnd的光标
hostwnd也可以通过cursor属性来配置光标,需要注意的是,hostwnd的cursor优先级低于元对象的cursor,也就是当hostwnd需要决定某位置光标状态时候,会按照下述策略:
1. 对所绑定的对象树,进行光标命中,如果对象树上有对象提供了有效的cursor,那么使用该cursor;否则继续下一步
2. 如果hostwnd配置了cursor,那么使用该cursor;否则继续下一步
3. 使用该hostwnd默认的光标,一般是由窗口class提供的系统标准箭头光标
三、 光标ID
光标ID是用一个字符串表示,支持系统内置光标,支持自定义光标
1. 如果cursorid是IDC_XXX形式的光标,那么代表是系统内置光标id,光标id定义在winuser.h头文件里面,比如箭头光标便是“IDC_ARROW”
2. 如果cursorid是以#开头的字符串,那么#后面便认为是光标的系统句柄HCURSOR,用十六进制数字表示
这种情况主要用以用户想设置自己已经加载的光标句柄给元对象或者hostwnd,那么可以用#123456的形式设置进来
3. 如果上面两种情况都不是,那么认为该id就是一个cursor资源id,和image,texture等资源id类似,会尝试从所在XAR里面去查找并使用