积极答复者
鼠标和区域判断的问题

问题
-
微软是如何让windows系统快速判断出鼠标指针当前在哪个窗口的呢,以便将鼠标消息发送到这个窗口?
试想一下现在让你实现图形界面的这部分功能,你怎么去实现呢?
能获得的数据只有屏幕大小,各个窗口的可见区域,以及鼠标的坐标。鼠标消息从硬件获得,在系统消息队列中排了长长的队伍,等待着你把它们取出来然后放到正确的窗口的消息队列中。而你能获得的数据仅仅是鼠标的坐标和你自己维护的一堆窗口可见区域数据,你该如何快速找到鼠标当前处在哪个窗口区域呢?肯定不能用遍历所有窗口可见区域的办法,这是最笨的办法,难道鼠标每移动一个像素就要遍历一边,否则万一这一个像素的变化正好使它从一个窗口到了另一个窗口怎么办?更何况极端地说如果有十万个窗口,难道也要从头遍历?
我真的想不出能有什么好的算法解决这个问题。个人考虑了个方法,可能贻笑大方:创建一个二维数组,行和列正好对应屏幕的横纵像素值,数组元素就是指向窗口对象的指针,根据窗口的可见区域给每个数组元素赋值,窗口位置改变了或者可见区域改变了就更新数组相应元素的值,这样只要知道鼠标横纵坐标就能直接获得窗口对象,并把消息发给它。
这个方法总感觉别扭,在此抛砖引玉,真不知道正确的方法是什么!
LHL- 已编辑 lhlzhxh 2009年8月20日 7:44
答案
全部回复
-
确实是个树,还是个多叉树,这样的话,一般来说一个树节点应包含子节点的链表。
那就意味着首先要遍历根节点的子节点链表,然后找到一个鼠标指针在其范围内的顶层窗口,然后再遍历这个窗口的子节点链表,再找到一个鼠标指针在其上的窗口,最终找到一个叶子节点为止,或者找到一个节点,它的叶子节点都不在指针之下。
这样的话,如果我真要疯狂创建数以万计的可见窗口,不管是顶层窗口也好还是子窗口也好,反正就是处于同一父窗口下的窗口,那么,且不管其他资源的消耗,如果我不停移动鼠标的话是不是还真能看出CPU占用明显上涨呢?
难道真的就是通过遍历的方式查找?
另外,刚才之所以把窗口放到一个平面上考虑,是因为觉得对于鼠标来说,窗口就是平面的。窗口虽然有层叠关系,但是对于鼠标来说它只管窗口的可见区域,而不是窗口的窗口区域或者说实际形状。所有窗口的可见区域拼起来正好是一个整屏。我当时感觉只考虑可见区域可能能直接排除很多不可见窗口的干扰,能减少比较。这个问题我考虑了一段时间,想不出答案,哈哈。
之所以想这个问题是因为最近想学习用Dx3D做图形界面,如果要自己模拟窗口的功能,可能要需要解决这个问题。
LHL