Mfc 제06강 마우스 입력

Page 1

호서대학교 컴퓨터공학

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 호서대학교 컴퓨터공학


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.