Mfc 제05강 키보드 입력

Page 1

호서대학교 컴퓨터공학

1


Microsoft Foundation Class

고급 프로그래밍 Chapter 5 키보드 입력

호서대학교 컴퓨터공학


Microsoft Foundation Class 1. 키보드 메시지 

일반적인 키보드 메시지

WM_KEYDOWN : 키보드의 키를 눌렀을 때 발생하는 메시지 .

WM_KEYUP : 눌려진 키보드의 키를 떼었을 때 발생하는 메시지 .

발생한 메시지는 파라미터 속에 눌린 키의 정보를 가짐 .

파라미터에 ASCII 코드의 문자가 들어오면 TranslateMessage() 함수가 WM_KEYDOWN 메시지를 WM_CHAR 메시지로 전환 .

시스템 키를 눌렀을 때의 키보드 메시지

Alt 키나 F10 키 같은 특수한 키를 누를 때 발생하는 메시지 .

WM_SYSKEYDOWN, WM_SYSKEYUP 형태의 메시지 발생 .

호서대학교 컴퓨터공학


Microsoft Foundation Class 1. 키보드 메시지 

키보드 메시지와 메시지 메시지 핸들러

WM_KEYDOWN 메시지 = OnKeyDown 메시지 핸들러 동작 .

WM_KEYUP 메시지 = OnKeyUp 메시지 핸들러 동작 .

WM_SYSKEYDOWN 메시지 = OnSysKeyDown 핸들러 동작 .

WM_SYSKEYUP 메시지 = On_SysKeyUp 메시지 핸들러 동작 .

키보드 메시지에 따른 메시지 핸들러 연결

키보드의 입력 받을 클래스를 선택하고 속성창을 이용함 .

메시지 창에서 해당 메시지를 선택 후 메시지 핸들러 등록 .

호서대학교 컴퓨터공학


Microsoft Foundation Class 1. 키보드 메시지 

OnCreate() 메시지 핸들러에 사각형 그리기

m_wndChild.Create(TEXT( "STATIC"),TEXT("KeyMove" ), WS_CHILD | WS_VISIBLE | WS_BORDER, CRect(100, 100, 200, 200), this, 1234); 

CWnd 클래스의 객체인 m_wndChild 를 이용하여 사각형을 그림 .

호서대학교 컴퓨터공학


Microsoft Foundation Class 1. 키보드 메시지 

OnKeyDown() 메시지 핸들러를 이용하여 사각형 움직이기

116

void CKeyMoveView::OnKeyDown (UINT nChar, UINT nRepCnt, UINT nFlags) 117 { 118 CPoint ptChild; // 차일드 윈도우의 좌표 . 119 CRect Rect; // 차일드 윈도우의 좌표 및 크기 . 120 121 // 차일드 윈도우의 두 좌표 정보 ( 스크린 기준 ) 를 알아 옴 . 122 m_wndChild.GetWindowRect(&Rect); 123 ptChild.x = Rect.left; 124 ptChild.y = Rect.top; 125 126 // 스크린 기준 좌표를 클라이언트 뷰 기준의 좌표로 환산 . 127 ScreenToClient(&ptChild); 호서대학교 컴퓨터공학


Microsoft Foundation Class 1. 키보드 메시지 

OnKeyDown() 메시지 핸들러를 이용하여 사각형 움직이기

129 switch(nChar) 130 { 131 case VK_LEFT: // 왼쪽 화살표를 누른 경우 . 132 ptChild.x -= 10; //10 픽셀만큼 x 좌표 값 감소 . 133 break; 135 case VK_RIGHT: // 오른쪽 화살표를 누른 경우 . 136 ptChild.x += 10; //10 픽셀만큼 x 좌표 값 증가 . 137 break; 138 } 140 // 변경된 새 좌표로 차일드 윈도우를 이동시킨다 . 141 m_wndChild.SetWindowPos(&CWnd::wndTop, ptChild.x, ptChild.y, 0, 0, SWP_SHOWWINDOW | SWP_NOZORDER | SWP_NOSIZE);

호서대학교 컴퓨터공학


Microsoft Foundation Class 1. 키보드 메시지 

모니터 상에서의 좌표 추출 및 좌표 계산

GetWindowRect() •

ScreenToClient() •

차일드 윈도우의 두 좌표 정보 ( 스크린 기준 ) 를 알아 옴 .

스크린 기준 좌표를 클라이언트 뷰 기준의 좌표로 환산 함 .

SetWindowPos() •

변경된 새 좌표로 차일드 윈도우를 이동 시킴 .

호서대학교 컴퓨터공학


Microsoft Foundation Class 1. 키보드 메시지 

모니터 상에서의 좌표

A (0, 0)

X Axis

Y = 150

X = 200

Y = 250

Y = 350

B

X = 300

C

X = 400

D VK_LEFT

Y Axis

호서대학교 컴퓨터공학

VK_RIGHT


Microsoft Foundation Class 1. 키보드 메시지 

가상 키보드 (Virtual Keyboard)

키보드의 종류에 상관없이 범용적인 입력을 받기 위해 만들어놓은 범용적인 코드 값 .

372 373 374 375 376 377 378 379 380 381 382 383 384

/* * Virtual Keys, Standard Set */ #define VK_LBUTTON 0x01 #define VK_RBUTTON 0x02 #define VK_CANCEL 0x03 #define VK_MBUTTON 0x04 /* NOT contiguous with L & RBUTTON */ #if(_WIN32_WINNT >= 0x0500) #define VK_XBUTTON1 0x05 /* NOT contiguous with L & RBUTTON */ #define VK_XBUTTON2 0x06 /* NOT contiguous with L & RBUTTON */ #endif /* _WIN32_WINNT >= 0x0500 */

호서대학교 컴퓨터공학


Microsoft Foundation Class 1. 키보드 메시지 Transition code Previous key state Context code Extended Key

VK_RIGHT 15

14

13

12

11

10

9

8

7

6

5

Not use

OS

0

0

0

0

3

2

1

0

Scan code

0x01 0

4

0x4D 0

0

1

0

1

0

0

1

1

0

1

9

8

7

6

5

4

3

2

1

0

1

0

1

VK_RIGHT + Control key + Alt key 15

14

13

12

11

10

Not use

OS

Scan code

0x21 0

0

1

호서대학교 컴퓨터공학

0

0

0x4D 0

0

1

0

1

0

0

1


Microsoft Foundation Class 1. 키보드 메시지 

SetWindowPos() 함수의 원형 BOOL SetWindowPos(const CWnd* pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags);

pWndInsertAftere 값

의미

wndBottom

Z-order 를 최하위로 합니다 .

wndTop

Z-order 를 최상위로 합니다 .

wndTopMost

Z-order 를 최상위로 하고 시스템 윈도우 속성을 갖습니다 .

wndNoTopMost

일반 윈도우 중 최상위 윈도우가 되도록 합니다 .

호서대학교 컴퓨터공학


Microsoft Foundation Class 1. 키보드 메시지 

SetWindowPos() 함수의 원형 BOOL SetWindowPos(const CWnd* pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags); nFlags 값

의미

SWP_HIDEWINDOW

윈도우가 화면에서 사라지도록 합니다 .

SWP_SHOWWINDOW

윈도우가 화면에 보이도록 합니다 .

SWP_NOACTIVATE

윈도우를 활성화하지 않습니다 .

SWP_NOMOVE

윈도우의 위치를 변경하지 않습니다 . (x, y 무시 )

SWP_NOREDRAW

윈도우를 다시 그리지 않습니다 .

SWP_NOSIZE

윈도우의 크기를 변경하지 않습니다 . (cx, cy 무시 )

SWP_NOZORDER

윈도우의 Z-order 를 변경하지 않습니다 . (pWndInsertAfter 무시 )

호서대학교 컴퓨터공학


Microsoft Foundation Class 1. 키보드 메시지

151 152 153 154 155 156 157 158 159 160 161 162 163 164

WM_CHAR 메시지와 OnChar() 메시지 핸들러

키보드의 문자키를 입력하면 발생하는 메시지 핸들러 void CKeyMoveView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { CString strText = TEXT(""); strText.Format(TEXT("%c"), nChar); // 입력한 키가 Enter, Back Space, ESC 키가 아니면 // 해당 ASCII 문자로 차일드 윈도우 텍스트를 변경한다 . if(nChar != VK_RETURN && nChar != VK_BACK && nChar != VK_ESCAPE) { m_wndChild.SetWindowText(strText); } CView::OnChar(nChar, nRepCnt, nFlags); }

호서대학교 컴퓨터공학


Microsoft Foundation Class 2. 시스템 키보드 메시지 

WM_SYSKEYDOWN 메시지

Alt 키와 F10 키 같은 키에 의해 발생하는 메시지 .

OnSysKeyDown() 메시지 핸들러 함수를 호출 .

일반적인 키보드 핸들러와는 다른 기능들을 수행 함 .

CKeyMoveView::OnSysKeyDown (UINT nChar, UINT nRepCnt, UINT nFlags)

함수의 인자는 OnKeyDown() 함수와 같음 .

첫 번째 인자로 넘어오는 키 값은 가상 키 값을 사용 .

호서대학교 컴퓨터공학


Microsoft Foundation Class 2. 시스템 키보드 메시지 

GetKeyState() 함수

SHORT 형의 2 바이트 함수를 리턴 함 .

눌려진 특정 키의 상태를 검사 .

Alt 키와 조합되었는지 확인 .

HIBYTE() 매크로

GetKeyState 함수로부터 넘어온 인자 중 상위 바이트 추출 .

키를 누른 상태인지에 대한 정보가 들어 있음 .

LOBYTE() 매크로

GetKeyState 함수로부터 넘어온 인자 중 하위 바이트 추출 .

토글에 대한 정보가 들어 있음 .

호서대학교 컴퓨터공학


Microsoft Foundation Class 2. 시스템 키보드 메시지 

토글 키

키를 누를 때마다 상태가 On, Off 형태로 전환 됨 .

Caps Lock, Number Lock, Scroll Lock 등이 대표 토글키 .

GetKeyState() 함수의 반한 된 결과의 하위 바이트에 있음 .

WM_SYSCHAR 메시지

TranslateMessage() 함수에 의하여 생성 됨 .

Alt 키와 문자 키 입력이 조합 된 경우에 발생 함 .

예 ) ‘Alt + s’ 와 같은 조합 키를 사용하면 발생

호서대학교 컴퓨터공학


Microsoft Foundation Class 2. 시스템 키보드 메시지 191 192 193 194 195 196 197 198 199 200 201

void CKeyMoveView::OnSysChar(UINT nChar, UINT nRepCnt, UINT nFlags) { if(nChar == VK_RETURN) AfxMessageBox(TEXT("Alt + Enter")); else if(nChar == 's' || nChar == 'S') AfxMessageBox(TEXT("Alt + S")); else if(nChar == 'x' || nChar == 'X') AfxMessageBox(TEXT("Alt + X")); CView::OnSysChar(nChar, nRepCnt, nFlags); }

호서대학교 컴퓨터공학


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.