C++ cli (C+;+;/CLI)在与父项相关的矩形中测试鼠标位置

C++ cli (C+;+;/CLI)在与父项相关的矩形中测试鼠标位置,c++-cli,contains,C++ Cli,Contains,我一直在胡闹着在面板上画些东西。到目前为止,我一直在使用。在面板上,通过单击按钮,它在随机位置生成一个矩形,并将其添加到其他矩形的数组中(它们实际上是一个名为UIElement的类,其中包含一个矩形成员)。单击此面板时,将对所有元素运行测试,以查看鼠标是否位于其中任何元素内,如下所示: void GUIDisplay::checkCollision() { 点cursorLoc=光标::位置; 对于(int a=0;abounds.Contains(cursorLoc)) { elementLi

我一直在胡闹着在面板上画些东西。到目前为止,我一直在使用。在面板上,通过单击按钮,它在随机位置生成一个矩形,并将其添加到其他矩形的数组中(它们实际上是一个名为UIElement的类,其中包含一个矩形成员)。单击此面板时,将对所有元素运行测试,以查看鼠标是否位于其中任何元素内,如下所示:

void GUIDisplay::checkCollision()
{
点cursorLoc=光标::位置;
对于(int a=0;abounds.Contains(cursorLoc))
{
elementList[a]->Select();
//MessageBox::显示(“单击!”,“事件”);
继续;
}
elementList[a]->取消选择();
}
}
m_pDisplay->Refresh();
}
问题是,当我单击矩形时,什么也没有发生

UIElement类在以下代码位中绘制其矩形。不过,我对它做了一些修改,因为在中,它使用了方法来实际绘制,就像我使用的方法一样。当我更改它时,我注意到DrawReversibleFrame绘制的位置与FillRectangle不同。我认为这是因为DrawReversibleFrame使用其相对于窗口的位置进行绘制,而FillRectangle则使用其相对于任何绘制事件的位置进行绘制(在面板的绘制方法中进行挖掘)。因此,让我仅显示代码:

void UIElement::render(图形^g)
{
如果(选定)
{
画笔^line=gc新画笔(颜色:黑色,3);
//g->FillRectangle(gcnew SolidBrush(颜色:红色),边界);
ControlPaint::DrawReversibleFrame(边界、SystemColor::高光、FrameStyle::厚);
g->FillRectangle(gcnew SolidBrush(颜色::黑色),边界);
//g->DrawLine(线,bounds.X,bounds.Y,bounds.Size.Width,bounds.Size.Height);
}
其他的
{
ControlPaint::DrawReversibleFrame(边界,SystemColor::ControlDarkDarkDark,FrameStyle::厚);
//g->FillRectangle(gcnew SolidBrush(SystemColor::ControlDarkDarkDarkDark),边界);
}
}
我同时添加了DrawReversibleFrame和FillRectangle,这样我就可以看到它们的区别了。单击DrawReversibleFrame绘制的框架时,它的外观如下:

橙色框是我单击的地方,黑色框是渲染的地方。这说明矩形的Contains()方法是查找与窗口相关的矩形,而不是面板。这就是我需要解决的:)

我想知道这是否是因为碰撞是在panels Paint方法之外测试的。但我不知道如何在Paint方法中实现这种碰撞测试

更新:

好的,我刚刚发现DrawReversibleFrame和FillRectangle绘制的东西似乎总是相隔一定距离。我不太明白这一点,但其他人可能会这样做。

两者都在屏幕坐标中操作。这适用于整个屏幕,显示器上的所有内容,而不仅仅是窗口。另一方面,操作窗口坐标,即窗口内的位置

如果以使用这两个框绘制的示例为例,两个框之间的距离始终相同,然后在屏幕上移动窗口,然后再次单击,您将看到两个框之间的差异发生了变化。它将是窗口左上角和屏幕左上角之间的差异

这也是为什么当你检查你点击的矩形没有击中任何东西时。您正在测试屏幕坐标中的光标位置与窗口空间中的矩形坐标。它可能会击中其中一个矩形,但它可能不是您实际单击的矩形

你必须知道你的变量所在的坐标系。这与乔尔·斯波尔斯基在其作品中谈到的初衷有关

更新:

并且应该用来在屏幕坐标和窗口坐标之间转换坐标。

谢谢,我想我必须做一些数学来修正这个。很酷,这让它更容易:)