본문 바로가기

Win32 api

Win32 api 강의 47화.

- UI 기본 설계.

// CUI.h
...
class CUI : public CObject
{
private:
    vector<CUI*>    m_vecChildUI;       // 자식 UI 포인터 벡터.
    CUI*            m_pParentUI;        // 부모 UI 포인터.

    Vector2        m_vFinalPos;       // 최종 위치(부모 위치 + 본인 위치).

public:
    virtual void update() override;
    virtual void late_update() override;
    virtual void render(HDC hDC) override;

public:
    CLONE(CUI)

    inline CUI* GetParentUI() const { return m_pParentUI; }
    inline void AddChildUI(CUI* pChild) { m_vecChildUI.push_back(pChild); pChild->m_pParentUI = this; }

    inline Vector2 GetFinalPos() const { return m_vFinalPos; }

private:
    void update_child_ui();
    void late_update_child_ui();
    void render_child_ui(HDC hDC);
    ...
};

 

부모에 대한 포인터와 자식들을 vector 로 관리해줌. 

렌더링할 때 최종 위치는 부모 위치 + 본인 위치로 계산.

 

// CUI.cpp
...
void CUI::update()
{
    update_child_ui();
}

void CUI::late_update()
{
    CObject::late_update();

    // 부모 UI가 있을 경우, 부모 위치 + 본인 위치를 최종 위치로 설정.
    m_vFinalPos = GetPos();
    if(m_pParentUI)
    {
        m_vFinalPos += m_pParentUI->GetFinalPos();
    }

    late_update_child_ui();
}

void CUI::render(HDC hDC)
{
    Vector2 size = GetSize();

    Rectangle(hDC, static_cast<int>(m_vFinalPos.x), static_cast<int>(m_vFinalPos.y),
        static_cast<int>(m_vFinalPos.x + size.x), static_cast<int>(m_vFinalPos.y + size.y));

    render_child_ui(hDC);
}

void CUI::update_child_ui()
{
    for(CUI* pChild : m_vecChildUI)
    {
        pChild->update();
    }
}

void CUI::late_update_child_ui()
{
    for(CUI* pChild : m_vecChildUI)
    {
        pChild->late_update();
    }
}

void CUI::render_child_ui(HDC hDC)
{
    for(CUI* pChild : m_vecChildUI)
    {
        pChild->render(hDC);
    }
}
...
CUI::~CUI()
{
    SafeDeleteVector(m_vecChildUI);
}

 

이제 씬에서 UI를 생성해보면

// CScene_Tool.cpp
...
void CScene_Tool::Enter()
{
    ...
    // UI 오브젝트 생성
    CUI* pUI = new CUI();

    pUI->SetSize(Vector2(100.f, 30.f));
    Vector2 vUISize = pUI->GetSize();
    pUI->SetPos(Vector2(static_cast<float>(ptResolution.x) - vUISize.x, 0.f));
    AddObject(pUI, GROUP_TYPE::UI);

    // 자식 UI 오브젝트 생성
    CUI* pChildUI = new CUI();
    pChildUI->SetSize(Vector2(50.f, 15.f));
    Vector2 vChildUISize = pChildUI->GetSize();
    pChildUI->SetPos(Vector2((vUISize.x - vChildUISize.x) / 2.f, (vUISize.y - vChildUISize.y) / 2.f));
    pUI->AddChildUI(pChildUI);
    // 씬에 자식 UI 오브젝트 추가
    AddObject(pChildUI, GROUP_TYPE::UI);
    ...
}

이렇게 부모 사각형 중앙에 자식 사각형이 그려지는 걸 확인.

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

Win32 api 강의 49 - 50화.  (0) 2025.09.25
Win32 api 강의 48화.  (0) 2025.09.24
Win32 api 강의 46화.  (0) 2025.09.24
Win32 api 강의 44 - 45화.  (0) 2025.09.24
Win32 api 강의 43화.  (0) 2025.09.23