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