[MFC] 5장: 키보드 입력

2011. 2. 16. 06:07
반응형

[ 교재 ]

열혈강의 Visual C++ 2008 MFC 윈도우 프로그래밍

저자 최호성 / 출판사 프리렉

5장: 키보드 입력

1. 키보드 메시지

  • 키보드와 마우스: 기본적인 입력 장치(HID: Human Input Device)
  • 키보드 단추 누름: WM_KEYDOWN 메시지 발생
  • 단추 눌렀다가 뗄 때: WM_KEYUP
  • 시스템 키보드(Alt, F10): WM_SYSKEYDOWN
  • 알파벳 키: WM_CHAR (추가 전달됨)
    • 메시지 루프의 TranslateMessage() 함수가 WM_KEYDOWN을 변환시켜 줌.

▲ 설명: MFC 응용 프로그램 프로젝트 생성

▲ 설명: 단일 문서, MFC 표준, Windows 원형/기본 옵션 선택

▲ 설명: 클래식 메뉴, 도킹 가능한 도구 모음 사용

▲ 설명: 가장 기본적인 MFC 단일 문서 예제 만들어 짐.

▲ 설명: 뷰 윈도우(하얀 본문)에 차일드 윈도우를 만들 것임

▲ 설명: 멤버로 Child Window(CWnd 객체)를 선언함

▲ 설명: 뷰윈도우가 생성되는 시점에 Child Window 를 만들어야 하기 때문에 뷰윈도우의 메시지 중 WM_CREATE 메시지 발생(OnCreate) 하는 부분에 이 코드를 넣으면 됨.

STATIC: 윈도우 타입

KeyMove: 텍스트 명시

WS_CHILD: 자식 윈도우라는 뜻

WS_VISIVLE: 화면에 표시

WS_BORDER: 테두리 표시

CRect: 윈도우 좌표(왼쪽 위 100/100, 오른쪽 하단 좌표 각각)

This: 뷰윈도우의 포인터

1234: 임의로 지정

▲ 설명:

좌측 위 좌표: 100, 100

우측 아래: 200, 200

(부모 윈도우 기준)

▲ 설명: 키 눌렸을 때 처리 WM_KEYDOWN (OnKeyDown 핸들러 함수 생성) 추가.

GetWindowRect: 현재 차일드 윈도우가 위치한 좌표를 저장(스크린 기준)

CRect 와 Rect 구조체가 서로 호환됨.

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

VF_LEFT: 가상 키 값. 좌측 화살표

VF_RIGHT: 우측 화살표 눌렀을 때

SetWindowPos 함수: 차일드 윈도우 위치를 바꿈.

wndTop: Z-order(윈도우가 겹쳐 있을 때 어떤 것이 아래이고 위인지 정하는 것) -> 뒤에 옵션 소개

SWP_SHOWWINDOW: 윈도우 보임

SWP_NOZORDER: Z-order 변경 안함

SWP_NOSIZE: 윈도우의 크기를 변경하지 않음

▲ 설명:

좌표 체계:

  1. 스크린(모니터 화면 기준)
  2. 부모 윈도우 기준

둘 간의 서로 변환 과정이 있을 수 있다.(메모 A10에서 설명함)

▲ 설명: 키보드 방향 키(왼쪽, 오른쪽)를 누르면 차일드 윈도우가 이동한다.

▲ 설명: VK_RIGHT과 같은 가상 키 코드의 정의로 이동해 보면 구체적인 값이 얼마인지 나온다

▲ 설명: 어떤 키 값들이 실제로 어떤 값으로 정의되어 있는지 나타남

▲ 설명: OnKeyDown 함수의 파라메터 중에서 flag 값을 조사하면 점 더 정확한 키보드 상태를 가져올 수 있다.

표는 키를 눌렀을 때 값의 변화.

8비트씩 나눠서. 우측에는 Scan Code가 들어오고 왼쪽에는

8번 비트가 설정되어 있음.(확장키인가 여부)

Context code: Alt키가 눌러졌는지 여부. 예를 들어 Right + Ctrl + Alt 누르면 Context code가 설정됨

Not use: 사용 안하는 비트

Previous key state: 앞선 키의 상태 – 이 값이 1이면 이 메시지가 오기 전에 눌려 있었다는 뜻

▲ 설명: OnKeyDown 함수의 몸체에서 중단점을 삽입해서…

▲ 설명: 디버깅 모드로 실행한 뒤,

▲ 설명: 키보드 오른쪽 방향키를 누르면…

▲ 설명: 플래그 값(nFlags)을 16진수로 표시하면

▲ 설명: 0x0000014d에서

1이 아래 표 8번 자리의 1이고

4d가 우측의 Scan code이다.

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

   

OS

Not use

 

Scan code

0x01

0x4D

0

0

0

0

0

0

0

1

0

1

0

0

1

1

0

1

 

//변경된 새 좌표로 차일드 윈도우를 이동시킨다.
m_wndChild.SetWindowPos(&CWnd::wndTop, ptChild.x, ptChild.y, 0, 0,
            SWP_SHOWWINDOW | SWP_NOZORDER | SWP_NOSIZE);

▲ 설명: Z-order 변경. CWnd 클래스의 wndTop(최상위 표시)의 주소를 넘겨줌.

▲ 설명:

SWP: Set Window Pos 줄임말.

SetWindowPos라는 동일한 이름의 API 함수도 존재. 사용 방법은 동일.

▲ 설명: 알파벳 등 ASCII 코드 키가 입력되면 발생함.

▲ 설명: CString 클래스 strTmp를 선언하고 차일드 윈도우 문자를 세팅하는 함수에 strTmp 저장.

CString 클래스: MFC에서 제공하는 문자열 처리 클래스. 자세한 정보는 PDF 파일 확인.

▲ 설명: 키보드에서 문자 키를 누르면 차일드 윈도우의 문자가 바로 변경됨

2. 시스템 키보드 메시지

  • 윈도우에서 시스템 키(Alt, F10)를 누르면 메인 메뉴로 포커스가 이동함
  • 사용자 인터페이스의 일관성을 유지하기 위해 WM_KEYDOWNWM_KEYUP이 아니라 WM_SYSKEYDOWNWM_SYSKEYUP 메시지가 발생하도록 설계됨

▲ 설명: 시스템 키(알트, F10)를 눌렀을 때 메뉴 선택 가능

▲ 설명: WM_SYSKEYDOWN 메시지 핸들러 함수인 OnSysKeyDown() 함수를 뷰 클래스에 등록.

(F10, Alt를 눌렀을 때 일반 WM_KEYDOWN으로 메시지가 발생하지 않기 때문에 별도로 등록해 줘야 해당 기능을 사용할 수 있다)

▲ 설명: GetKeyState를 통해 Space 키에 대한 정보를 수집.

HIBYTE: 윈도우 매크로. wResult를 인자로 받아 들임.

하위 바이트 1번 비트가 1이면 토글 키(캡스락, 넘락, 스크롤락)가 켜진 상태.

wResult는 16비트 WORD 타입

16비트니까 2바이트. 거기서 바이트 위아래를 떼서 위쪽 것을 1바이트 뜯어내는 게 byHigh.

Alt + Space 같이 눌린 것을 체크.

VK_CAPITAL: 캡스락

▲ 설명: 알트 + 스페이스를 누르면 현재 캡스락이 켜져 있는지 꺼져 있는지의 여부가 표시됨.

▲ 설명: 시스템 키(Alt, F10)와 문자 키가 조합되었을 때 이를 사용할 수 있는 WM_SYSCHAR의 메시지 핸들러 함수인 OnSysChar() 함수를 등록.

▲ 설명: 시스템 키와 조합된 키를 찾아내서 알림 창에 나타내는 코드.

대소문자 구별 없이 동작.

VK_RETURN: 엔터(캐리지 리턴)

▲ 설명: 키보드의 Alt와 조합된 키를 입력하면 알림 창에 나타내 줌

반응형
,