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 |