gpt4 book ai didi

c++ - 帮助 HitTest 功能

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:11:30 25 4
gpt4 key购买 nike

我正在制作一个 Gui,其中 Widget 有子项,并且在 HitTest 和渲染中,子项都被裁剪到父项的矩形。然而,它并不总是这样。一个小部件可以选择不剪裁它的 child 。在这种情况下,子项绑定(bind)到父项的父矩形。我的渲染目前反射(reflect)了这一点,但我的 HitTest 没有。

这是我的 HitTest :

AguiWidget* AguiEventManager::GetWidgetUnderMouse( AguiWidget* root,
const AguiMouseEventArgs &mouse )
{
/* sets the current node to the root node
while a widget passes the hit test
and the current node has children,
iterate through the current node's
children and set the current node
to the child who passes the hit test */

AguiWidget* currentNode = root;

bool foundsomething = true;
while(foundsomething)
{
foundsomething = false;
if(currentNode->getChildWidgetCount() > 0)
for (std::vector<AguiWidget*>::const_reverse_iterator rit =
currentNode->getChildRBeginIterator();
rit < currentNode->getChildREndIterator(); ++rit)
{
if (((*rit)->intersectionWithPoint(mouse.getPosition())
)
&& (*rit)->isEnabled() && (*rit)->isVisible())
{
foundsomething = true;
currentNode = *rit;
break;
}

}

}
return currentNode;


}

我如何修改它来处理 (*rit)->isClippingChildren(); ?

目前,它所做的基本上是找到第一个通过 HitTest 的小部件,然后挖掘它的子部件,因为只有它们才有资格。它会继续这样做,直到没有更多的 child 可以挖掘,因此找到的最后一个小部件是正确的。这需要更改为更像这样的内容:

如果小部件未剪裁其子项,则如果其父项通过了 HitTest ,我们将检查未剪裁其子项的子项。如果他们都没有通过 HitTest ,那么我们需要返回并从我们原来的地方继续。

我觉得某种类型的队列可能有用,但我不确定如何使用。

修改的基本结果是,如果使用与上面相同的算法,结果将是相同的,除非一个小部件没有剪裁其子项,我们只是让它的子项作为父项的子项处理。

谢谢

最佳答案

为您的 AguiWidget 提供一个 hitTest,并让它在为正时递归到其子项中。然后当点击一个被裁剪的区域时,父(裁剪)widget 的 gitTest 将失败,并且永远不会对被裁剪的 Widget 执行 HitTest 。

关于c++ - 帮助 HitTest 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5114264/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com