본문 바로가기

Library/Windows Programming

ATL/WTL의 메세지 핸들러 매크로

MFC와 ATL/WTL에서 메세지 핸들러를 작성할 때 가장 피부로 느껴지는 차이점은 미리 정의된 메세지 매크로의 존재이다. MFC에서는 이미 잘 포장되어 있는 각각의 컨트롤들의 메세지 핸들러들이 있고, 용도에 맞게 잘 분류되어 있다. 예를 들어, 버튼 메세지에 관한 것이라면 ON_BN_CLICKED과 같은 매크로를 사용하여 메세지 맵에 추가하면 된다. 그러나, ATL/WTL에서는 그러한 지원이 좋은 편이 아니다. ATL 자체가 그러한 것을 위한 고안된 것이 아니니 어쩔 수 없고, WTL의 atlcrack.h에서 이런 용도를 위해 미리 정의해 둔 메세지 매크로를 제공하지만, MFC의 그것처럼 세세하게 구분되어 있지 않다.

예를 들어, 어떤 컨트롤을 클릭했을 때 발동되는 함수를 정의하기 위해서 COMMAND_ID_HANDLER_EX 매크로를 사용해야 하며, 어떤 컨트롤의 특정 메세지를 받아서 그에 맞는 함수를 발동하기 위해서는  COMMAND_CODE_HANDLER_EX 매크로를 사용해야 한다. 즉, 각각의 컨트롤마다 개별적인 정의를 제공하는 것보다, API에 기반한 매크로를 제공한다는 개념인데, 이 방식을 선호할 수도 있고, MFC의 그런 각각의 정의를 제공하는 방식을 선호할 수도 있다. 메세지 핸들러 작성을 위해 atlcrack.h를 살펴보면, WPARAM, LPARAM의 각각의 워드를 직접 해석하는데 익숙했던 API 프로그래머들은 그다지 어렵지 않게 원하는 메세지 핸들러 매크로를 찾을 수 있을 것이다. 개인적으로는 API에 기반한 방법이 컨트롤의 메세지에 관계없이 동일한 매크로를 사용하여 코드를 작성할 수 있기 때문에 이쪽을 더 선호하는 편이다.

WTL은 작고 가벼운 프로그램을 만들어주는 좋은 툴이지만, 관련된 문서가 거의 없다보니 일일이 소스코드에서 직접 기능을 찾아서 문제를 해결해야 한다. 특히, Win32 API와 템플릿 활용 기법에 익숙하지 않다면 코드를 읽는 것조차 쉽지 않다는 것이 WTL의 가장 큰 문제이다.