호서대학교 컴퓨터공학
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 호서대학교 컴퓨터공학