Presentation is loading. Please wait.

Presentation is loading. Please wait.

Keyboard Input. Announcement 휴강공고 : –4 월 12 일 ( 월요일 ) 수업 없음 – 보강일정 : 차후 공고 예정.

Similar presentations


Presentation on theme: "Keyboard Input. Announcement 휴강공고 : –4 월 12 일 ( 월요일 ) 수업 없음 – 보강일정 : 차후 공고 예정."— Presentation transcript:

1 Keyboard Input

2 Announcement 휴강공고 : –4 월 12 일 ( 월요일 ) 수업 없음 – 보강일정 : 차후 공고 예정

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

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

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

6 6 키보드 포커스 (2/2) 키보드 포커스 변화 WM_SETFOCUSWM_KILLFOCUS WM_SETFOCUS

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

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

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

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

11 11 키 누름 메시지 (3/3) 가상 키코드 (Virtual Key Code) 가상 키 코드 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 VK_SCROLLScroll Lock

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

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

14 14 문자 메시지 (3/3) 메시지 핸들러 형태 –nChar 키에 해당하는 문자 코드 (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) ;

15 코딩 연습 사각형 움직이기 VK_LEF T VK_UP VK_RIG HT VK_DO WN 1. 위치 저장 변수 선언 CPoint m_pt; 2. 위치에 사각형그리기 (OnPaint) dc.Rectangle(m_pt.x, …); 3. OnKeyDown 핸들러 추가 4. nChar 값 검사하여 위치변경 if(nChar == VK_RIGHT) m_pt.x += 10; 1. 위치 저장 변수 선언 CPoint m_pt; 2. 위치에 사각형그리기 (OnPaint) dc.Rectangle(m_pt.x, …); 3. OnKeyDown 핸들러 추가 4. nChar 값 검사하여 위치변경 if(nChar == VK_RIGHT) m_pt.x += 10; void OnKeyDown (UINT nChar, UINT nRepCnt, UINT nFlags) ;

16 Timer Department of Digital Contents Sang Il Park

17 TIMER 주기적인 작업을 지정하기

18 SetTimer 함수 매 설정된 시간 마다 WM_TIMER 메시지 발생 –id timer 의 id ( 예 : 0, 1, 2, … ) timer 가 여러 개 있을 경우 구분하기 위해 사용 –time: 알람을 울릴 주기 (=millisec) 1000 = 1 초 반드시 윈도우가 만들어 진 후 설정한다. – 주로 WM_CREATE 의 핸들러인 OnCreate 내부에 설정 void SetTimer (int id, int time, void * fp) ; 예 ) SetTimer(0, 100, NULL);

19 WM_TIMER 핸들러 nIDEvent – 현재 WM_TIMER 를 발생시킨 타이머의 id 코딩 예 ) afx_msg void OnTimer (int nIDEvent ) void CChildView::OnTimer(int nIDEvent) { if(nIDEvent == 0) { // 주기 마다 해 줘야 할 일 } void CChildView::OnTimer(int nIDEvent) { if(nIDEvent == 0) { // 주기 마다 해 줘야 할 일 }

20 코딩 연습 사각형이 죽 ~ 움직이는 장면 만들기 1. 위치 저장 변수 선언 CPoint m_pt; 2. 위치에 사각형그리기 (OnPaint) dc.Rectangle(m_pt.x, …); 3. WM_CREATE 핸들러 추가 (OnCreate) 4. OnCreate 함수에 Timer 세팅 SetTimer(0,30,NULL); 5. WM_TIMER 핸들러 추가 (OnTimer) if(nIDEvent == 0) ….. 1. 위치 저장 변수 선언 CPoint m_pt; 2. 위치에 사각형그리기 (OnPaint) dc.Rectangle(m_pt.x, …); 3. WM_CREATE 핸들러 추가 (OnCreate) 4. OnCreate 함수에 Timer 세팅 SetTimer(0,30,NULL); 5. WM_TIMER 핸들러 추가 (OnTimer) if(nIDEvent == 0) …..

21 Having more fun with the Timer Still Image –One Image Animation –Lots of Images! –http://www.youtube.com/watch?v=UocF4ycBnYEhttp://www.youtube.com/watch?v=UocF4ycBnYE Cézanne, Paul Still Life

22 Having more fun with the Timer 시간에 따라 그림이 변한다 = Dynamics 도형의 값 (values/properties)? –색–색 – 모양 – 위치 값 ( 숫자 )

23 운동학 ( = Dynamics) 도형의 위치를 의미하는 변수의 값을 시간에 따라 변화 시켜 주는 것 Ex) 속도 일정  재미 없다 ! 보다 복잡한 움직임은 ?

24 보다 재미있는 운동을 위한 약간의 물리 수업 ! 물체의 운동을 기술하기 위해 필요한 값들 – 위치 (position): 보통 p 로 표현 p(t) : t 초 때 위치 – 속도 (velocity): 위치의 시간에 따른 변화 (dp/dt) v(t)= p(t+1) – p(t) – 가속도 (acceleration): 속도의 시간에 따른 변화 (dv/dt) a(t) = v(t+1) – v(t) 시간에 따른 위치가 주어지면 속도, 가속도를 구할 수 있다. 그 반대는 ?

25 가속도가 주어지면 ? 물체의 운동을 기술하기 위해 필요한 값들 – 가속도 (acceleration): 보통 a 로 표현 a(t) : t 초 때 가속도 – 속도 (velocity): t 초 후 속도차이는 가속도 만큼 v(t+1) = v(t) + a(t)*1 초 – 위치 (position): t 초 후 위치 차이는 속도 만큼 p(t+1) = p(t) + v(t)*1 초

26 가속도를 주는 식 : 운동방정식 뉴튼의 운동 방정식 (Equation of Motion) – f = ma – 힘이 주어지면 가속도를 계산할 수 있다. – 가속도가 주어지면 Δt 초 후의 속도가 계산 가능 – 속도가 주어지면 Δt 초 후의 위치가 계산 가능 Ex) – 자유낙하 힘 = 중력가속도 g ( =-9.8m/sec 2 ) * 무게 – 스프링 힘 = 기준 위치와의 차이 f = k x (k: 스프링 상수 )

27 운동학을 프로그래밍하자 ! 1. 위치 / 속도 / 가속도를 저장할 변수를 만든다 ( m_p, m_v, m_a ) 2. 정해진 시간마다 다음의 일을 반복 1. 주어진 상태에서의 힘 계산 (ex ) 중력 or 스프링힘 ) 2. 가속도 값 갱신 ( a = f/m ) 3. 속도 값 갱신 ( v = v + a * dt ) 4. 위치 값 갱신 ( p = p + v * dt ) 5. 변경된 위치에 그림 그리기

28 코딩 연습 공 튕기기 아래와 같은 순서대로 각자 코딩 해 보자 1. 정해진 위치에서 공이 자유 낙하  a = g 2. 마우스로 클릭하면 공의 위치를 다시 세팅 3. 밑에 벽이 있어 공이 다시 튀겨 올라 간다 벽에 닿는 순간 다음과 같이 값을 변경  p(t+dt) = 벽과 닿은 위치  v(t+dt) = - e * v (t) (e: 반발계수, 보통 0.8) 4. 마우스로 공을 클릭하면 그 순간만 가속도 증가 (= 드리볼 )  a(t) = g + f (f: 임의의 값 )  이 후 다시 a = g 로 회귀 해야 함 아래와 같은 순서대로 각자 코딩 해 보자 1. 정해진 위치에서 공이 자유 낙하  a = g 2. 마우스로 클릭하면 공의 위치를 다시 세팅 3. 밑에 벽이 있어 공이 다시 튀겨 올라 간다 벽에 닿는 순간 다음과 같이 값을 변경  p(t+dt) = 벽과 닿은 위치  v(t+dt) = - e * v (t) (e: 반발계수, 보통 0.8) 4. 마우스로 공을 클릭하면 그 순간만 가속도 증가 (= 드리볼 )  a(t) = g + f (f: 임의의 값 )  이 후 다시 a = g 로 회귀 해야 함

29 더 다양한 예제를 찾아보자


Download ppt "Keyboard Input. Announcement 휴강공고 : –4 월 12 일 ( 월요일 ) 수업 없음 – 보강일정 : 차후 공고 예정."

Similar presentations


Ads by Google