본문 바로가기

Win32 api

Win32 api 강의 48화.

- UI hover 감지 구현.

// CUI.h
...
class CUI : public CObject
{
private:
    ...
    bool            m_bCameraAffected;   // 카메라 영향을 받는지 여부.
    bool            m_bMouseHover;      // 마우스 오버 상태인지 여부.
    ...
public:
    ...
    inline bool IsMouseHover() const { return m_bMouseHover; }  

    virtual void OnMouseHover();

    virtual void OnLButtonDown();
    virtual void OnLButtonUp();
    virtual void OnLButtonClicked();
    ...
private:
    void MouseHoverCheck();

public:
    // CUI();
    CUI(bool bCameraAffected);
    virtual ~CUI();
};

 

카메라에 영향을 받는지 멤버 변수로 저장. 카메라 영향을 받는다는 것은 월드에 배치된 UI 를 뜻함.

생성자도 해당 여부를 받도록 기본 생성자를 바꿔줌.

// CUI.cpp
...
void CUI::render(HDC hDC)
{
    Vector2 pos = m_vFinalPos;
    Vector2 size = GetSize();

    if (m_bCameraAffected)
    {
        pos = CCamera::GetInstance()->WorldToScreen(pos);
    }
    ...
}

 

이에 따라 render 함수도 수정해줌. 카메라 영향을 받으면, 즉 월드 배치된 UI 라면 렌더링 포지션을 월드 좌표로 변환해줌.

// CUI.cpp
void CUI::MouseHoverCheck()
{
    Vector2 vMousePos = MOUSEPOS;
    Vector2 vFinalPos = m_vFinalPos;
    Vector2 vSize = GetSize();

    // 카메라 영향을 받는 UI라면, 마우스 위치도 월드 좌표로 변환.
    if (m_bCameraAffected)
    {
        vMousePos = CCamera::GetInstance()->ScreenToWorld(vMousePos);
    }

    if (vMousePos.x >= vFinalPos.x && vMousePos.x <= vFinalPos.x + vSize.x &&
        vMousePos.y >= vFinalPos.y && vMousePos.y <= vFinalPos.y + vSize.y)
    {
        m_bMouseHover = true;
    }
    else
    {
        m_bMouseHover = false;
    }
}

 

그리고 업데이트 돌 때마다 마우스 호버를 체크해줌. 

 

- UI 마우스 입력 처리.

// CUIMgr.h
...
class CUIMgr
{
    SINGLETON(CUIMgr)
private:
    void UIMouseCheck(CUI* pUI);
public:
    void init();
    void late_update();
};

 

UI Manager 에서 해당 처리를 담당함.

 

// CUIMgr.cpp
...
void CUIMgr::late_update()
{
    CScene* pCurScene = CSceneMgr::GetInstance()->GetCurScene();

    if (pCurScene)
    {
        const vector<CObject*>& vecUI = pCurScene->GetObjByGroup(GROUP_TYPE::UI);
        for (CObject* pObj : vecUI)
        {
            CUI* pUI = dynamic_cast<CUI*>(pObj);

            if(pUI == nullptr)
                continue;

            UIMouseCheck(pUI);
        }
    }
}

/// <summary>
/// UI 요소에 대한 마우스 입력을 검사하고 해당 이벤트를 처리합니다.
/// </summary>
void CUIMgr::UIMouseCheck(CUI* pUI)
{
    bool bLButtonTap = KEYTAPCHECK(KEY::LBUTTON);
    // bool bLButtonHold = KEYHOLDCHECK(KEY::LBUTTON);
    bool bLButtonRelease = KEYRELEASECHECK(KEY::LBUTTON);

    // 마우스 hover 상태일 때
    if (pUI->IsMouseHover())
    {
        pUI->OnMouseHover();
        // 마우스 왼쪽 버튼이 눌린 상태일 때
        if (bLButtonTap)
        {
            // 이전에 눌린 상태가 아니었다면, OnLButtonDown 이벤트 호출
            if (!pUI->IsLButtonDown())
            {
                pUI->OnLButtonDown();
            }
        }
        // 마우스 왼쪽 버튼이 떼어진 상태일 때
        else if (bLButtonRelease)
        {
            // 이전에 눌린 상태였다면, OnLButtonUp 및 OnLButtonClicked 이벤트 호출
            if (pUI->IsLButtonDown())
            {
                pUI->OnLButtonClicked();
            }
            pUI->OnLButtonUp();
        }
    }
    else // 마우스 hover 상태가 아닐 때
    {
        // 마우스 왼쪽 버튼이 떼어진 상태일 때
        if (bLButtonRelease)
        {
            // 이전에 눌린 상태였다면, OnLButtonUp 이벤트 호출
            if (pUI->IsLButtonDown())
            {
                pUI->OnLButtonUp();
            }
        }
    }
}

 

크게 마우스가 Hover 여부에 따라 나눔.

 

호버 중 → 눌림 → Down 이벤트.

            → 떼짐 → Up + 이전에 눌렸다면 Click 이벤트 

 

호버 아님 → 떼짐 → 이전에 눌렸다면 Up 이벤트.

'Win32 api' 카테고리의 다른 글

Win32 api 강의 51화.  (0) 2025.09.25
Win32 api 강의 49 - 50화.  (0) 2025.09.25
Win32 api 강의 47화.  (0) 2025.09.24
Win32 api 강의 46화.  (0) 2025.09.24
Win32 api 강의 44 - 45화.  (0) 2025.09.24