대표적인 키보드 메시지로는 WM_KEYDOWN , WM_KEYUP , WM_CHAR 가 있으며,
Alt키와 f10 이 두키를 누르면 WM_KEYDOWN 이 발생하지 않고 WM_SYSKEYDOWN,UP 이 발생
만약 WM_KEYDOWN 메시지의 파라미터에 아스키 코드의 문자가 입력되면 메시지 루프의 TranslateMessage() 함수가
WM_KEYDOWN 메시지를 다시 WM_CHAR 메시지로 전환하여 전송하기도 한다.
다음은 키보드 방향키를 누르면 자식 윈도우가 움직이는 예제다.
void CKeyMoveView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
//nChar : 어떤 키를 눌렀는지에 대한 정보가 들어잇다. WinUser.h 파일에 정의
//nRepCnt : 반복 횟수를 의미, 보통 한 번누루므로 1
//nFlags : 키보드에 대한 상세한 상태 정보를 담고 있다. 비트 단위로 살펴봐야 한다. 확장키값!
CRect rect; //차일드 윈도우의 좌표 및 크기
CPoint ptChild; //차일드 윈도우의 좌표
m_wndChild.GetWindowRect(&rect); //자식 윈도우 크기를 가져와서 rect에 저장
ptChild.x = rect.left; // 자식 윈도우 x좌표 대입
ptChild.y = rect.top; // 자식 윈도우 y좌표 대입
ScreenToClient(&ptChild);
switch(nChar)
{
case VK_LEFT:
ptChild.x -= 10;
break;
case VK_RIGHT:
ptChild.x += 10;
break;
case VK_UP:
ptChild.y -= 10;
break;
case VK_DOWN:
ptChild.y += 10;
break;
default:
break;
}
m_wndChild.SetWindowPos(&CWnd::wndTop, ptChild.x, ptChild.y, 0,0, SWP_SHOWWINDOW | SWP_NOZORDER | SWP_NOSIZE);
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
다음은 엔터나 ESC, 백스페이스바를 제외한 문자열을 입력햇을 때 윈도우에 해당 문자열이 나오는 예제다.
//ESC,엔터,백스페이스바도 이상하게 문자열로 취급되므로 제외시켜준다.
void CKeyMoveView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CString m_strText;
m_strText.Format(_T("%c"), nChar);
if(nChar != VK_BACK && nChar != VK_RETURN && VK_ESCAPE)
{
m_wndChild.SetWindowText(m_strText);
}
CView::OnChar(nChar, nRepCnt, nFlags);
}
시스템 키보드 메시지
Alt 키와 f10 키를 눌렀을 때에 WM_SYSKETDOWN , UP 메시지가 나온다.
다음은 alt 키를 누른 상태에서 스페이스바를 눌렀을 때를 테스트한다.
GetKeyState() 함수가 반환한 16비트 값에서 상위 바이트는 키를 누른 상태인지에 대한 정보가
들어잇으며 하위 바이트에는 토글에 대한 정보가 들어 있다.
스페이스바는 토글 키가 아니니 굳이 하위 바이트 정보를 확인할 필요가 없다.
밑에와 같은 토글키는 GetKeyState() 함수가 반환한 결과의 하위 바이트를 검사하며,
On/Off 상태는 1번 비트를 확인해서 1이면 누른 상태이다. 자주 사용하므로 꼭 알아두자.
void CKeyMoveView::OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CString m_StrMessage = _T("");
WORD wResult = ::GetKeyState(VK_SPACE); //키의 상태를 저장한다
BYTE byHigh = HIBYTE(wResult); //상위 바이트를 떼어내서 확인한다.
if(byHigh & 0x01) // 상위 바이트의 1번 비트가 1이면 키가 눌린 상태
{
m_StrMessage += _T("Alt + space");
//같은 방법으로 caps lock 키 조사
wResult = ::GetKeyState(VK_CAPITAL);
BYTE byLow = LOBYTE(wResult);
if(byLow & 0x01 )
m_StrMessage += _T(" + Caps Lock On");
else
m_StrMessage += _T(" + Caps Lock Off");
AfxMessageBox(m_StrMessage);
}
CView::OnSysKeyDown(nChar, nRepCnt, nFlags);
}
WM_CHAR 메시지와 마찬가지로 시스템 키보드 메시지에는 WM_SYSCHAR 메시지가 있으며,
이것 역시 translateMessage() 함수가 생성한다. 이 메시지는 alt 키와 문자키 입력이 조합된 경우에
발생한다. 즉 alt + s 와 같은 조합키를 눌렀을 때 발생하는 메시지이다.
'Windows > MFC' 카테고리의 다른 글
직접 버튼 그리기 (0) | 2011.11.13 |
---|---|
글꼴과 문자열 다루기 (0) | 2011.11.13 |
MFC 코드의 흐름 (1) | 2011.11.12 |
메시지맵 (MessageMap) (0) | 2011.11.12 |
CFrameWnd 클래스 (0) | 2011.11.12 |