2016. 12. 15. 23:36 MFC/기초
MFC) 사용자 메시지 등록
[들어가기 전]
MFC는 "메시지루프(Message Loop)"라는 방식을 제공한다.
MFC 응용 프로그램에서 발생한 다양한 이벤트들은 메시지 ID와 함께 "메시지처리 큐"에 저장되는데, 이 메시지처리 큐 내부에 메시지가 있는지 상시 검사하고 메시지가 있을 경우 꺼내서 처리하는 기능을 제공하는 것이 "메시지루프"이다.
MFC는 기본적으로 WM_xxx 형태의 메시지와 연동되는 처리함수를 제공한다. 그럼 사용자는 MFC에서 제공하는 기본 메시지들만 사용해야 하는 것인가?
답은 "아니다"이다. MFC는 친절하게도 사용자가 메시지를 직접 등록할 수 있도록 "사용자 메시지 등록"기능을 제공한다.
메시지를 구분하는 메시지 ID는 4Byte의 양의 정수형이며 해당 영역에서 원하는 숫자를 선택하면 된다. 메시지 ID를 선택할 때 windows System에서 사용중인 영역인 0~1023은 되도록 피하도록 해야한다.
그렇다면 윈도우에서 사용하는 메시지와 중복을 피할 수 있는 방법은 없을까?
MFC는 친절하게도 WM_USER라는 값을 제공하며, 이 [WM_USER+숫자] 형식으로 윈도우 메시지와 중복되는 경우를 피할 수 있다.
예를 들자면 이런 방식이다. (사용자가 UM_CREATEDMSG 라는 메시지를 정의했다고 가정)
#define UM_CREATEDMSG WM_USER+1
자세한건 예제를 보며 확인해보자.
[예제]
1) 프로젝트 - 클래스마법사 입장(여러번 설명했으므로 넘어갑니다)
2) 클래스마법사 - "클래스이름 : CMainFrm" 선택 - 하단 [사용자지정 메시지 추가]버튼 클릭
3) 사용자 지정 메시지에 원하는 메시지 ID 입력
4) 메시지 처리기 추가됨 확인
5) MainFrm.cpp에 메시지처리기 생성됨 및 Message_Map에 해당 메시지가 등록됨 확인
6) 메시지 생성완료 확인을 위해 MainFrm에 기능 추가하기
6-1) 리소스 뷰 - Menu - IDR_MAINFRAME 더블클릭
6-2) 필자와 같이 생성(여기에 입력에다 그냥 입력하면 됨)
6-3) "메시지 생성 확인"버튼 오른쪽마우스 클릭 - 이벤트 처리기 등록 선택
6-4) COMMAND 선택 - CMainFrame 선택 - [추가 및 편집]버튼 선택
6-5) MainFrm에 추가된 처리기 함수에 "SendMessage()"추가 (필자는 OnConfirm() )
6-6) 아까 만든 메시지처리기*OnUmCreatemsg)에 확인용 메시지박스 함수 추가
7) 프로그램 실행 후 상단 메뉴바에서 [테스트용] - [메시지 생성 확인] 선택
'MFC > 기초' 카테고리의 다른 글
MFC) 윈도우 메시지 란? (메시지맵과 메시지 라우팅의 원리) (1) | 2016.12.15 |
---|---|
MFC) SendMessage / PostMessage 설명 및 차이 (1) | 2016.12.15 |
MFC) MFC 제공 윈도우 메시지와 처리함수 만들기 (2) | 2016.12.15 |
MFC) LPSTR, LPCSTR, LPTSTR, LPCTSTR 설명 (0) | 2016.12.13 |
MFC) 각 구성요소 간 포인터 얻어오기 (0) | 2016.10.23 |