CDialog 로 UI 를 구성할 때 조건에 따라서 UI 가 동적으로 생성되어야 하는 경우가 있습니다.

이때 해당 UI 의 이벤트 처리를 담당하는 함수를 어떻게 등록하는지 알아보겠습니다.

보통 CDialog 에 콤포넌트를 등록하려면 리소스 편집기에서 콤포넌트를 추가한 다음에 이벤트 핸들러를 등록합니다.

이런것들은 통합개발툴(IDE) 에서 해주는데요.. Visual Studio 가 그런 것을 자동으로 만들어주고 메시지맵을 등록시켜줍니다.
하지만 이런 경우는 콤포넌트의 위치나 생성이 정해져 있는 경우 이므로 동적으로 처리해야하는 방법은 직접 코딩을 해주어야합니다.

먼저 동적으로 처리하는 가장 확실한 방법은 직접 해당 콤포넌트를 서브클래싱 하는 방법입니다.

예를들어서  CButton 을 동적생성하여 해당 버튼이 클릭되었을때 이벤트를 처리하려면

class CMyButton : public CButton {}

이런식으로 서브클래싱한 후에 ButtonClicked 이벤트를 직접 처리해주는 것이죠.

하지만 단순한 동작을 하기 위해서 서브클래싱을 해준다면 파일이 매우 많아질 뿐더러 소스도 지저분해지게 됩니다. (사실 이게 지저분한 소스인지는 제 주관입니다.)

그래서 다른 방법을 찾아보았습니다.

지금 사용할 방법은 동적으로 등록한 콤포넌트의 이벤트 핸들을 해당 부모 윈도우인 Dialog 에서 간단하게 처리하는 방법입닏.

ON_CONTROL_RANGE 메세지 맵을 이용합니다.

예제입니다.

CMyDialog.h


CMyDialog.cpp



이벤트 처리 핸들러를 다른것으로 등록할 경우에는 다른 콤포넌트의 이벤트를 간단하게 받을 수 있습니다 .

+ Recent posts