5장. 마우스와 키보드.

Slides:



Advertisements
Similar presentations
1/ 편집 기능 사용하기 – 실습 1 글자 모양을 바꾸고 싶은 곳을 블록 설정 [ 글자 모양 ] 대화 상자에서 [ 글꼴 ] ‘ 궁서체 ’, [ 글자 색 ] ‘ 토마토색 ’ 으로 선택 → [ 설정 ] 클릭 → 글자 모양 변경.
Advertisements

가족 문화 정보 한마당 대단원 1 – 중단원 4 영진.COm영진.COm 1. 마음이 담긴 쪽지 쓰기  워드 프로세서 (Word processor)  문서를 작성하고 편집 · 출력할 수 있는 프 로그램  워드 프로세서의 기능  문서의 입력 기능  문서의 편집.
을지대학교 무선 네트워크 사용 방법 2010 년 06 월 01 일. 을지대학교 무선 네트워크 사용 방법 1. PC 무선랜 카드 활성화 및 체크 1 단계 : 시작 -> 설정 -> 네트워크 설정 2 단계 : 무선 네트워크 설정 선택 -> 마우스 버튼 오른쪽 클릭 -> 사용.
Timer Department of Digital Contents Sang Il Park.
Keyboard Input. Announcement 휴강공고 : –4 월 12 일 ( 월요일 ) 수업 없음 – 보강일정 : 차후 공고 예정.
Term project. Touch-screen 활용 그림판 –Touch-screen 을 입력장치로 하여 LCD 상에 그림을 그리는 프로그램 – 터치 입력을 절대 좌표로 받는 디바이스 /dev/touch 를 만들어 응용 프 로그램에서 수행하도록 함. –User interface.
MS 워드 2007 기초 사용법 MS 워드 2007 시작하기와 종료 MS 워드 2007 화면의 구성요소 MS 워드 2007 단축키 ( 기초 ) MS 워드 2007 표 그리기 MS 워드 2007 화일변환.
메시지 처리의 기본 개념 메시지 발생된 이벤트의 종류와 정보를 전달하는 일종의 상수 값 윈도우 프로그래밍 가장 중요한 것은 메시지를 처리하는 것 윈도우 시스템 Application 이벤트 발생 메시지 전송 메시지 처리 화면에 출력.
Message Process for SDI Chung-Buk HRD Institute of KCCI Dept. of Information & Communication PhD. Kang, Won-Chan.
강의 내용 : DirectX 개요 DirectX 9 을 이용한 시각화. 목 차 DirectX 출현 배경 DirectX 현재 버전 DirectX 장점 DirectX 구성요소 DirectX SDK 다운로드 및 설치 DirectX SDK 폴더 구성 및 역할 샘플 코드 브라우저.
Department of Digital Contents Sang Il Park
메뉴 용어 (1/6) 최상위 메뉴 = 메뉴 바 최상위 메뉴 = 메뉴 바.
2장. 윈도우즈 입출력 1/211 1.
목차 Contents 무선인터넷용 비밀번호 설정방법 Windows 7 Windows 8 Windows XP MAC OS.
MFC Application Frameworks (AFX)
순차, 조건, 반복 이점숙 같은 문제 다르게 해결하기 순차, 조건, 반복 이점숙
149개의 실습예제로 배우는 Flash 8.
Lab 10 Guide: 프린터 출력 예제. 한 페이지의 그림 인쇄 (교재 24장, 쪽)
윤 홍 란 다이알로그(대화상자) 윤 홍 란
윤 홍 란 MFC 기초 윤 홍 란
Lab 2 Guide: 교재 3장 그래픽 예제 ( 쪽) - 펜과 브러시로 그리기 - 튀는 공
공통 컨트롤의 종류와 특징을 개관한다. 각종 공통 컨트롤의 사용 방법을 익힌다..
Outlook Express 메일 백업 및 복원가이드
DPR-1630&1615 IP공유기 셋팅 방법 고객지원팀 작성자 : 정청석.
태양계 시뮬레이션 팀 명: 복학생 강유진 박지혜.
7장 배열 ②.
나민영 서경대학교 컴퓨터공학과 CGVR Lab 같이만들어보자 5주차 OpenCV 설정 및 기초.
forms 객체 입력상자 체크상자, 라디오 버튼 목록상자
MFC 프로그래밍에 관한 팁 / Keyboard / Timer
MFC 프로그래밍에 관한 팁 / Keyboard
SEOUL NATIONAL UNIVERSITY OF SCIENCE & TECHNOLOGY
Visual C++ Programming Keyboard & Timer
마우스 메시지 처리 기법을 익힌다. 키보드 메시지 처리 기법을 익힌다..
마우스(Mouse) 다루기 컴퓨터응용 및 실습 I.
대화상자 편집기의 사용법을 익힌다. 모드형 대화상자와 비 모드형 대화상자의 차이점을 이해하고 작성 방법을 익힌다.
3.2 SQL Server 설치 및 수행(계속) 시스템 데이터베이스 master
Visual C++ Programming Menu
학습목표 학습목차 다른 홈페이지의 HTML 파일 코드를 보는 방법에 대해 알아봅니다.
13. 연산자 오버로딩.
주의할 점!!!! 1. 문자 쓸 때 문자 틀 글자 크기에 맞추기 2. 색 보정할 때 Colorize 체크하고 /
10장 tkinter로 GUI 만들기.
홀인원2.0 설치 메뉴얼.
슬라이드 보기의 종류(#1) 기본보기 ( ) 컴퓨터기초및응용 파워포인터.
Lab 1 Guide: 교재 2장 DrawX ( 쪽)
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
연산자 (Operator).
SEOUL NATIONAL UNIVERSITY OF SCIENCE & TECHNOLOGY
Nessus 4 설치 정보보호응용 조용준.
Lab 8 Guide: 멀티스레딩 예제 2 * Critical Section을 이용한 멀티스레딩 동기화 (교재 15장, 쪽)
SEOUL NATIONAL UNIVERSITY OF SCIENCE & TECHNOLOGY
14강. 세션 세션이란? 세션 문법 Lecturer Kim Myoung-Ho Nickname 블스
컴퓨터활용능력1급필기 06 PC 운영체제(2) Windows 탐색기 제어판 인쇄.
파워포인트 단축키 모음 범주 명령/기능 단축키 오피스 공통 단축키 파일 열기 Ctrl + O O 열려진 창들 간의 전환
파워포인트 단축키 모음 범주 명령/기능 단축키 오피스 공통 단축키 파일 열기 Ctrl + O O 열려진 창들 간의 전환
3장. 제어 메시지 처리하기 1/211 1.
단축키 기능 1. 단축키 기능 설명 Alt + R 조회 S 저장 I 삽입 A 추가 D 삭제 P 출력 Q 닫기
DA :: 퀵 정렬 Quick Sort 퀵 정렬은 비교방식의 정렬 중 가장 빠른 정렬방법이다.
영상처리 실습 (OpenCV + MFC) Chonbuk National University A.I. Lab.
컴퓨터 구성요소와 사용 컴퓨터 문서 작업 인터넷 활용
가장 많이 사용 Accelerator 최상위 WM_COMMAND, OLE 메시지 관련 이벤트 처리만 가능 이 클래스를 상속받아서 다른 이벤트 처리 이벤트 처리 관련 윈도우(창) 최상위 클래스 멀티 테스킹(모듈) CFrameWnd, Cview,
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
9 브라우저 객체 모델.
NeoAI-Label - 운용가이드 2019/01/07 박효근 /
MFC 응용 프로그램 구조 두 개의 윈도우로 구성된 일반적인 MFC 프로그램 프레임 윈도우
Power Point 예제 디자인 적용 (서식) - (디자인적용) - (원하는 디자인 선택)
CHAP 5. 메뉴와 대화상자.
TCP/IP를 이용한 마우스 공유 (Synergy 따라하기)
6 객체.
MFC 기초 윈도우 응용프로그램 개발 간략한 역사 Microsoft Foundation Classes
BoardGame 보드게임 따라가기.
Presentation transcript:

5장. 마우스와 키보드

마우스 기초 마우스 처리 윈도우 운영체제는 마우스와 관련된 모든 변화를 메시지 형태로 프로그램에 전달한다.

마우스 기초 마우스 메시지 전달 마우스 메시지는 원칙적으로 마우스 커서 밑에 있는 윈도우가 받는다. 마우스 메시지를 Frame Window 로 전달 마우스 메시지를 View 로 전달

Client 영역 마우스 메시지 Client 영역 마우스 메시지 메시지 발생 시점 WM_LBUTTONDOWN 마우스 왼쪽 버튼을 누를 때 WM_LBUTTONUP 마우스 왼쪽 버튼을 뗄 때 WM_LBUTTONDBLCLK 마우스 왼쪽 버튼을 더블 클릭할 때 WM_MBUTTONDOWN 마우스 가운데 버튼을 누를 때 WM_MBUTTONUP 마우스 가운데 버튼을 뗄 때 WM_MBUTTONDBLCLK 마우스 가운데 버튼을 더블 클릭할 때 WM_RBUTTONDOWN 마우스 오른쪽 버튼을 누를 때 WM_RBUTTONUP 마우스 오른쪽 버튼을 뗄 때 WM_RBUTTONDBLCLK 마우스 오른쪽 버튼을 더블 클릭할 때 WM_MOUSEMOVE 마우스를 움직일 때

Client 영역 마우스 메시지 마우스 왼쪽 버튼 두 번 클릭 VS 더블 클릭 메시지 발생순서 비교

Client 영역 마우스 메시지 클라이언트 영역 마우스 메시지 핸들러 메시지 메시지 맵 매크로 메시지 핸들러 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()

Client 영역 마우스 메시지 메시지 핸들러 형태 nFlags point 메시지가 생성될 당시의 키보드나 마우스 버튼의 상태를 나타내는 비트 마스크 point 메시지가 생성될 당시의 마우스 커서 위치(클라이언트 좌표) afx_msg void On*(UINT nFlags, CPoint point); 비트 마스크 의미 MK_CONTROL [Ct기] 키 누름 MK_SHIFT [Shift] 키 누름 MK_LBUTTON 마우스 왼쪽 버튼 누름 MK_MBUTTON 마우스 가운데 버튼 누름 MK_RBUTTON 마우스 오른쪽 버튼 누름

Client 영역 마우스 메시지 nFlagns와 비트 마스크 연산 예 void CChildView::OnLButtonDown(UINT nFlags, CPoint point) { if(nFlags & MK_SHIFT){ // [Shift] 키가 눌렸다면 ... }

Client 영역 마우스 메시지 사용 예 void CChildView::OnLButtonDown(UINT nFlags, CPoint point) { CClientDC dc(this); dc.SetMapMode(MM_LOMETRIC); // 매핑 모드를 변경한다. CPoint pt = point; // point 객체를 복사한다. dc.DPtoLP(&pt); // 장치 좌표를 논리 좌표로 변환한다. dc.Rectangle(pt.x-100, pt.y+100, pt.x+100, pt.y-100); }

실습 5-1. Draw Circles void CChildView::OnMouseMove(UINT nFlags, CPoint point) { // 그리기 모드면 타원을 지우고 그리기를 반복한다. if(m_bDrawMode) CClientDC dc(this); dc.SelectStockObject(NULL_BRUSH); // 이전에 그린 타원을 지운다. dc.SetROP2(R2_NOT); dc.Ellipse(m_x1, m_y1, m_x2, m_y2); // 새로운 타원을 그린다. m_x2 = point.x; m_y2 = point.y; } void CChildView::OnLButtonUp(UINT nFlags, CPoint point) // 최종적인 타원을 그린다. dc.SetROP2(R2_COPYPEN); // 그리기 모드를 끝낸다. m_bDrawMode = FALSE; class CChildView : public CWnd { public: BOOL m_bDrawMode; // 그리기 작업이 진행 중임을 나타낸다. int m_x1, m_y1, m_x2, m_y2; // 타원에 외접하는 직사각형의 좌상단/우하단 좌표 CChildView::CChildView() { m_bDrawMode = FALSE; } void CChildView::OnLButtonDown(UINT nFlags, CPoint point) // 그리기 모드를 시작한다. m_bDrawMode = TRUE; // 좌표를 저장한다. m_x1 = m_x2 = point.x; m_y1 = m_y2 = point.y;

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

실습 5-2. Mouse Capture void CChildView::OnLButtonDown(UINT nFlags, CPoint point) { // 마우스 캡처를 시작한다. (MFC 함수 사용) SetCapture(); // 그리기 모드를 시작한다. m_bDrawMode = TRUE; // 좌표를 저장한다. m_x1 = m_x2 = point.x; m_y1 = m_y2 = point.y; } void CChildView::OnLButtonUp(UINT nFlags, CPoint point) { CClientDC dc(this); dc.SelectStockObject(NULL_BRUSH); // 최종적인 타원을 그린다. dc.SetROP2(R2_COPYPEN); m_x2 = point.x; m_y2 = point.y; dc.Ellipse(m_x1, m_y1, m_x2, m_y2); // 그리기 모드를 끝낸다. m_bDrawMode = FALSE; // 마우스 캡처를 해제한다. (API 함수 사용) ::ReleaseCapture(); }

키보드 다루기 윈도우의 키보드 메시지 처리 윈도우 운영체제는 키보드와 관련된 모든 이벤트를 프로그램에 메시지 형태로 전달한다.

키보드 다루기 키보드 메시지 전달 키보드 포커스 키보드 메시지는 키보드 포커스를 가진 윈도우가 받음 활성 윈도우 또는 활성 윈도우의 자식 윈도우가 가지는 일종의 속성

키보드 포커스 (Keyboard Focus) 키보드 포커스 변화 WM_KILLFOCUS WM_SETFOCUS WM_SETFOCUS

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

Keystroke 메세지 키 누름 메시지 핸들러 형태 nChar nRepCnt nFlags 키에 할당된 가상 키 코드값 → 다음 페이지 표 참조 nRepCnt 키를 계속 누르고 있을 경우 1보다 큰 값을 가진다. nFlags 키와 관련된 부가적인 정보를 담고 있다. afx_msg void On*(UINT nChar, UINT nRepCnt, UINT nFlags); ① ② ③

Keystroke 메세지 가상 키코드 가상 키 코드 해당 키 VK_CANCEL Ctrl-Break VK_HOME Home VK_BACK Backspace VK_LEFT ← VK_TAB Tab VK_UP ↑ VK_RETURN Enter VK_RIGHT → VK_SHIFT Shift VK_DOWN ↓ VK_CONTROL Ctrl VK_SNAPSHOT Print Screen VK_MENU Alt VK_INSERT Insert VK_PAUSE Pause VK_DELETE Delete VK_CAPITAL Caps Lock '0' ~ '9' 0 ~ 9 VK_ESCAPE Esc 'A' ~ 'Z' A ~ Z VK_SPACE Spacebar VK_F1 ~ VK_F12 F1 ~ F12 VK_PRIOR PgUp VK_NUMLOCK Num Lock VK_NEXT PgDn VK_SCROLL Scroll Lock VK_END End

실습 5-7. Keystroke 메시지 처리하기 void CChildView::OnSize(UINT nType, int cx, int cy) { m_xMax = cx; m_yMax = cy; } void CChildView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { switch(nChar){ case VK_LEFT: m_xPos-=20; break; case VK_RIGHT: m_xPos+=20; case VK_UP: m_yPos-=20; case VK_DOWN: m_yPos+=20; case VK_SPACE: m_bFill = !m_bFill; } /* 20 <= m_xPos <= m_xMax-20 */ m_xPos = min(max(20, m_xPos), m_xMax-20); /* 20 <= m_yPos <= m_yMax-20 */ m_yPos = min(max(20, m_yPos), m_yMax-20); Invalidate(); class CChildView : public CWnd { public: int m_xPos, m_yPos; // 도형의 현재 위치 int m_xMax, m_yMax; // 클라이언트 영역의 크기 BOOL m_bFill; // 도형의 내부를 채울지 여부 CChildView::CChildView() { m_xPos = m_yPos = 60; // 임의 값으로 초기화 m_bFill = FALSE; // 도형 내부를 채우지 않음 } void CChildView::OnPaint() { CPaintDC dc(this); if(m_bFill == TRUE) dc.SelectStockObject(BLACK_BRUSH); dc.Ellipse(m_xPos-20, m_yPos-20, m_xPos+20, m_yPos+20); }

Character 메시지 Character 메시지 필요성 [R] 키를 누른 경우? 문자 가상 키 코드 조합 r 영문 입력 모드에서 [R] 또는 [Caps Lock]+[Shift]+[R] 키를 누른 경우 R 영문 입력 모드에서 [Caps Lock]+[R] 또는 [Shift]+[R] 키를 누른 경우 ㄱ 한글 입력 모드에서 [R] 키를 누른 경우 ㄲ 한글 입력 모드에서 [Shift]+[R] 키를 누른 경우

문자 메시지 문자 메시지 발생 시나리오

Character 메시지 메시지 핸들러 형태 nChar nRepCnt nFlags 키에 해당하는 문자 코드값을 가진다. 키를 계속 누르고 있을 경우 1보다 큰 값을 가진다. nFlags 키와 관련된 부가적인 정보를 담고 있다. afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) ; ① ② ③ afx_msg void OnSysChar(UINT nChar, UINT nRepCnt, UINT nFlags) ;

실습 5-8. Character 메시지 처리하기 void CChildView::OnPaint() { CPaintDC dc(this); // 화면 출력용 폰트를 선택한다. CFont font; font.CreatePointFont(150, _T("궁서")); dc.SelectObject(&font); // 현재까지 입력된 글자들을 화면에 출력한다. CRect rect; GetClientRect(&rect); dc.DrawText(m_str.GetData(), m_str.GetSize(), &rect, DT_LEFT); } class CChildView : public CWnd { public: CArray<TCHAR, TCHAR> m_str; void CChildView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { // Backspace 입력 시 맨 마지막 글자를 삭제한다. if(nChar == _T('\b')){ if(m_str.GetSize() > 0) m_str.RemoveAt(m_str.GetSize()-1); } // 그 밖의 경우에는 동적 배열에 글자를 추가한다. else{ m_str.Add(nChar); // 화면을 갱신한다. Invalidate();