WM_CHAR가 문자만 받는다면 WM_KEYDOWN은 문자이외에도 키보드가 눌리면 발생하는 이벤트 메시지다. 각각의 값은 다른데서 찾아보시고.
wParam값에 키보드가 눌러진 값이 반환이 된다.

다음은 WM_KEYDOWN의 예제이다.
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
 HDC hdc;
 PAINTSTRUCT ps;
 static int x=100;
 static int y=100;

 switch(iMessage)
 {
 case WM_KEYDOWN:
  switch(wParam)
  {
  case VK_LEFT:
   x-=8;
   break;
  case VK_RIGHT:
   x+=8;
   break;
  case VK_UP:
   y-=8;
   break;
  case VK_DOWN:
   y+=8;
   break;
  }
  InvalidateRect(hWnd,NULL,TRUE);
  return 0;
 case WM_PAINT:
  hdc=BeginPaint(hWnd,&ps);
  TextOut(hdc,x,y,TEXT("A"),lstrlen(TEXT("A")));
  EndPaint(hWnd,&ps);
  return 0;
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
  }
 return(DefWindowProc(hWnd,iMessage,wParam,lParam));
 }


그리고 다음 예제는 스페이스가 눌리면 A와 #이 토글되는 예제이다.
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
 HDC hdc;
 PAINTSTRUCT ps;
 static BOOL sp_in=FALSE;
 static int x=100;
 static int y=100;
 LPCTSTR a=TEXT("A");

 switch(iMessage)
 {
 case WM_KEYDOWN:
  switch(wParam)
  {
  case VK_LEFT:
   x-=8;
   break;
  case VK_RIGHT:
   x+=8;
   break;
  case VK_UP:
   y-=8;
   break;
  case VK_DOWN:
   y+=8;
   break;
  case VK_SPACE:
   sp_in=!sp_in;
   break;
  }
  InvalidateRect(hWnd,NULL,TRUE);
  return 0;
 case WM_PAINT:
  hdc=BeginPaint(hWnd,&ps);
  if(sp_in==FALSE)a=TEXT("A");
  else if(sp_in==TRUE) a=TEXT("#");
  TextOut(hdc,x,y,a,lstrlen(a));
  EndPaint(hWnd,&ps);
  return 0;
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
  }
 return(DefWindowProc(hWnd,iMessage,wParam,lParam));
 }

'Programming > Visual C++' 카테고리의 다른 글

입력5. 마우스  (0) 2011.06.29
입력3. TranslateMessage  (0) 2011.06.29
입력1. WM_CHAR  (0) 2011.06.29
출력5. MessageBox & MessageBeep  (0) 2011.06.28
출력4. 기타  (0) 2011.06.28

+ Recent posts