메시지 처리의 기본 개념 메시지 발생된 이벤트의 종류와 정보를 전달하는 일종의 상수 값 윈도우 프로그래밍 가장 중요한 것은 메시지를 처리하는 것 윈도우 시스템 Application 이벤트 발생 메시지 전송 메시지 처리 화면에 출력
메시지 처리의 기본 개념 메시지의 종류 윈도우 메시지 WM_ 로 시작하는 메시지 (WM_COMMAND 는 제외 ) 매개 변수가 있어 메시지를 어떻게 처리할 것인지를 결정 윈도우 관리 메시지 : 윈도우의 상태가 바뀔 때 발생 초기화 메시지 : 응용 프로그램이 메뉴나 대화상자를 구성 할 때 발생 입력 메시지 : 마우스, 키보드로 입력할 때 발생
메시지 처리의 기본 개념 메시지의 종류 컨트롤 통지 메시지 Button, Combo Box 와 같은 제어 객체나 자식 윈도우에서 부모 윈도우로 보내는 메시지 명령 메시지 메뉴, 툴바, 엑셀레이터 키와 같은 사용자 인터페이스 객체 로부터 발생되는 WM_COMMAND 메시지 명령메시지는 윈도우뿐만 아니라 도큐먼트, 도큐먼트 템 플릿, 뷰, 다른 애플리케이션 객체에 의해서도 발생될 수 있다.
메시지 처리의 기본 개념 SDK 프로그램 들어온 메시지를 switch 문을 사용하여 처리 MFC 프로그램 메시지 처리를 위해 메시지 맵을 사용 메시지 맵 메시지 번호와 메시지가 발생하였을 때 호출되는 함수 의 포인터 등의 정보를 갖고 있는 테이블 프로그램에 전달된 메시지와 메시지 핸들러 함수를 연 결하는데 사용 파생 클래스의 메시지 핸들러 함수가 우선
메시지 처리의 기본 개념 메시지 처리 단계 윈도우 클래스의 멤버 함수로 메시지 핸들러 함수 를 선언한다 메시지 맵에 메시지와 메시지 핸들러 함수를 묶는 메시지의 매크로를 추가한다. 메시지 핸들러 함수의 기능을 구현한다. 클래스 위저드 위의 세 가지 단계에서 마지막 단계의 메시지 핸들 러 함수의 본체만 사용자가 구현하도록 나머지는 자동으로 코딩을 해준다.
메시지 처리의 기본 개념 메시지 핸들러 함수 윈도우로부터 애플리케이션에 메시지가 전달될 때 해당 메시지를 처리하는 멤버 함수 함수 이름 윈도우 메시지의 WM_ 을 떼고 대신 On 을 붙여 시작한다. 함수 선언시 afx_msg 는 메시지 핸들러 함수라는 것을 나 타내는 말이다. 예 //{AFX_MSG(Practice2_1View) Afx_msg void OnKeyDown(); … //}AFX_MSG
메시지 처리의 기본 개념 윈도우 관리 메시지와 메시지 핸들러 함수 메시지 유형발생 상황메시지 핸들러 함수 WM_CREATE 윈도우가 생성될 때 OnCreate() WM_ACTIVE 윈도우가 활성화 될 때 OnActive() WM_PAINT 윈도우가 다시 그려질 때 OnPaint() WM_SIZE 윈도우 크기가 변경될 때 OnSize() WM_MOVE 윈도가 움직일 때 OnMove() WM_TIMER 설정된 타이머 시간이 됐을 때 OnTimer() WM_DESTRO Y 윈도우가 종료될 때 OnDestroy()
메시지 박스 AfxMessageBox() 함수 사용자에게 간단한 메시지를 출력하는데 사용되는 대화상자 함수 원형 Int AfxMessageBox(LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0) lpszText : 출력하고자 하는 문자열 nType : 대화상자에 설정되는 버튼 nIDHelp : 현재 상태에서 F1 키를 눌러 도움말을 실행하였을 때의 도움말 ID 디폴트 메시지 박스 스타일과 아이콘 메시지 박스 : MB_OK 아이콘 : MB_ICONEXCLAMATION
메시지 박스 메시지 박스 스타일과 반환 값 메시지 박스 스타일사용 가능한 버튼반환 값 MB_OK 확인 IDOK MB_OKCANCEL 확인, 취소 IDOK,IDCANCEL MB_YESNO 예, 아니오 IDYES,IDNO MB_YESNOCANCEL 예, 아니오, 취소 IDYES,IDNO, IDCANCEL MB_RETRYCANCEL 재시도, 취소 IDRETRY,IDCANCEL MB_ABORTRETRYIGNOR E 취소, 재시도, 무시 IDABORT,IDRETRY,IDIGNOR E
메시지 박스 아이콘 스타일 [ 위험 ] MB_ICONHAND 또는 MB_ICONSTOP [ 정보 ] MB_ICONINFORMATION 또는 MB_ICONASTERISK [ 물음 ] MB_ICONQUESTION[ 경고 ] MB_ICONEXCLAMATION
클래스 위저드 (ClassWizard) 클래스 위저드의 기능 메시지 매핑 기능 클래스에 멤버를 설정 OLE Automation 설정 Active X Event 설정 클래스 정보 설정
클래스 위저드 (ClassWizard) 메시지 패핑을 수행하는 탭 메시지 패핑을 수행하는 탭 클래스에 멤버를 설정하고자 할 때 사용하는 탭 클래스에 멤버를 설정하고자 할 때 사용하는 탭 ActiveX Event 설정하는 탭 ActiveX Event 설정하는 탭 OLE Automation 설정하는 탭 OLE Automation 설정하는 탭 클래스 정보 설정하는 텝 클래스 정보 설정하는 텝
클래스 위저드 (ClassWizard) 프로젝트에 설정되어 있는 클래스 리스트 새로운 클래스를 만들 때 사용 새로운 클래스를 만들 때 사용 메시지 함수 리스트 클래스와 여러 객체 ID 들 클래스와 여러 객체 ID 들 프로젝트명 선택된 함수로 이동하여 수정하고자 할 때 사용 선택된 함수로 이동하여 수정하고자 할 때 사용 선택한 함수를 지우고자 할 경우 사용 선택한 함수를 지우고자 할 경우 사용 선택한 메시지에 대해 함수를 만들 때 사용 선택한 메시지에 대해 함수를 만들 때 사용
클래스 위저드 (ClassWizard) Practice3-1 프로젝트를 AppWizard 로 SDI 형태로 만든다 Class name 항목에서 CPractice3_1View 를 선택 Object Ids 항목에서 CPractice3_1View 를 선택 Messages 항목에서 WM_SIZE 을 선택 Add function 버튼을 클릭하면 Member function 항목에 “ OnSize ON_WM_SIZE ” 이 삽입 된다. 윈도우의 크기를 변경하였을 때 메시지 처리 함수 만들기
클래스 위저드 (ClassWizard) Edit Code 항목을 클릭하면 CPractice3-1View.cpp 파일을 열고 수정할 위치에 커서를 위 치시킨다. 그 위치에 원하는 코딩을 한다.
실습 3-1 메시지 박스를 이용하여 윈도우 크기 출력하기 이 실습은 윈도우가 생성될 때 메시지를 출력하고, 윈 도우 크기를 바꾸었을 때 윈도우 크기를 출력하고, 윈 도우가 종료될 때 메시지를 출력하는 프로그램이다.
마우스 메시지 마우스 메시지와 메시지 핸들러 함수 메시지 유형발생 상황메시지 핸들러 함수 WM_MOUSEMOVE 마우스를 이동 OnMouseMove() WM_LBUTTONDBCLK 왼쪽 마우스 버튼을 더블 클릭 OnLButtonDbclk() WM_LBUTTONDOWN 왼쪽 마우스 버튼을 누름 OnLButtonDown() WM_LBUTTONUP 왼쪽 마우스 버튼을 놓음 OnLButtonUp() WM_RBUTTONDBCL K 오른쪽 마우스 버튼을 더블 클릭 OnRButtonDbclk() WM_RBUTTONDOWN 오른쪽 마우스 버튼을 누름 OnRButtonDown() WM_RBUTTONUP 오른쪽 마우스 버튼을 놓음 OnRButtonUp()
마우스 메시지 마우스 메시지 핸들러 함수의 매개 변수 nFlags 버튼이 눌리면서 키보드에서 특정한 키가 눌려졌을 때의 값이나 마우스의 눌림 값 MK_CONTROL : Ctrl 키가 눌림 MK_LBUTTON : 왼쪽 마우스 버튼이 눌림 MK_MBUTTON : 가운데 마우스 버튼이 눌림 MK_RBUTTON : 오른쪽 마우스 버튼이 눌림 MK_SHIFT : Shift 키가 눌림 point 클라이언트 영역 좌표 값으로 CPoint 클래스를 이용하여 제공된 다.
마우스 메시지 메시지 핸들러 함수의 매개 변수 사용 예 nFlags & MK_LBUTTON 의 값이 0 이 아니면 마우 스 메시지와 함께 왼쪽 마우스 버튼이 눌려졌다는 의미 이다. 연습 문제 2-1 에서 nFlags 의 사용 if((nFlags & MK_LBUTTON )| (nFlags & MK_RBUTTON)) m_strOutText = " 마우스를 드래그하고 있습니다."; else m_strOutText = " 마우스를 이동하였습니다.";
실습 3-2 디지털 시계 만들기 이번 실습은 화면에 디지털 시계를 출력하는 프로 그램을 작성하는 것이다. 왼쪽 마우스 버튼을 누르 면 시계가 동작한 다음 1 초 간격으로 현재 시간을 출력하고 오른쪽 마우스 버튼을 누르면 시계가 멈 춘다.
실습 3-2 SetTimer() 함수 UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) ); nIDEvent : 타이머 ID nElapse : WM_TIMER 메시지를 발생시킬 시간 간격이다. 사용되는 단위는 1000 분의 초이다. 1 초에 한번 메시지를 발 생시키기 위해서는 1000 으로 설정해주면 된다. lpfnTimer() : 설정된 시간 마다 호출되는 함수명이다. NULL 로 설정되면 OnTimer() 함수가 호출된다
실습 3-2 KillTimer() 함수 이 함수는 Timer 를 해제한다 KillTimer() 함수의 인수는 SetTimer 에서 설정된 Timer 의 ID 이다.
키보드 메시지 키보드 메시지와 메시지 핸들러 함수 문자가 입력된 사건에 발생되는 메시지 먼저 WM_KEYDOWN 이 발생되고 WM_CHAR 가 발생되고 마지막으로 WM_KEYUP 이 발생된다. 메시지 유형발생 상황메시지 핸들러 함수 WM_KEYDOW N 키를 누름 OnKeyDown() WM_KEYUP 키에서 손을 뗌 OnKeyUp() WM_CHAR 화면에 문자가 표시 되는 키를 누름 OnKeyChar()
키보드 메시지 키보드 메시지 핸들러 함수의 매개 변수 nChar : 눌려진 키의 가상키 코드이다. WM_CHAR 의 경우에는 눌려진 키의 문자 코드 nRepCount : 키를 계속 누르고 있을 경우 반복된 키의 입력 횟수이다. nFlags : 스캔코드, 이전 키 상태, 키가 눌러질 때의 Alt 키의 상태에 관한 정보가 전달된다.
실습 3-3 문자를 입력하고 이동시키기 이 실습은 키보드를 이용하여 문자를 입력하고 키 보드를 이용하여 문자열을 이동시키는 프로그램을 작성하는 것이다.
실습 3-3 Invalidate() 함수 여기서 키보드를 이용해 문자를 계속 입력하면 문자들이 연결 되어 멤버 변수 m_strOutText 에 저장된다. 그리고 문자를 입 력 시마다 화면을 다시 갱신해야 한다. Invalidate() 함수는 강 제로 WM_PAINT 메시지를 발생시키고, WM_PAINT 메시지 는 OnDraw() 함수를 호출해서 화면을 다시 그리는 역할을 한 다. Invalidate(TRUE) 는 윈도우의 작업 영역을 전부 지운 후 다시 그리고, Invalidate(FALSE) 함수는 그 반대이다. 디폴트 인자로는 TRUE 로 되어 있어 문자 입력 시마다 화면이 깜빡 거리게 되므로 여기서는 인수를 FALSE 로 설정한다.
연습문제 3-1 윈도우 가운데 현재 시간 출력하기 윈도우를 생성하면 (WM_CREATE) 시계가 동작하 고, 1 초 간격으로 현재 시간을 출력하고, 윈도우를 종료하면 (WM_DESTORY) 시계가 멈춘다. 또한 오 른쪽 마우스 버튼을 누르면 시계가 멈추고, 왼쪽 마 우스 버튼을 누르면 시계가 동작하도록 한다. CTime 클래스의 멤버함수 (GetYear(), GetMonth(), GetDay(), GetHour(), GetMinute(), GetSecond()) 를 이용하여 다음 그림과 같이 출력해보자.
연습문제 3-1 실행 화면
연습문제 3-2 문자열을 입력하고 키보드와 마우스를 통해 이동시키는 프로젝트를 작성하라. 에서 했던 것처럼 키보드를 통해 문자열 을 입력하고, 키보드를 이용하여 문자열을 이동시 키자. 왼쪽 마우스 버튼을 클릭하면 클릭한 위치에 문자열을 출력하도록 하자. 즉 문자열을 키보드와 마우스로 이동 가능하게 만드는 것이다.
연습문제 3-2 문자열이 아래쪽이나 오른쪽으로 더 이상 이동할 수 없을 때 메시지 박스를 이용하여 경고 메시지 ( ) 를 출력하게 하자. 오른쪽 마우스 버튼을 클릭하면 현재 문자열 출력 위 치를 정보 메시지 ( ) 박스에 출력하도록 하자.