본문 바로가기

Win32 api

Win32 api 강의 53화.

- Button UI 클릭 이벤트 구현.

// CEvent.h
class CEvent
{
private:
    vector<pair<wstring, function<void()>>> m_vecListeners;
public:
    inline void AddListener(const wstring& name, const function<void()>& func) 
    { 
        m_vecListeners.push_back(make_pair(name, func)); 
    }
    inline void ClearListeners() { m_vecListeners.clear(); }
    void RemoveListener(const wstring& name);
    void Invoke() const;     

public:
    CEvent();
    CEvent(const CEvent& event);
    ~CEvent();
};

 

C# 처럼 Event 를 구현하고 싶었는데, 뭔가 좀 불안정한 것 같다. 아무튼 동작하긴 하는데, 문제는 헤더 파일을 global.h 에 포함해주면 에러가 나는 거? 이유를 아직은 모르겠다.

// CEvent.cpp
...
void CEvent::RemoveListener(const wstring& name)
{                                                           
    auto it = std::remove_if(m_vecListeners.begin(), m_vecListeners.end(),
                             [&name](const pair<wstring, function<void()>>& listener) {
                                 return listener.first == name;
                             });
    m_vecListeners.erase(it, m_vecListeners.end());
}

void CEvent::Invoke() const
{
    for (const auto& listener : m_vecListeners)
    {
        listener.second();
    }
}
...

 

아무튼 이렇게 Event 클래스를 정의해주고 나면, 버튼 클릭 이벤트 발생은 간단하다.

// CButtonUI.h
#include "CUI.h"
#include "CEvent.h"

class CButtonUI : public CUI
{
private:
    CEvent m_onClickEvent;

public:
    ...
    inline void AddOnClickEvent(const wstring& name, const function<void()>& func)
    {
        m_onClickEvent.AddListener(name, func);
    }
    inline void ClearOnClickEvent() { m_onClickEvent.ClearListeners(); }
    inline void RemoveOnClickEvent(const wstring& name) { m_onClickEvent.RemoveListener(name); }
    ...
};

 

그냥 멤버를 이렇게 추가해주면 됨. 

// CButtonUI.cpp
...
void CButtonUI::OnLButtonClicked()
{
    CUI::OnLButtonClicked();

    m_onClickEvent.Invoke();
}

 

그리고 OnLButtonClicked() 에서 Invoke 해주면 끝.

#pragma region button test.
    // 버튼 테스트.
    pGrandChildUI->AddOnClickEvent(L"click0", []() {
            ChangeScene(SCENE_TYPE::START);
        });
#pragma endregion

 

이런식으로 테스트해볼 수 있었다. 

뭔가 좀 깔끔하진 않은 것 같지만, 일단 구현은 성공했다.

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

Win32 api 강의 55 - 56화.  (0) 2025.09.29
Win32 api 강의 54화.  (0) 2025.09.27
Win32 api 강의 52화.  (0) 2025.09.26
Win32 api 강의 51화.  (0) 2025.09.25
Win32 api 강의 49 - 50화.  (0) 2025.09.25