728x90
Keyboard & Message
Human Input Device
WM_CHAR WM-COMMANDWM__KEYDOWN & OnKeyDown()
- Project Name
- KeyMove
- Class View
- CKeyMoveApp
- CKeyMoveDoc
- CKeyMoveView
- CMainFrame
Class View ->CKeyMoveView->마우스 우클릭 ->속성(Properties) ->Messages ->WM_CREATE
int CKeyMoveView::OnCreate(LPCREATESTRUCT lpCreateStruct)
//WM_CREATE - 차일드 윈도우 생성
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
m_wndChild.Create(_T("STATIC"), _T("KeyMove"),
WS_CHILD | WS_VISIBLE | WS_BORDER,
CRect(100, 100, 200, 200), this, 1234);
return 0;
}
Class View ->CKeyMoveView->마우스 우클릭 ->속성(Properties) ->Messages ->WM_KEYDOWN
void CKeyMoveView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
// WM_KEYDOWN - 방향키로 차일드 윈도우 이동
{
// TODO: Add your message handler code here and/or call default
CPoint ptChild; //차일드 윈도우의 좌표.
CRect Rect; //차일드 윈도우의 좌표 및 크기.
//차일드 윈도우의 두 좌표 정보 (스크린 기준)를 알아 온다.
m_wndChild.GetWindowRect(&Rect);
ptChild.x = Rect.left;
ptChild.y = Rect.top;
//스크린 기준 좌표를 클라이언트 뷰 기준의 기준의 좌표로 환산한다.
ScreenToClient(&ptChild);
switch(nChar)
{
case VK_LEFT: // 왼쪽 화살표를 누른 경우
ptChild.x -= 10; // 10픽셀 만큼 x좌표 값 감소
break;
case VK_RIGHT: // 오른쪽 화살표를 누른 경우
ptChild.x += 10; // 10픽셀 만큼 x좌표 값 증가
break;
}
//변경된 새 좌표로 차일드 윈도우를 이동 시킨다.
m_wndChild.SetWindowPos(&CWnd::wndTop, ptChild.x, ptChild.y, 0, 0,
SWP_SHOWWINDOW | SWP_NOZORDER | SWP_NOSIZE);
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
Class View ->CKeyMoveView->마우스 우클릭 ->속성(Properties) ->Messages ->WM_CHAR
void CKeyMoveView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
// WM_CHAR - 차일드 윈도우의 문자 변경
{
// TODO: Add your message handler code here and/or call default
CString strTmp;
strTmp.Format(_T("%c"), nChar);
m_wndChild.SetWindowText(strTmp);
CView::OnChar(nChar, nRepCnt, nFlags);
}
Class View ->CKeyMoveView->마우스 우클릭 ->속성(Properties) ->Messages ->WM_SYSKEYDOWN
void CKeyMoveView::OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
//시스템키 WM_SYSKEYDOWN/UP
{
// TODO: Add your message handler code here and/or call default
CString strMessage = TEXT("");
WORD wResult = ::GetKeyState(VK_SPACE); //word = 10비트
BYTE byHigh = HIBYTE(wResult);
if(byHigh & 0x01)
{
strMessage += TEXT("Alt + Space, ");
wResult = :: GetKeyState(VK_CAPITAL); //caps lock key
//하위 바이트의 1번 비트가 1이면 토글 키가 켜진 상태
BYTE byLow = LOBYTE(wResult);
if(byLow & 0x01) strMessage += TEXT("CAPS LOCK ON");
else strMessage += TEXT("CAPS LOCK OFF");
AfxMessageBox(strMessage);
}
CView::OnSysKeyDown(nChar, nRepCnt, nFlags);
}
Class View ->CKeyMoveView->마우스 우클릭 ->속성(Properties) ->Messages ->WM_SYSCHAR
void CKeyMoveView::OnSysChar(UINT nChar, UINT nRepCnt, UINT nFlags)
// WM_SYSCHAR단축키 처리 키보드로 구현
{
// TODO: Add your message handler code here and/or call default
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);
}
'컴퓨터과학[2-1] > knou_[2-1]Visual_C' 카테고리의 다른 글
MFC Keyboard 방향키로 차일드 윈도우의 크기를 조절해 보자 (0) | 2015.04.02 |
---|---|
MFC Keyboard 방향키로 차일드 윈도우를 이동해보자 (0) | 2015.04.02 |
MFC 코드의 흐름 (0) | 2015.03.30 |
MFC 윈도우 프로그래밍(최호성)101page 풀이 (0) | 2015.03.29 |
MFC Control Video (0) | 2015.03.28 |
댓글