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

时间:2009-12-06 07:14:23

标签: c++ winapi directx

如何获取鼠标点击的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;
}

3 个答案:

答案 0 :(得分:2)

如果您的菜单按钮是2D,则应该像记住用于按钮的屏幕坐标一样简单。

如果您正在尝试确定点击是否落在已渲染的3D对象上,那么您正在寻找的技术称为 Picking

"directx picking"的简单Google可以带来一些好结果:

基本上,该技术涉及将鼠标点击转换为场景中的光线。对于您的菜单项,一个简单的边界框可能足以确定“点击”。

答案 1 :(得分:1)

DirectX与否,GetCursorPos将在屏幕坐标中检索鼠标的位置。 ScreenToClient会将屏幕相对点映射到相对于窗口/ directX表面的客户区域的点。

答案 2 :(得分:0)

一旦绘制了一个对象,系统就不知道它改变了屏幕上的哪些像素,这些像素也不知道哪个或哪些对象改变了它(这些对象是否仍然存在)。因此,如果您需要知道屏幕上的某些内容,则必须自己进行跟踪。对于按钮和其他GUI元素,这通常意味着将GUI与定义每个元素边界的矩形一起保存在内存中。然后,您可以将鼠标位置与每个元素的边界进行比较,以查看它所指向的位置。