Physical Address

304 North Cardinal St.
Dorchester Center, MA 02124

WM_USER 메시지 – 보다 강력한 프로그램 작성

WM_USER 메시지 – 보다 강력한 프로그램 작성

WM_USER 메시지를 사용하여 보다 강력한 프로그램을 작성해보자.

– 윈도우에서 가장 중요한 개념을 메시지라는 것이다. 윈도우는 대부분 사용자의 입력에 대하여 발생하는 혹은 시스템적으로 발생하는 메시지에 의하여 동작한다. MFC의 초보자를 탈출하기 위해 기본적으로 알아야할 지식이 바로 MFC의 메시지 처리이다. 이런 메시지는 대부분 윈도우 시스템이 발생시킨다. 마우스에 대한, 키보드에 대한, 실행, 종료에 대한 모든 메시지가 시스템에 의하여 발생된다. 이런 메시지의 처리 핸들러 즉 처리 함수는 MFC에 의하여 대부분 자동으로 기본틀이 제공되므로 우리는 단지 제공된 합수안에 원하는 처리를 하는 코드를 삽입하기만 하면 되는 것이다.

– 그럼 우리가 직접 윈도우한테 메시지를 넣을 수 있일까? 임의의 처리를 하는 해당 함수를 직접 호출을 해도 된다. 그러나 윈도우의 경우에는 함수를 직접 호출하지 못하는 부분이 종종있다. 예를 들기는 힘들지만 네트웍 프로그램을 하거나 복잡한 트리구조의 클래스를 제어하는 경우에 종종 함수를 직접 호출하지 못하는 경우가 있다. 그런 경우에 바로 사용자가 직접 정의한 메시지를 윈도우에 던져 처리를 하게 할 수가 있다. 그럼 차근 차근 살펴 보기로 하자.

– 윈도우 프로그램에서는 사용자를 위하여 0x0400 ~ 0x7fff 의 어마어마한 영역을 사용자 메시지 영역으로 제공한고 있다. 0x0400은 WM_USER 이라고 정의 되어있다. 이제 사용자가 자신의 메시지를 정의할 차례이다. 아래 코드를 보면 쉽게 이해될 것이다.

#define MY_MESSAGE1 (WM_USER+1)

#defien MY_MESSAGE2 (WM_USER+2)

#defien MY_MESSAGE3 (WM_USER+3)

– 너무나 쉽게 사용자 메시지를 정의하였다. 필자가 만든 메시지는 여러 윈도우에서 같이 쓰였기때문에 사용자 정의 메시지를 따로 모아두는 헤더 파일을 작성해두었다.

– 이제 자신이 원하는 부분에서 이 메시지를 던지자. 메시지를 던지는 방법은 여러 가지가 있는데 그중 아래의 두메시지가 가장 자주 쓰는 메소드이다.

PostMessage( MY_MESSAGE3 ); // 메시지 큐에 집어 넣는다.

SendMessage( MY_MESSAGE3 ); // 해단 핸들러( 함수 )를 마칠때까지 기다린다.

– 위의 함수는 MFC CWnd의 멤버함수이다.자세한 내용은 InfoView를 스스로 찾아보기 바란다. 참고로 위의 함수는 자신의 윈도우에서만 처리가 된다. 그렇지않고 브로드 캐스팅을 하는 방법을 필자는 MFC에서 찾질 못하였다. 그래서 WIN32 API를 호출하였다.

::PostMessage( HWND_BROADCAST, MY_MESSAGE3, 인자, 인자 );

::SendMessage( HWND_BROADCAST, MY_MESSAGE3, 인자, 인자 );

– 그럼 현재 자신의 윈도우뿐 아니라 다른 모든 윈도우에까지 메시지가 전달 되게 된다.

– 다음으로 살펴 볼 부분은 메시지를 잡아서 실제 처리를 하는 핸들러와 연결하는 부분이다. 다들 알겠지만 MFC의 메시지 처리는 메시지 멥이라는 특수한 구조를 가지고 처리하게된다. 사용자가 정의한 메시지 역시 메시지 맵을 통하여 핸들러와 맵핑되게된다. 그럼 맵핑을 시작해보자.

– 자신이 만든 메시지를 처리할 윈도우의.cpp 파일을 살펴보면 메시지를 맵핑 시키는 부분이 있을 것이다. 아래와 같이 코드를 삽입하여 보자

BEGIN_MESSAGE_MAP(CMyWindowClass, CMyParentWindowClass)

//{{AFX_MSG_MAP(CMyWindowClass)

ON_MESSAGE( MY_MESSAGE3, OnMyMessageHandler ) // 삽입된 부분

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

– 여기에서 OnMyMessageHandler는 사용자 정의 메시지가 도착 했을때 수행되는 함수의 이름이다. 그 다음에 .cpp 파일에 실제 핸들러 함수를 정의하자.

LRESULT CMyWindowClass :: OnMyMessageHandler( WPARAM wParam, LPARAM lParam )

{

………..

}

– 함수 코디이 끝났다면 이제 자신이 만든 메시지를 처리할 윈도우의 헤더 부분에 다음과 같이 함수를 선언하면 모든 것이 끝났것이다.

afx_msg LRESULT OnMyMessageHandler( WPARAM wParam, LPARAM lParam );

– 주위할것은 앞에 afx_msg가 붙는다는 것이다. 이것은 각자 조사하기를 바란다.

Leave a Reply

Your email address will not be published. Required fields are marked *