【问题标题】:Event propagation in a Morphic GUIMorphic GUI 中的事件传播
【发布时间】:2010-01-19 14:06:17
【问题描述】:
我有一个 Squeak Morphic GUI 的图像,其中包含一些透明部分,因此不应接受任何鼠标事件等,但只是可见,但它需要在其他变形之前可见。
这就是为什么我认为将出现的鼠标事件传播到底层变形会很有用。有谁知道我的问题的解决方案或解决它的其他建议。
V <- mouseDownEvent
_____________________________ <- transparent image (BorderedMorph)
_____ _____ _____
_| |___| |___| |__ <- buttons waiting for click and drop events
_____________________________ <- basic morph
我希望这能说明我的问题。
【问题讨论】:
标签:
event-handling
smalltalk
squeak
morphic
【解决方案1】:
我能想到的最好的事情是以下几行(按平滑度递增顺序,工作可能性递减顺序)
- 记录事件,将透明图像移开,然后重播事件。这似乎是一种低效且糟糕的方式。
- 以某种方式跟踪透明图像背后的焦点,并将事件传递给它。我不熟悉有问题的图书馆,所以我不知道是否可以这样做。如果您可以控制其他层,那么这很可能是要走的路。 (您可以使用 mouseDownEvent 直接调用他们的“发生鼠标事件”函数,但您仍然必须确定哪个会接收它)。
- 只需将其声明为在任何可用级别都不会将鼠标事件传递给它的东西。 OSD 窗口倾向于这样做,我不确定如何。如果您可以这样做,我会建议您这样做...但是鉴于您要问这个问题,您可能不能这样做。
【解决方案2】:
默认情况下,变形鼠标事件在最顶层的变形中处理。但是,父 morph 可以使用 #mouseDownPriority 将 #mouseDown 拦截到子代。
您的透明图片获得了所有点击,因为它是最高的。看看#rejectsEvent:。它只是结合#isLocked 和#visible 来拒绝事件。您可能希望覆盖它以拒绝即使可见的事件。
例如:
MyMorph>>rejectsEvent: anEvent
^ true "Ignores all events."