사용자 정의 메시지란, WM_USER 메시지에 임의의 정수(양의 정수)를 더하여 정의한 메시지로 아직 기능이 정해지지 않은 메시지를 말한다. 메시지가 발생하는 시점이나 처리 방법은 전적으로 개발자가 결정한다. 다음은 예제소스다.
먼저 StdAfx.h 파일에 UM_TESTMESSAGE 라는 사용자 정의 메시지를 정의한다. 그리고 뷰 클래스 헤더에 다음과 같이 메서드의 원형을 정의한다.
LRESULT afx_msg OnTestMessage(WPARAM wParam, LPARAM lParam);
afx_msg 라는 상수는 아무런 의미가 없으므로 생략이 가능하나 이것을 명시하는 이유는 이 메서드가 메시지 핸들러 함수임을 알릴려고 하는 것이다. 이후 View 클래스에 메시지맵에 추가한다.
BEGIN_MESSAGE_MAP(CUserMsgDemo2View, CView)
// 표준 인쇄 명령입니다.
ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
ON_MESSAGE(UM_TESTMESSAGE, &CUserMsgDemo2View::OnTestMessage)
END_MESSAGE_MAP()
이 후 메시지가 발생하면 호출될 함수를 뷰 클래스에 만든다.
LRESULT CUserMsgDemo2View::OnTestMessage(WPARAM wParam, LPARAM lParam)
{
AfxMessageBox(_T("CUserMsgDemo2View::OnTestMessage()"));
return 0;
}
그 다음 메인프레임에 이벤트 처리기를 통해 핸들러함수를 추가한다.
void CMainFrame::OnMenuTest1()
{
GetActiveView()->PostMessage(UM_TESTMESSAGE,0,0);
}
이렇게 코딩을 하면, 멀티 쓰레드 프로그래밍의 특정 작업자 스레드에서 메인 프레임 윈도우나 뷰 윈도우에 접근할 때 유용하다. 작업자 쓰레드는 응용 프로그램의 흐름과 상관없이 별도로 처리되는 코드로, 작업자 스레드의 진행 상황을 사용자 인터페이스에 표시하려면 정기적으로 사용자 정의 해당 윈도우에 전달하면 된다.
또한 대용량 파일을 복사하는 경우에도 사용하는데, 메인 스레드가 멈추는 것을 방지하기 위해 복사 과정을 작업자 스레드로 작성하고, 진행 상황을 ::PostMessage() 함수를 이용해 메인 프레임 윈도우에 전달하면, 메인 프레임 윈도우에서 메시지의 파라미터로 전달받은 값을 계산하여 프로그레스 컨트롤의 현재 위치를 갱신하면 된다. AfxGetMainWnd() 함수를 이용하면 어디서든 메인 프레임 윈도우의 주소를 알아낼 수 있으므로 작업자 스레드가 사용자 정의 메시지를 보낼 때는 주로 메인 프레임 윈도우를 주로 활용한다.
'Windows > MFC' 카테고리의 다른 글
오너 드로우 버튼 ( Owner-Draw ) (0) | 2011.11.20 |
---|---|
서브 클래싱과 확장 컨트롤 (0) | 2011.11.20 |
MFC 객체 간의 접근 방법 (0) | 2011.11.19 |
CArchive 클래스 (0) | 2011.11.19 |
CFile 클래스 (0) | 2011.11.19 |