[英]How to get the x,y coordinate of a mouse-click with win32 C++ on a directx object?
如何获得鼠标单击的x,y坐标,以查看它是否在DirectX绘制的菜单按钮上方? 目前,我的代码库具有以下与鼠标相关的类,而该类似乎无法给我提供此信息。.我不确定这可能如何工作。
InputMouse::InputMouse() :
m_LastX(-1),
m_LastY(-1)
{
m_MouseActionEvent.clear();
}
InputMouse::~InputMouse()
{
}
void InputMouse::PostUpdate()
{
m_CurrentAction.clear();
}
bool InputMouse::IsEventTriggered(int eventNumber)
{
for (unsigned int i = 0; i < m_CurrentAction.size(); i++)
{
if (m_MouseActionEvent.size() > 0 && m_MouseActionEvent[m_CurrentAction[i]] == eventNumber)
{
return true;
}
}
return false;
}
void InputMouse::AddInputEvent(int action, int eventNumber)
{
m_MouseActionEvent[action] = eventNumber;
}
void InputMouse::SetMouseMouse(int x, int y)
{
if (m_LastX != -1)
{
if (x > m_LastX)
{
m_CurrentAction.push_back(MOUSE_RIGHT);
}
else if (x < m_LastX)
{
m_CurrentAction.push_back(MOUSE_LEFT);
}
if (y > m_LastY)
{
m_CurrentAction.push_back(MOUSE_UP);
}
else if (y < m_LastY)
{
m_CurrentAction.push_back(MOUSE_DOWN);
}
}
m_LastX = x;
m_LastY = y;
}
如果您的菜单按钮是2D菜单,那么这就像记住按钮所用的屏幕坐标一样简单。
如果您要确定单击是否落在已渲染的3D对象上,那么您正在寻找的技术称为Picking 。
一个简单的Google用于“ Directx Picking”的结果很好:
基本上,该技术涉及将鼠标单击转换为射线并转换为场景。 对于您的菜单项,一个简单的边界框可能足以确定“命中”。
不论是否使用DirectX, GetCursorPos都会在屏幕坐标中检索鼠标的位置。 ScreenToClient会将屏幕相对点映射到相对于window / directX曲面的客户区域的点。
绘制对象后,系统不知道屏幕上更改了哪些像素,这些像素也不知道哪个或哪些对象更改了对象(即使这些对象甚至仍然存在)。 因此,如果您需要了解屏幕上的某些内容,则必须自己进行跟踪。 对于按钮和其他GUI元素,这通常意味着将GUI与定义每个元素边界的矩形一起保留在内存中。 然后,您可以将鼠标位置与每个元素的边界进行比较,以查看其指向哪个元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.