问个正在困扰我的问题

San_Daniel 2001-08-31 09:21:38
我在做一套跨平台用户界面类库,目前的设计是将基本元素component(可以理解为Windows下的 window)使用prior和next两根指针按Z轴顺序连接。同时,使用container类将component成组,进行管理,container是composite模式。把一个container上的某个component称作该container的孩子。使用一个server类接受系统消息,server类聚合一个container,并委托container对直接孩子进行管理。
每一个component使用一个矩形约束它的边界。
问题:当server接收到一个mouse move消息,并得知当前的鼠标位置在x,y处,它应该如何确定当前应处理该消息的component?
我目前的设计是,server检查自己直接孩子的矩形,确定将消息发给哪一个孩子,该孩子再检查自己的孩子,直到发现应该接受消息的component为止。虽然用起来感觉还不错,但心里上觉得其中冗余太多,计划改为按Z轴次序到序(高-低)查找,但细细分析下来,仍然不甚理想请各位大虾不吝赐教,谢过
...全文
309 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
Yake 2002-01-10
  • 打赏
  • 举报
回复
可是,二义性呀,MMD整死我了。
San_Daniel 2001-09-05
  • 打赏
  • 举报
回复
bnwxf(bnwxf) :hehe,有理
bnwxf 2001-09-05
  • 打赏
  • 举报
回复
to San_Daniel(丹少爷):
你的问题兄弟看不懂,不过我自己经常有这样的经验:当我觉得一个问题十分复杂的时候,
往往是我自己想得太复杂了,太追求完美。
krerix 2001-09-05
  • 打赏
  • 举报
回复
gz,这么好的问题应该up
ed9er 2001-09-04
  • 打赏
  • 举报
回复
alou,偶跟9:19:56的时候还没看到你

Deadheart 2001-09-04
  • 打赏
  • 举报
回复
gz
San_Daniel 2001-09-04
  • 打赏
  • 举报
回复
alou:这是一种不错的思路!不过,一个component的可见区域应该用什么样的数据结构描述呢?肯定不是矩形,可能是一个矩形的集合。进一步的,对可见区域的更新必须追溯到最底层的窗口才能完成,因为自己可能被覆盖,父亲也可能被覆盖……当component多时可能速度上有问题。特别是很多操作会引起大范围的更新,比如拖动一个窗口。无论如何,这是一种有前途的方案,让我再考虑考虑
alou 2001-09-04
  • 打赏
  • 举报
回复
ed9er(始祖鸟):大家聊聊天还是很有收获的啊,总比没事干泡QQ好啊。
ed9er 2001-09-04
  • 打赏
  • 举报
回复
有人贴程序哦...在每个container里维护两个sorted的横纵坐标的vector就行了
ed9er 2001-09-04
  • 打赏
  • 举报
回复
你说话怎么总是这种口气,别人都是煞笔,就你懂啊?
你继续摆吧,当我什么没说,明眼人能看出来我说的是不是“你原先设计的简化版”



alou 2001-09-04
  • 打赏
  • 举报
回复
抛砖引玉。没有代码,讨论起来不方便。
如果能够记住当前窗口(这里当前窗口指的是鼠标所在位置能够看见的最顶部的窗口),每次mouse move的时候询问这个窗口是否超出了它的可见区域,那么可以用较少的查询获知当前窗口切换的时机。
当窗口的Z次序改变时,所有窗口需要更新自己的可见区域。

_topWindow表示当前能够看见x, y点的最顶上的窗口。它有可能不是最顶窗口,当_topWindow改变的时候也不一定需要更新各个窗口的可见区域。

server.onMouseMove
if( !_topWindow.canSee( x, y ) )
{
parentWindow = _topWindow.parentWindow;
while( !parentWindow.canSee( x, y ) )
{
parentWindow = parentWindow.parentWindow;
}
childWindow = parentWindow.getChildCanSee( x, y );
while( childWindow != null )
{
parentWindow = childWindow;
childWindow = parentWindow.getChildCanSee( x, y );
}
_topWindow = childWindow;
}


San_Daniel 2001-09-04
  • 打赏
  • 举报
回复
ed9er(始祖鸟):这个问题没有你说的那么简单,我相信你多少也有点斤两,动动脑子,你就会发现你的思路只是我原先设计的简化版。你的思路中,最难处理的地方是什么时候切换,就是说怎么刻画当前窗口应该切换这件事。按钮自己当然不能做出这样的决定,因为自己可能被压在下面。container有能力决定,但要求消息必须是从最下面一路传过来,因为container也有可能被覆盖。一旦这样做,就与我原先的设计完全一致,从消息的传递到仲裁策略。

为了不忽略每一次可能的窗口切换,必须在每一次mousemove时裁定接收消息的component。瞧,你把我的问题又还给我了
xiterator 2001-09-03
  • 打赏
  • 举报
回复
一点乱想:各种类间的组织架构暂不考虑包容关系,最简单的问题是如可确定当前应处理该消息的component。将对消息有可能处理的所有候选对象用基本的link结构连接起来,同时为该link结构建立一个动态的缓冲hash其中可按LRU/LFU等策略存放消息和响应的响应对象,以加快消息的命中。这一设计思路取自MFC的windows消息路由设计(也与OS的内存换页很相近),感兴趣可以详见wincore.cpp源码。

若能直接静态hash消息和响应对象是最简单/最好不过的事了。

ed9er 2001-09-03
  • 打赏
  • 举报
回复
当前窗口的意思是,接受mouse move的当前窗口

ed9er 2001-09-03
  • 打赏
  • 举报
回复
重叠也应该有Z轴吧,你不要告诉我用户在重叠区域按下去的话,两个按牛都会收到click,那就不谈了

切换当前窗口的条件无非就是检查边界,对于矩形的情况效率非常高,而且很简单
当然,如果你要考虑多边形和二次曲面的窗口的话会立即变得非常复杂,这种时候用从Z坐标由高到低检查在哪个窗口的区域可能更快
fsb_12345 2001-09-03
  • 打赏
  • 举报
回复
gz
San_Daniel 2001-09-03
  • 打赏
  • 举报
回复
up, I need more ideas
San_Daniel 2001-09-03
  • 打赏
  • 举报
回复
to ed9er:
一个窗口,上面有若干按钮,其中,窗口按钮都是component,该窗口是活动的,但鼠标在该窗口上活动时,由最上面的component处理该消息,请问,如何判定哪一个component,用你说的方法,什么条件下切换。注意,两个按钮可能是重叠的或部分重叠的
请教
ed9er 2001-09-03
  • 打赏
  • 举报
回复
我不知道你是不是需要同时把mouse move的消息发给多给窗口,windows是不会的
记住是哪个window应该获得消息,什么条件下切换。。。
而不是拿到消息以后一个个去找

hehe,看你们这样用OO满开眼界的
ed9er 2001-09-03
  • 打赏
  • 举报
回复
哈哈,各位真会摆谱,佩服!

加载更多回复(13)

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧