繁体   English   中英

如何使用Win32 C ++在DirectX对象上获取鼠标单击的x,y坐标?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM