MFC 메시지를 이용한 통신
메시지를 이용한 통신
메시지를 보내는 데는 다음과 같이 두 가지 방법이 있다.
- SendMessage 함수를 이용하는 방법
- PostMessage 함수를 이용하는 방법
CWnd::SendMessage 함수
SendMessage 함수는 윈도우에 메시지를 보내는 함수로서 다음과 같이 정의되어 있다.
LRESULT SendMessage(UINT message, WPARAM wParam = 0, LPARAM lParam = 0);
이 함수는 매개변수로 메시지의 종류와 추가적인 정보를 담기 위한 wParam, lParam을
인자로 넣어 주도록 되어 있다. 또, 이 함수는 CWnd 클래스의 멤버 함수라는 점에
주목하자. CFrameWnd 클래스에서 SendMessage 함수를 호출하면 프레임 윈도우로
메시지가 날아가고 CView 클래스에서 SendMessage 함수를 호출하면 뷰 윈도우로
메시지가 날아 가게 된다.
그러나 CWnd 클래스에서 상속받지 않은 CWinApp 클래스나 CDocument 파생 클래스에
서는 SendMessage 함수를 호출할 수 없다. 만약 메인 프레임 클래스 밖에서 메인
프레임 윈도우로 메시지를 보내고 싶으면 다음과 같이 하면 된다.
AfxGetMainWnd()->SendMessage(..., ..., ...);
SendMessage 함수를 이용하여 어떤 윈도우에 WM_MOUSEMOVE 메시지를 보내면 마우스를
움직이지 않고도 마우스가 움직일 때 수행되는 동작을 하도록 할 수 있고 WM_KEYDOWN
메시지를 보내면 키보드를 누르지 않고도 키보드가 눌린 것처럼 동작을 시킬 수가
있다.
또한 메인 프레임 윈도우로 WM_COMMAND 메시지를 보내면 메뉴를 선택하지 않고도
메뉴가 선택됐을 때 하는 동작을 수행하도록 할 수 있다.
예를 들면,
AfxGetMainWnd()->SendMessage(WM_COMMAND, ID_FILE_OPEN);
이라고 메시지를 보내주면 프로그램은 사용자가 메뉴에서 파일 열기 항목을 선택했을
때와 똑같은 동작을 수행하게 된다.
CWnd::PostMessage 함수
SendMessage 함수와 비슷하게 메시지를 보내는 기능을 하는 함수로 PostMessage 함수가
있다.
BOOL PostMessage(UINT message, WPARAM wParam = 0, LPARAM = lParam = 0);
이 함수와 SendMessage 함수의 차이점은 메시지 큐를 거치느냐 아니냐 하는 것이다.
SendMessage 함수를 이용하여 메시지를 보내면 메시지가 메시지 큐를 거치지 않고
직접 메시지 처리기를 호출한다. 따라서, SendMessage 함수를 호출함과 동시에
해당하는 메시지 처리기가 호출된다.
반면 PostMessage 함수는 메시지를 메시지 큐에 넣어 주는 일만 한다. 따라서
PostMessage 함수를 이용하여 메시지를 보내주면 현재 수행되고 있는 함수가
완전히 끝나고, 메시지 큐에 쌓여 있던 메시지들의 처리기가 다 수행되고 난
후에야 PostMessage 함수로 보낸 메시지의 처리기가 호출된다.
댓글 없음:
댓글 쓰기