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