[MFC] Keyboard Message 처리

Posted by seunggwon
2008. 10. 30. 19:33 IT Note/기타언어

키보드의 방향키(LEFT,RIGHT,UP,DOWN)를 사용하여 마우스 커서의 위치 이동
1. WM_KEYDOWN에 대한 메시지 핸들러
2. 각 방향키에 따라 좌,우,위,아래방향으로 각각 10만큼 이동
3. 마우스 커서 관련 함수 - ::SetCursorPos(), ::GetCursorPos()
4. Shift를 누르면서 방향키를 누르면 더 많이 움직일 수 있게 작성

아래의 소스를 추가한다.

void CMessageView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
 CPoint pt;
 if((::GetKeyState(VK_SHIFT)<0) &&(::GetCursorPos(&pt)))
 {
  switch(nChar)
  {
  case VK_LEFT: pt.x-=100;
   ::SetCursorPos(pt.x,pt.y);
   break;
  case VK_RIGHT: pt.x+=100;
   ::SetCursorPos(pt.x,pt.y);
   break;
  case VK_UP: pt.y-=100;
   ::SetCursorPos(pt.x,pt.y);
   break;
  case VK_DOWN: pt.y+=100;
   ::SetCursorPos(pt.x,pt.y);
   break;
  }
 }
 else if(::GetCursorPos(&pt))
 {
  switch(nChar)
  {
  case VK_LEFT: pt.x-=10;
   ::SetCursorPos(pt.x,pt.y);
   break;
  case VK_RIGHT: pt.x+=10;
   ::SetCursorPos(pt.x,pt.y);
   break;
  case VK_UP: pt.y-=10;
   ::SetCursorPos(pt.x,pt.y);
   break;
  case VK_DOWN: pt.y+=10;
   ::SetCursorPos(pt.x,pt.y);
   break;
  }
 }
 CView::OnKeyDown(nChar, nRepCnt, nFlags);
}

하지만 위의 소스는 길이가 길기 때문에, 효율성과 가독성이 떨어진다. 그래서 아래의 소스로 작성하면 효율성과 가독성이 더 증대된다.

void CMessageView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
 CPoint pt;

 if(::GetCursorPos(&pt)) //else //(::GetCursorPos(&pt))
 {
  switch(nChar)
  {
  case VK_LEFT:
   ((GetKeyState(VK_SHIFT)) < 0) ? pt.x-=100 : pt.x-=10;
   //shift키를 눌렀을 때 첫째 실행, 안눌었을 때 두번째 실행됨
   
   ::SetCursorPos(pt.x, pt.y);
   break;
  case VK_RIGHT:
   ((GetKeyState(VK_SHIFT)) < 0) ? pt.x+=100 : pt.x+=10;
   ::SetCursorPos(pt.x, pt.y);
   break;
  case VK_UP: 
   ((GetKeyState(VK_SHIFT)) < 0) ? pt.y-=100 : pt.y-=10;
   ::SetCursorPos(pt.x,pt.y);
   break;
  case VK_DOWN: 
   ((GetKeyState(VK_SHIFT)) < 0) ? pt.y+=100 : pt.y+=10;
   ::SetCursorPos(pt.x,pt.y);
   break;
  }
 }
 
 CView::OnKeyDown(nChar, nRepCnt, nFlags);
}

실행파일 

'IT Note > 기타언어' 카테고리의 다른 글

[MFC] Text 출력  (0) 2008.11.07
[MFC] Mouse Message 처리  (0) 2008.10.30
[MFC] Dialog based Program  (0) 2008.10.23