Transcript ch05_winp

05: 마우스와 키보드
학습 목표
마우스 메시지 처리 기법을 익힌다.
키보드 메시지 처리 기법을 익힌다.
마우스 기초 (1/2)

마우스 처리
 윈도우 운영체제는 마우스와 관련된 모든 변화를 메시
지 형태로 프로그램에게 전달한다.
마우스
마우스 메시지
장치
드라이버
시스템
메시지
대기열
메시지 응용 프로그램
메시지
대기열
메시지
루프
메시지
핸들러
1
마우스 기초 (2/2)

마우스 메시지 전달
 마우스 메시지는 마우스 커서 밑에 있는 윈도우가 받는
다.
마우스 메시지를
프레임 윈도우로 전달
마우스 메시지를
뷰로 전달
2
클라이언트 영역 마우스 메시지 (1/5)

클라이언트 영역 마우스 메시지
메시지
발생 시점
WM_LBUTTONDOWN
왼쪽 버튼을 누를 때
WM_LBUTTONUP
왼쪽 버튼을 뗄 때
WM_LBUTTONDBLCLK
왼쪽 버튼을 더블 클릭할 때
WM_MBUTTONDOWN
가운데 버튼을 누를 때
WM_MBUTTONUP
가운데 버튼을 뗄 때
WM_MBUTTONDBLCLK
가운데 버튼을 더블 클릭할 때
WM_RBUTTONDOWN
오른쪽 버튼을 누를 때
WM_RBUTTONUP
오른쪽 버튼을 뗄 때
WM_RBUTTONDBLCLK
오른쪽 버튼을 더블 클릭할 때
WM_MOUSEMOVE
마우스를 움직일 때
3
클라이언트 영역 마우스 메시지 (2/5)

클라이언트 영역 마우스 메시지 핸들러
메시지
메시지맵 매크로
메시지 핸들러
WM_LBUTTONDOWN
ON_WM_LBUTTONDOWN()
OnLButtonDown
WM_LBUTTONUP
ON_WM_LBUTTONUP()
OnLButtonUp
WM_LBUTTONDBLCLK
ON_WM_LBUTTONDBLCLK()
OnLButtonDblClk
WM_MBUTTONDOWN
ON_WM_MBUTTONDOWN()
OnMButtonDown
WM_MBUTTONUP
ON_WM_MBUTTONUP()
OnMButtonUp
WM_MBUTTONDBLCLK
ON_WM_MBUTTONDBLCLK()
OnMButtonDblClk
WM_RBUTTONDOWN
ON_WM_RBUTTONDOWN()
OnRButtonDown
WM_RBUTTONUP
ON_WM_RBUTTONUP()
OnRButtonUp
WM_RBUTTONDBLCLK
ON_WM_RBUTTONDBLCLK()
OnRButtonDblClk
WM_MOUSEMOVE
ON_WM_MOUSEMOVE()
OnMouseMove
4
클라이언트 영역 마우스 메시지 (3/5)

메시지 핸들러 형태
afx_msg void On* (UINT nFlags, CPoint point) ;
 nFlags
– 메시지가 생성될 때의 키보드나 마우스 버튼의 상태를 나
타내는 비트 매스크
비트 매스크
의미
MK_CONTROL
Ctrl 키가 눌렸을 때
MK_SHIFT
Shift 키가 눌렸을 때
MK_LBUTTON
마우스 왼쪽 버튼이 눌렸을 때
MK_MBUTTON
마우스 가운데 버튼이 눌렸을 때
MK_RBUTTON
마우스 오른쪽 버튼이 눌렸을 때
5
클라이언트 영역 마우스 메시지 (4/5)
메시지 핸들러 형태 (cont'd)

 point
– 메시지가 생성될 때의 마우스 커서 위치(클라이언트 좌표)
예1

void CChildView::OnLButtonDown(UINT nFlags, CPoint point)
{
if(nFlags & MK_SHIFT){
// 만약 Shift 키가 눌렸다면 ...
}
}
CWnd ::OnLButtonDown(nFlags, point);
6
클라이언트 영역 마우스 메시지 (5/5)
예2

void CChildView::OnLButtonDown(UINT nFlags, CPoint point)
{
CClientDC dc(this);
dc.SetMapMode(MM_LOMETRIC);
CPoint pt = point;
dc.DPtoLP(&pt);
dc.Rectangle(pt.x-100, pt.y+100, pt.x+100, pt.y-100);
}
CWnd ::OnLButtonDown(nFlags, point);
7
마우스 캡쳐

용도
 마우스 캡처를 하면 마우스 커서의 위치에 관계없이 마
우스 메시지를 받을 수 있다.

관련 함수
API 함수
MFC 함수
의미
SetCapture()
CWnd::SetCapture()
마우스 캡처를 시작한다.
ReleaseCapture()
없음
마우스 캡처를 해제한다.
GetCapture()
CWnd::GetCapture()
어느 윈도우가 현재 마우스 캡
처를 하고 있는지 알아낸다.
8
비 클라이언트 영역 마우스 메시지 (1/4)

비 클라이언트 영역 마우스 메시지
메시지
발생 시점
WM_NCLBUTTONDOWN
왼쪽 버튼을 누를 때
WM_NCLBUTTONUP
왼쪽 버튼을 뗄 때
WM_NCLBUTTONDBLCLK
왼쪽 버튼을 더블 클릭할 때
WM_NCMBUTTONDOWN
가운데 버튼을 누를 때
WM_NCMBUTTONUP
가운데 버튼을 뗄 때
WM_NCMBUTTONDBLCLK
가운데 버튼을 더블 클릭할 때
WM_NCRBUTTONDOWN
오른쪽 버튼을 누를 때
WM_NCRBUTTONUP
오른쪽 버튼을 뗄 때
WM_NCRBUTTONDBLCLK
오른쪽 버튼을 더블 클릭할 때
WM_NCMOUSEMOVE
마우스를 움직일 때
9
비 클라이언트 영역 마우스 메시지 (2/4)

비 클라이언트 영역 마우스 메시지 핸들러
메시지
메시지맵 매크로
메시지 핸들러
WM_NCLBUTTONDOWN
ON_WM_NCLBUTTONDOWN()
OnNcLButtonDown
WM_NCLBUTTONUP
ON_WM_NCLBUTTONUP()
OnNcLButtonUp
WM_NCLBUTTONDBLCLK
ON_WM_NCLBUTTONDBLCLK()
OnNcLButtonDblClk
WM_NCMBUTTONDOWN
ON_WM_NCMBUTTONDOWN()
OnNcMButtonDown
WM_NCMBUTTONUP
ON_WM_NCMBUTTONUP()
OnNcMButtonUp
WM_NCMBUTTONDBLCLK
ON_WM_NCMBUTTONDBLCLK()
OnNcMButtonDblClk
WM_NCRBUTTONDOWN
ON_WM_NCRBUTTONDOWN()
OnNcRButtonDown
WM_NCRBUTTONUP
ON_WM_NCRBUTTONUP()
OnNcRButtonUp
WM_NCRBUTTONDBLCLK
ON_WM_NCRBUTTONDBLCLK()
OnNcRButtonDblClk
WM_NCMOUSEMOVE
ON_WM_NCMOUSEMOVE()
OnNcMouseMove
10
비 클라이언트 영역 마우스 메시지 (3/4)

메시지 핸들러 형태
afx_msg void OnNc* (UINT nHitTest, CPoint point) ;
 nHitTest
– 메시지가 생성될 때의 마우스 커서 위치를 나타내는 상수
값  다음 페이지 표 참조
 point
– 메시지가 생성될 때의 마우스 커서 위치(스크린 좌표)
 클라이언트 좌표로 변환하려면 CWnd::ScreenToClient()
함수를 사용
11
비 클라이언트 영역 마우스 메시지 (4/4)

nHitTest
상수값
HTCAPTION
HTCLIENT
의미
타이틀바
클라이언트 영역
HTCLOSE
종료 버튼
HTHSCROLL
가로 스크롤 바
HTMENU
메뉴
HTMAXBUTTON 또는 HTZOOM
최대화 버튼
HTMINBUTTON 또는 HTREDUCE
최소화 버튼
HTSYSMENU
시스템 메뉴
HTVSCROLL
세로 스크롤 바
12
마우스 정보와 커서 관리 (1/3)

마우스 정보
int GetSystemMetrics (int nIndex) ;
 마우스 관련 nIndex 값
nIndex
의미
SM_CMOUSEBUTTONS
마우스 버튼의 개수를 리턴하며 마우스가
설치되지 않은 경우에는 0을 리턴한다.
SM_MOUSEPRESENT
마우스의 설치 여부를 TRUE 또는 FALSE로
리턴한다.
SM_SWAPBUTTON
왼쪽과 오른쪽 버튼의 의미가 바뀌었으면
TRUE를 리턴한다.
SM_MOUSEWHEELPRESENT
휠(Wheel) 마우스이면 TRUE를 리턴한다.
13
마우스 정보와 커서 관리 (2/3)

커서 바꾸기
HCURSOR SetCursor (HCURSOR hCursor) ;
 hCursor
– 커서 리소스를 가리키는 핸들값
– 다음 두 함수의 리턴값을 대입
 CWinApp::LoadStandardCursor()
 CWinApp::LoadCursor()
14
마우스 정보와 커서 관리 (3/3)

커서 위치 제한하기
BOOL ClipCursor (CONST RECT *lpRect) ;
 lpRect
– 커서가 움직일 수 있는 사각형의 범위(스크린 좌표)
– 커서 움직임의 제한을 없애고자 한다면 lpRect에 NULL값
을 사용
15
키보드 기초 (1/2)

키보드 처리
 윈도우 운영체제는 키보드와 관련된 모든 변화를 메시
지 형태로 프로그램에게 전달한다.
키보드
스캔 코드
키보드 메시지
장치
드라이버
시스템
메시지
대기열
메시지
응용 프로그램
메시지
대기열
메시지
루프
메시지
핸들러
16
키보드 기초 (2/2)

키보드 메시지 전달
 키보드 메시지는 키보드 포커스를 가진 윈도우가 받는
다.

키보드 포커스
 활성 윈도우 또는 활성 윈도우의 자식 윈도우가 가지는
일종의 속성
17
키보드 포커스 (1/2)

키보드 포커스 유형
캐럿
18
키보드 포커스 (2/2)

키보드 포커스 변화
WM_SETFOCUS
WM_KILLFOCUS
WM_SETFOCUS
Void CMainFrame::OnSetFocus(CWnd* pOldWnd)
{
m_wndView.SetFocus();
}
19
캐럿 (1/2)

관련 함수
함수 이름
CreateCaret()
역할
비트맵을 이용하여 캐럿을 생성한다.
CreateGrayCaret()
회색 사각형 모양의 캐럿을 생성한다.
CreateSolidCaret()
검정색 사각형 모양의 캐럿을 생성한다.
ShowCaret()
캐럿이 보이도록 한다.
HideCaret()
캐럿을 숨긴다.
GetCaretPos()
캐럿의 위치(클라이언트 좌표)를 얻는다.
SetCaretPos()
캐럿의 위치(클라이언트 좌표)를 변경한다.
::DestroyCaret()
캐럿을 파괴한다.
::GetCaretBlinkTime()
캐럿이 깜박이는 간격을 얻는다.
::SetCaretBlinkTime()
캐럿이 깜박이는 간격을 설정한다.
20
캐럿 (2/2)
void CChildView::OnSetFocus(CWnd* pOldWnd)
{
CWnd ::OnSetFocus(pOldWnd);
}
CreateSolidCaret(20, 20);
SetCaretPos(CPoint(50, 50));
ShowCaret();
void CChildView::OnKillFocus(CWnd* pNewWnd)
{
CWnd ::OnKillFocus(pNewWnd);
}
HideCaret();
::DestroyCaret();
21
키 누름 메시지 (1/3)

키 누름 메시지(Keystroke Message)
 키보드를 누르거나 떼는 동작에 의해 발생하는 메시지

키 누름 메시지 종류
메시지
의미
WM_KEYDOWN
F10, Alt 이외의 키를 누를 때
WM_KEYUP
F10, Alt를 이외의 키를 뗄 때
WM_SYSKEYDOWN
F10, Alt, Alt + 키 조합을 누를 때
WM_SYSKEYUP
F10, Alt, Alt + 키 조합을 뗄 때
22
키 누름 메시지 (2/3)

메시지 핸들러 형태
afx_msg void On* (UINT nChar, UINT nRepCnt, UINT nFlags) ;
 nChar
– 키에 할당된 가상 키 코드값  다음 페이지 표 참조
 nRepCnt
– 키를 계속 누르고 있을 경우 1보다 큰 값을 가진다.
 nFlags
– 키와 관련된 다양한 정보를 담고 있다(MSDN 참조).
23
키 누름 메시지 (3/3)

가상 키코드
가상 키 코드
VK_CANCEL
VK_BACK
VK_TAB
VK_RETURN
VK_SHIFT
VK_CONTROL
VK_MENU
VK_PAUSE
VK_CAPITAL
VK_ESCAPE
VK_SPACE
VK_PRIOR
VK_NEXT
VK_END
해당 키
Ctrl-Break
Backspace
Tab
Enter
Shift
Ctrl
Alt
Pause
Caps Lock
Esc
Spacebar
PgUp
PgDn
End
가상 키 코드
VK_HOME
VK_LEFT
VK_UP
VK_RIGHT
VK_DOWN
VK_SNAPSHOT
VK_INSERT
VK_DELETE
VK_0 - VK_9
VK_A - VK_Z
VK_F1 - VK_F12
VK_NUMLOCK
VK_SCROLL
VK_SCROLL
해당 키
Home
←
↑
→
↓
Print Screen
Insert
Delete
0 – 9
A – Z
F1 - F12
Num Lock
Scroll Lock
Scroll Lock
24
문자 메시지 (1/3)

문자 메시지 필요성 - VK_R 키를 누른 경우 ?
문자
가상 키 코드 조합
r
영문 입력 모드에서 VK_R 또는 VK_R + Caps Lock + Shift 키를
누른 경우
R
영문 입력 모드에서 VK_R + Caps Lock 또는 VK_R + Shift 키를
누른 경우
ㄱ
한글 입력 모드에서 VK_R 키를 누른 경우
ㄲ
한글 입력 모드에서 VK_R + Shift 키를 누른 경우
25
문자 메시지 (2/3)

문자 메시지 - VK_R 키를 누른 경우
WM_KEYDOWN

WM_CHAR
WM_KEYUP
문자 메시지 - Alt + VK_R 키를 누른 경우
WM_SYSKEYDOWN
WM_SYSKEYDOWN
WM_CHAR
WM_SYSKEYUP
WM_KEYDOWN
26
문자 메시지 (3/3)

메시지 핸들러 형태
afx_msg void OnChar (UINT nChar, UINT nRepCnt, UINT nFlags) ;
afx_msg void OnSysChar (UINT nChar, UINT nRepCnt, UINT nFlags) ;
 nChar
– 키에 해당하는 문자 코드(Character Code) 값을 가진다.
 nRepCnt
– 키를 계속 누르고 있을 경우 1보다 큰 값을 가진다.
 nFlags
– 키와 관련된 다양한 정보를 담고 있다(MSDN 참조).
27
목요일 실습 내용

마우스 이벤트를 사용한 선그리기
 첫번째
– 첫번째 마우스 클릭에서 시작
– 두번째 마우스 클릭에서 끝
 두번째
– 왼쪽 마우스 클릭 시작
– 오른쪽 마우스 클릭 끝

키보드 이벤트를 사용
28