簡體   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