프로그래밍/MFC

MFC-키보드 입력

리뷰하는 (게임)프로그래머_리프TV 2010. 5. 12. 17:45




API에 존재하는 WM_KEYDOWN이나 WM_KEYUP, WM_CHAR, WM_SYSKEYDOWN 등이 존재 하는데, 그 부분을 MFC로 다루어 보자.

일단 키 입력이 이루어 졌을 때 재대로 작동하는지 확인 하기 위해,

새로운 윈도우 클래스을 2개정도(STATIC으로) 만들자.( 새로운 윈도우 클래스 생성은 이전 포스팅 참조 )


//View.h
public:
	CWnd m_wndChild;		// 첫번째 Static을 위한 CWnd
	CWnd m_wndChild2;		// 두번째 Static을 위한 CWnd
//View.cpp
int CTest1View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;

	// TODO:  여기에 특수화된 작성 코드를 추가합니다.

	// 첫번째 Static
	m_wndChild.Create( TEXT("STATIC"), TEXT("What Funtion?"),
		WS_CHILD | WS_VISIBLE | WS_BORDER, 
		CRect( 50, 50, 200 ,100 ), this, 1 );

	// 두번째 Static
	m_wndChild2.Create( TEXT("STATIC"), TEXT("Press Key."),
		WS_CHILD | WS_VISIBLE | WS_BORDER, 
		CRect( 50, 0, 200, 50 ), this, 2 );

	return 0;
}​


위쪽 Static은 호출 된 함수, 두번째 Static은 눌린 키에 대해서 보이게 할 것이다.

Static을 2개 띄운 이 후, View속성에 메시지 탭에서 WM_KEYDOWN, WM_CHAR, WM_SYSKEYDOWN을 각각 추가한다.
각각의 함수를 생성하게 되면 OnKeyDown, OnChar, OnSysKeyDown식으로 생성이 될 것이다.
각 함수에

	CString strText = TEXT("");
	strText.Format( TEXT("%c"), nChar );
	m_wndChild.SetWindowText( strText );
	m_wndChild2.SetWindowText( TEXT("호출 함수명") );​


과 같이 넣어 주자. 실행 하면, 키를 누를때 마다 Static이 변하는 것을 확인 할 수 있다.
문자열 'A~Z', '1~0', NumLock키 등.. OnChar 함수를 호출 하는것을 확인 할 수 있고,
그외, 방향키나 Delete키 Space Bar, Enter Key 같은 경우는 OnKeyDown 함수를 호출 하는 것을 알 수 있다.
그리고 Alt와 F10키를 누르면 OnSysKeyDown 함수가 호출 되는 것을 알 수 있다.

한가지 주의 할 것은 문자열 입력을 한다고 해서 OnKeyDown 함수를 들리지 않는 것은 아니다.
순서는 OnKeyDown -> OnChar 순으로 이동 하게 되고,
반대로 OnSysKeyDown의 경우엔 OnKeyDown과 OnChar을 들르지 않는다.(SetWindowText를 MessageBox로 변경 하거나, BreakPoint를 활용하여 확인 하자)
이 점을 숙지 하여 상황에 따라서 그때 그때 맞는 함수를 잘 사용하는 것이 키 포인트 인거 같다.

// 실행 화면