호서대학교 컴퓨터공학
1
Microsoft Foundation Class
고급 프로그래밍 Chapter 6 마우스 입력
호서대학교 컴퓨터공학
Microsoft Foundation Class 1. 마우스 메시지
마우스의 구성
왼쪽 버튼 , 오른쪽 버튼 , 휠 등의 세가지 버튼으로 구성 .
볼 마우스 , 광학 마우스 , 트랙 볼 마우스 등 다양 함 .
다양한 마우스의 종류에 비해 생성하는 메시지는 모두 동일함 .
일반 마우스 메시지 처리 코드 하나로 다양한 마우스 적용가능 .
마우스의 동작
클릭 = 마우스 버튼 다운 + 마우스 버튼 업의 조합 .
무브 = 클릭의 관계 없이 마우스를 움직이는 행위 .
호서대학교 컴퓨터공학
Microsoft Foundation Class 1. 마우스 메시지
마우스의 버튼에 따른 메시지 구성
마우스의 3 가지 버튼에 따라 메시지가 각각 다르게 발생 .
버튼
누름 ( 다운 )
놓음 ( 업 )
더블클릭
왼 쪽
WM_LBUTTON DOWN
WM_LBUTTON UP
WM_LBUTTON DBLCK
오른 쪽
WM_RBUTTON DOWN
WM_RBUTTON UP
WM_RBUTTON DBLCK
가운 데
WM_MBUTTON DOWN
WM_MBUTTON UP
WM_MBUTTON DBLCK
호서대학교 컴퓨터공학
Microsoft Foundation Class 1. 마우스 메시지
nFlag( 조합키 ) 에 따른 메시지 구성
키보드와 마우스가 동시에 눌렸을 시 키보드 키 값에 따라 미리 가상 으로 정의되어 있음 . 값
설명
MK_CONTROL
Ctrl 키가 눌러져 있다 .
MK_LBUTTON
마우스 왼쪽버튼 눌러져 있다
MK_RBUTTON
마우스 오른쪽버튼 눌러져 있다 .
MK_MBUTTON
마우스 중간 버튼 눌러져 있다 .
MK_SHIFT
Shift 키가 눌러져 있다 .
호서대학교 컴퓨터공학
Microsoft Foundation Class 1. 마우스 메시지
자주 사용하는 마우스 메시지와 핸들러
WM_MOUSEMOVE 메시지 = OnMouseMove 핸들러 동작 .
WM_LBUTTONDOWN 메시지 = OnLButtonDown 핸들러 동작 .
WM_LBUTTONUP 메시지 = OnLButtonUp 핸들러 동작 .
WM_LBUTTONDBCLK 메시지 = OnLButtonDbClk 핸들러 동작 .
그 외의 마우스 메시지와 핸들러
WM_MOUSEWHEEL 메시지 = OnMouseWheel 핸들러 동작 .
WM_RBUTTONDOWN 메시지 = OnRButtonDown 핸들러 동작 .
호서대학교 컴퓨터공학
Microsoft Foundation Class 1. 마우스 메시지
클라이언트 (Client) 영역
화면의 하얀색 부분 ( 차일드 뷰 = 뷰 창 ) 에서 발생
WM_MOUSEMOVE / WM_LBUTTONDOWN
WM_RBUTTOMDOWN / WM_RBUTTONUP
넌 클라이언트 (Non-Client) 영역
제목표시줄 , 최소화 버튼 등에서 발생
WM_NCMOUSEMOVE / WM_NCLBUTTONDOWN
WM_NCRBUTTONDOWN / WM_NCRBUTTONUP
WM_NCLBUTTONDBLCLK / WM_NCRBUTTONDBLCLK
호서대학교 컴퓨터공학
Microsoft Foundation Class 1. 마우스 메시지
마우스의 중요사항
마우스 메시지에서는 좌표가 가장 중요함 .
마우스 이벤트 발생 시 매개변수로 좌표를 넘겨 받음 .
마우스 이벤트가 발생한 위치 ( 좌표 ) 에 대한 처리 .
마우스 포인터의 좌표 저장
CPoint 클래스를 이용하여 객체를 생성 후 사용 함 .
CPoint 클래스 내부에 X 값과 Y 값을 저장 할 변수가 이미 선언 . •
Ex) CPoint m_ptMouse ; ● m_ptMouse = point;
호서대학교 컴퓨터공학
Microsoft Foundation Class 1. 마우스 메시지 마우스를 움직일 때의 마우스 좌표 획득 void CMouseMsgView::OnMouseMove(UINT nFlags, CPoint point) { m_ptMouse = point; // 현재의 좌표를 저장 함 . RedrawWindow( ); CView::OnMouseMove(nFlags, point); }
마우스가 움직일 때 발생하는 메시지 처리하기 위한 함수 실행 .
OnMouseMove 함수가 실행 될 때 전달받은 매개변수를 주목 .
마우스 좌표를 저장하기 위해 선언한 m_ptMouse 객체에 운영체제 로부터 전달받은 좌표인 point 를 대입 함 .
호서대학교 컴퓨터공학
Microsoft Foundation Class 1. 마우스 메시지 모니터에 마우스의 좌표를 출력 void CMouseMsgView::OnPaint( ) { CPaintDC dc(this); // device context for painting CString strData = _T(""); strData.Format(_T("X:%03d, Y:%03d"), m_ptMouse.x, m_ptMouse.y); dc.TextOut(10, 10, strData); } • CString 클래스를 이용하여 문자열을 저장할 변수 선언과 초기화 . • Format() 함수를 이용하여 출력할 문자열을 버퍼에 저장 . • TextOut() 함수를 이용하여 좌표 10, 10 에 문자열 출력 . 호서대학교 컴퓨터공학
Microsoft Foundation Class 1. 마우스 메시지 TRACE() 매크로를 이용한 마우스 메시지 출력 BOOL CMouseMsgView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) { CString strTmp = _T(""); strTmp.Format(TEXT("OnMouseWheel( ) zDelta : %d\n"), zDelta); TRACE(strTmp); return CView::OnMouseWheel(nFlags, zDelta, pt); } • •
OnMouseWheel() 함수의 매개변수 zDelta 변수는 마우스 휠이 어 느 방향으로 움직였는지에 대한 정보가 들어있음 . TRACE() 매크로는 출력창에 문자열을 출력하는 매크로 임 .
호서대학교 컴퓨터공학
Microsoft Foundation Class 2. 마우스 움직임의 조합
마우스 움직임의 조합
클릭 : 마우스 다운과 마우스 업이 조합 됨 .
더블클릭 : 클릭을 빠른 속도로 2 회 반복함으로써 조합 .
드래그 앤 드롭 : 마우스 다운과 마우스 무브 그리고 ●
마우스 업의 3 가지 이벤트의 조 합.
마우스의 동작
클릭 = 마우스 버튼 다운 + 마우스 버튼 업의 조합 .
무브 = 클릭의 관계 없이 마우스를 움직이는 행위 .
호서대학교 컴퓨터공학
Microsoft Foundation Class 2. 마우스 움직임의 조합
마우스 움직임의 조합
클릭 : 마우스 다운과 마우스 업이 조합 됨 .
더블클릭 : 클릭을 빠른 속도로 2 회 반복함으로써 조합 .
드래그 앤 드롭 : 마우스 다운과 마우스 무브 그리고 ●
마우스 업의 3 가지 이벤트의 조 합.
마우스의 동작
클릭 = 마우스 버튼 다운 + 마우스 버튼 업의 조합 .
무브 = 클릭의 관계 없이 마우스를 움직이는 행위 .
호서대학교 컴퓨터공학
Microsoft Foundation Class 2. 마우스 움직임의 조합
드래그 앤 드롭
드래그 앤 드롭이란 , 마우스 다운과 마우스 무브 그리고 마우스 업 의 3 가지 이벤트의 조합이며 마우스 무브 발생 시 마우스가 다운된 상태인지를 알고 있어야 함 .
마우스의 버튼의 다운 / 업 상태를 항상 저장하기 위하여 플래그를 사용함 .
플래그 (Flag)
컴퓨터의 상태를 알기 위하여 참 / 거짓 형태의 변수를 사용 .
BOOL m_bDragFlag
호서대학교 컴퓨터공학
Microsoft Foundation Class 2. 마우스 움직임의 조합
마우스 버튼 상태를 위한 플래그 (Flag)
생성자를 이용하여 플래그 변수 m_bDragFlag 를 false 로 초기화 .
M_bDragFlag 의 상태가 false 일 시 버튼이 UP 상태 , true 일 시 버튼이 DOWN 상태 임 .
if – else 문으로 m_bDragFlag 의 상태를 검사 함으로써 마우스 버튼과 관련한 이벤트에 맞는 동작을 구현 할 수 있음 .
호서대학교 컴퓨터공학
Microsoft Foundation Class 2. 마우스 움직임의 조합 마우스 버튼 상태를 위한 플래그 (Flag) void CMouseCombiView::OnLButtonDown(UINT nFlags, CPoint point) { m_bDragFlag = true; RedrawWindow( ); CView::OnLButtonDown(nFlags, point); }
마우스 버튼을 누르면 실행되는 OnLButtonDown() 함수에서 마우스 버튼 플래그를 true 로 전환 함 .
호서대학교 컴퓨터공학
Microsoft Foundation Class 2. 마우스 움직임의 조합 마우스 버튼이 눌린 좌표의 획득방법 void CMouseCombiView::OnMouseMove(UINT nFlags, CPoint point) { if(m_bDragFlag) { m_ptItemText = point; RedrawWindow( ); } CView::OnMouseMove(nFlags, point); }
If 문으로 m_nDragFlag 를 검사하여 true( 마우스가 눌린 상태 ) 이면 마우스의 실시간 좌표를 저장하고 다시 그림 .
호서대학교 컴퓨터공학
Microsoft Foundation Class 2. 마우스 움직임의 조합
마우스 버튼이 업 때의 플래그 (Flag)
void CMouseCombiView::OnLButtonUp(UINT nFlags, CPoint point) { if(m_bDragFlag) { m_bDragFlag = false; m_ptItemText = point; RedrawWindow( ); } CView::OnLButtonUp(nFlags, point); }
마우스의 버튼이 업 될 시 플래그의 값이 true( 버튼이 눌려 있을 때 ) 이면 플래그 값을 false 로 바꾸고 최종좌표를 얻어와 다시 그림 .
호서대학교 컴퓨터공학
Microsoft Foundation Class 3. 마우스 이벤트의 추적
마우스 이벤트 추적
키보드 입력은 입력 포커스를 가진 윈도우에서만 메시지 수신이 가능 하지만 , 마우스 입력은 비활성화된 윈도우에서도 메시지 수신이 가 능함.
특정 윈도우가 마우스를 선점하여 놓아주지 않으면 운영체제 입장에 서 매우 큰 부담으로 작용 .
마우스 이벤트의 적용 범위가 넘어가는 것을 방지하기 위함 .
방지하기 위하여 마우스 이벤트를 추적하며 2 가지 방법이 있음 . •
SetCapture() 함수와 ReleaseCapture() 함수를 사용 .
•
_TrackMouseEvent() API 함수를 사용 .
호서대학교 컴퓨터공학
Microsoft Foundation Class 3. 마우스 이벤트의 추적
SetCapture() 함수와 ReleaseCapture() 함수
위의 두 함수는 마우스 이벤트를 추적할 수 있도록 함 .
응용프로그램 자신이 직접 마우스를 점유하고 계속 마우스 메시지를 수신하여 경계를 벗어났는지 검사 함 .
SetCapture() 함수 : 마우스를 캡쳐함 .
ReleaseCapture() 함수 : 캡처한 마우스를 풀어 줌 .
버튼이 다운되면 SetCapture() 함수가 동작하며 버튼이 업 되면 ReleaseCapturee() 함수가 동작하도록 코드를 삽입 함 .
호서대학교 컴퓨터공학
Microsoft Foundation Class 3. 마우스 이벤트의 추적
_TrackMouseEvent() 함수
운영체제에 자신의 윈도우를 등록하여 마우스가 자신의 영역을 벗어 났는지 검사하며 , 영역을 벗어나면 WM_MOUSELEAVE 메시지를 수신하여 경계가 벗어났음을 판단 함 .
마우스를 캡처 할 필요가 없고 그만큼 오동작 가능성이 사라짐 .
_TrackMouseEvent() 함수는 윈도우 98/2000 이상의 운영체제에서 사용할 수 있는 API 임 .
_TrackMouseEven() 함수는 TRACKMOUSEEVENT 구조체의 주소 를 인자로 받음 .
호서대학교 컴퓨터공학
Microsoft Foundation Class 3. 마우스 이벤트의 추적
_TrackMouseEvent() 함수의 활용
void CTrackWnd::OnMouseMove(UINT nFlags, CPoint point) { if(m_bTrack == FALSE) { TRACKMOUSEVENT MouseEvent; ::ZeroMemory(&MouseEvent, sizeof(MouseEvent)); m_bTrack = ::_TrackMouseEvent(&MouseEvent); if(m_bTrack) { SetWindowText(TEXT("Tracking!")); } } CWnd::OnMouseMove(nFlags, point); } 호서대학교 컴퓨터공학
Microsoft Foundation Class Q&A
Q&A 호서대학교 컴퓨터공학