Presentation is loading. Please wait.

Presentation is loading. Please wait.

마우스 메시지 처리 기법을 익힌다. 키보드 메시지 처리 기법을 익힌다..

Similar presentations


Presentation on theme: "마우스 메시지 처리 기법을 익힌다. 키보드 메시지 처리 기법을 익힌다.."— Presentation transcript:

1 마우스 메시지 처리 기법을 익힌다. 키보드 메시지 처리 기법을 익힌다.

2 마우스 기초 (1/2) 마우스 처리 윈도우 운영체제는 마우스와 관련된 모든 변화를 메시지 형태로 프로그램에게 전달한다. 마우스
장치 드라이버 시스템 메시지 대기열 응용 프로그램 핸들러 루프

3 마우스 기초 (2/2) 마우스 메시지 전달 마우스 메시지는 마우스 커서 밑에 있는 윈도우가 받는다. 마우스 메시지를
프레임 윈도우로 전달 마우스 메시지를 뷰로 전달

4 클라이언트 영역 마우스 메시지 (1/5) 클라이언트 영역 마우스 메시지 메시지 WM_LBUTTONDOWN
WM_LBUTTONUP WM_LBUTTONDBLCLK WM_MBUTTONDOWN WM_MBUTTONUP WM_MBUTTONDBLCLK WM_RBUTTONDOWN WM_RBUTTONUP WM_RBUTTONDBLCLK WM_MOUSEMOVE 발생 시점 왼쪽 버튼을 누를 때 왼쪽 버튼을 뗄 때 왼쪽 버튼을 더블 클릭할 때 가운데 버튼을 누를 때 가운데 버튼을 뗄 때 가운데 버튼을 더블 클릭할 때 오른쪽 버튼을 누를 때 오른쪽 버튼을 뗄 때 오른쪽 버튼을 더블 클릭할 때 마우스를 움직일 때

5 클라이언트 영역 마우스 메시지 (2/5) 클라이언트 영역 마우스 메시지 핸들러 메시지 WM_LBUTTONDOWN
WM_LBUTTONUP WM_LBUTTONDBLCLK WM_MBUTTONDOWN WM_MBUTTONUP WM_MBUTTONDBLCLK WM_RBUTTONDOWN WM_RBUTTONUP WM_RBUTTONDBLCLK WM_MOUSEMOVE 메시지맵 매크로 ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_LBUTTONDBLCLK() ON_WM_MBUTTONDOWN() ON_WM_MBUTTONUP() ON_WM_MBUTTONDBLCLK() ON_WM_RBUTTONDOWN() ON_WM_RBUTTONUP() ON_WM_RBUTTONDBLCLK() ON_WM_MOUSEMOVE() 메시지 핸들러 OnLButtonDown OnLButtonUp OnLButtonDblClk OnMButtonDown OnMButtonUp OnMButtonDblClk OnRButtonDown OnRButtonUp OnRButtonDblClk OnMouseMove

6 클라이언트 영역 마우스 메시지 (3/5) 메시지 핸들러 형태 nFlags
메시지가 생성될 때의 키보드나 마우스 버튼의 상태를 나타내는 비트 매스크 afx_msg void On* (UINT nFlags, CPoint point) ; 비트 매스크 의미 MK_CONTROL Ctrl 키가 눌렸을 때 MK_SHIFT Shift 키가 눌렸을 때 MK_LBUTTON 마우스 왼쪽 버튼이 눌렸을 때 MK_MBUTTON 마우스 가운데 버튼이 눌렸을 때 MK_RBUTTON 마우스 오른쪽 버튼이 눌렸을 때

7 클라이언트 영역 마우스 메시지 (4/5) 메시지 핸들러 형태 (cont'd) 예 1 point
메시지가 생성될 때의 마우스 커서 위치(클라이언트 좌표) 예 1 void CChildView::OnLButtonDown(UINT nFlags, CPoint point) { if(nFlags & MK_SHIFT){ // 만약 Shift 키가 눌렸다면 ... } CWnd ::OnLButtonDown(nFlags, point);

8 클라이언트 영역 마우스 메시지 (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); }

9 마우스 캡쳐 용도 관련 함수 마우스 캡처를 하면 마우스 커서의 위치에 관계없이 마우스 메시지를 받을 수 있다. API 함수
MFC 함수 의미 SetCapture() CWnd::SetCapture() 마우스 캡처를 시작한다. ReleaseCapture() 없음 마우스 캡처를 해제한다. GetCapture() CWnd::GetCapture() 어느 윈도우가 현재 마우스 캡처를 하고 있는지 알아낸다.

10 비 클라이언트 영역 마우스 메시지 (1/4) 비 클라이언트 영역 마우스 메시지 메시지 발생 시점 WM_NCLBUTTONDOWN
왼쪽 버튼을 누를 때 WM_NCLBUTTONUP 왼쪽 버튼을 뗄 때 WM_NCLBUTTONDBLCLK 왼쪽 버튼을 더블 클릭할 때 WM_NCMBUTTONDOWN 가운데 버튼을 누를 때 WM_NCMBUTTONUP 가운데 버튼을 뗄 때 WM_NCMBUTTONDBLCLK 가운데 버튼을 더블 클릭할 때 WM_NCRBUTTONDOWN 오른쪽 버튼을 누를 때 WM_NCRBUTTONUP 오른쪽 버튼을 뗄 때 WM_NCRBUTTONDBLCLK 오른쪽 버튼을 더블 클릭할 때 WM_NCMOUSEMOVE 마우스를 움직일 때

11 비 클라이언트 영역 마우스 메시지 (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

12 비 클라이언트 영역 마우스 메시지 (3/4) 메시지 핸들러 형태 nHitTest point
메시지가 생성될 때의 마우스 커서 위치를 나타내는 상수값  다음 페이지 표 참조 point 메시지가 생성될 때의 마우스 커서 위치(스크린 좌표) 클라이언트 좌표로 변환하려면 CWnd::ScreenToClient() 함수를 사용 afx_msg void OnNc* (UINT nHitTest, CPoint point) ;

13 비 클라이언트 영역 마우스 메시지 (4/4) nHitTest 상수값 의미 HTCAPTION 타이틀바 HTCLIENT
HTCLOSE 종료 버튼 HTHSCROLL 가로 스크롤 바 HTMENU 메뉴 HTMAXBUTTON 또는 HTZOOM 최대화 버튼 HTMINBUTTON 또는 HTREDUCE 최소화 버튼 HTSYSMENU 시스템 메뉴 HTVSCROLL 세로 스크롤 바

14 마우스 정보와 커서 관리 (1/3) 마우스 정보 마우스 관련 nIndex 값
int GetSystemMetrics (int nIndex) ; nIndex 의미 SM_CMOUSEBUTTONS 마우스 버튼의 개수를 리턴하며 마우스가 설치되지 않은 경우에는 0을 리턴한다. SM_MOUSEPRESENT 마우스의 설치 여부를 TRUE 또는 FALSE로 리턴한다. SM_SWAPBUTTON 왼쪽과 오른쪽 버튼의 의미가 바뀌었으면 TRUE를 리턴한다. SM_MOUSEWHEELPRESENT 휠(Wheel) 마우스이면 TRUE를 리턴한다.

15 마우스 정보와 커서 관리 (2/3) 커서 바꾸기 hCursor 커서 리소스를 가리키는 핸들값 다음 두 함수의 리턴값을 대입
CWinApp::LoadStandardCursor() CWinApp::LoadCursor() HCURSOR SetCursor (HCURSOR hCursor) ;

16 마우스 정보와 커서 관리 (3/3) 커서 위치 제한하기 lpRect 커서가 움직일 수 있는 사각형의 범위(스크린 좌표)
커서 움직임의 제한을 없애고자 한다면 lpRect에 NULL값을 사용 BOOL ClipCursor (CONST RECT *lpRect) ;

17 키보드 기초 (1/2) 키보드 처리 윈도우 운영체제는 키보드와 관련된 모든 변화를 메시지 형태로 프로그램에게 전달한다. 키보드
장치 드라이버 시스템 메시지 대기열 응용 프로그램 핸들러 루프 스캔 코드

18 키보드 기초 (2/2) 키보드 메시지 전달 키보드 포커스 키보드 메시지는 키보드 포커스를 가진 윈도우가 받는다.
활성 윈도우 또는 활성 윈도우의 자식 윈도우가 가지는 일종의 속성

19 키보드 포커스 (1/2) 키보드 포커스 유형 캐럿

20 키보드 포커스 (2/2) 키보드 포커스 변화 Void CMainFrame::OnSetFocus(CWnd* pOldWnd) {
WM_SETFOCUS WM_KILLFOCUS WM_SETFOCUS Void CMainFrame::OnSetFocus(CWnd* pOldWnd) { m_wndView.SetFocus(); }

21 캐럿 (1/2) 관련 함수 함수 이름 역할 CreateCaret() 비트맵을 이용하여 캐럿을 생성한다.
CreateGrayCaret() 회색 사각형 모양의 캐럿을 생성한다. CreateSolidCaret() 검정색 사각형 모양의 캐럿을 생성한다. ShowCaret() 캐럿이 보이도록 한다. HideCaret() 캐럿을 숨긴다. GetCaretPos() 캐럿의 위치(클라이언트 좌표)를 얻는다. SetCaretPos() 캐럿의 위치(클라이언트 좌표)를 변경한다. ::DestroyCaret() 캐럿을 파괴한다. ::GetCaretBlinkTime() 캐럿이 깜박이는 간격을 얻는다. ::SetCaretBlinkTime() 캐럿이 깜박이는 간격을 설정한다.

22 캐럿 (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();

23 키 누름 메시지 (1/3) 키 누름 메시지(Keystroke Message) 키 누름 메시지 종류
키보드를 누르거나 떼는 동작에 의해 발생하는 메시지 키 누름 메시지 종류 메시지 의미 WM_KEYDOWN F10, Alt 이외의 키를 누를 때 WM_KEYUP F10, Alt를 이외의 키를 뗄 때 WM_SYSKEYDOWN F10, Alt, Alt + 키 조합을 누를 때 WM_SYSKEYUP F10, Alt, Alt + 키 조합을 뗄 때

24 키 누름 메시지 (2/3) 메시지 핸들러 형태 nChar nRepCnt nFlags
키에 할당된 가상 키 코드값  다음 페이지 표 참조 nRepCnt 키를 계속 누르고 있을 경우 1보다 큰 값을 가진다. nFlags 키와 관련된 다양한 정보를 담고 있다(MSDN 참조). afx_msg void On* (UINT nChar, UINT nRepCnt, UINT nFlags) ;

25 키 누름 메시지 (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 Home Print Screen Insert Delete 0 – 9 A – Z F1 - F12 Num Lock Scroll Lock

26 문자 메시지 (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 키를 누른 경우

27 문자 메시지 (2/3) 문자 메시지 - VK_R 키를 누른 경우 문자 메시지 - Alt + VK_R 키를 누른 경우
WM_KEYDOWN WM_CHAR WM_KEYUP WM_SYSKEYDOWN WM_CHAR WM_SYSKEYUP WM_KEYDOWN

28 문자 메시지 (3/3) 메시지 핸들러 형태 nChar nRepCnt nFlags
키에 해당하는 문자 코드(Character Code) 값을 가진다. nRepCnt 키를 계속 누르고 있을 경우 1보다 큰 값을 가진다. nFlags 키와 관련된 다양한 정보를 담고 있다(MSDN 참조). afx_msg void OnChar (UINT nChar, UINT nRepCnt, UINT nFlags) ; afx_msg void OnSysChar (UINT nChar, UINT nRepCnt, UINT nFlags) ;

29 목요일 실습 내용 마우스 이벤트를 사용한 선그리기 키보드 이벤트를 사용 첫번째 두번째 첫번째 마우스 클릭에서 시작
두번째 마우스 클릭에서 끝 두번째 왼쪽 마우스 클릭 시작 오른쪽 마우스 클릭 끝 키보드 이벤트를 사용


Download ppt "마우스 메시지 처리 기법을 익힌다. 키보드 메시지 처리 기법을 익힌다.."

Similar presentations


Ads by Google