『Lena's by ☆볶기!!』: Restart !!

Rorolena
[API] 기초적 입력
이번 포스팅에선 API의 기초적 입력에 관하여 포스팅 해보겠습니다.

이번 포스팅에서도
크게 3가지 입력기를
소개할 것입니다.

1. 키보드 입력
2. 마우스 입력
3. 타이머 / 타이머와 콜백 함수

이번에도 기본적인 사용방법은 간단합니다만
조금 부연설명이 필요할것 같습니다.

키보드 입력)_
키보드 입력에는 보편적으로 2가지 방법이 있습니다.
(하지만 소스에는 한가지만 소개되어있습니다.)
[첫번째 WM_KEYDOWN을 이용한 방법]
필요한것은 3가지 정도로
키처리를 받아들이는 윈도우 메세지
들어오는 키를 판별할 WPARAM
이를 판별할 조건 키입니다.

case WM_KEYDOWN:
switch (wParam)
{
case VK_LEFT:
case 'A':
break;
}

WM_KEYDOWN에 관하여 설명을 하면
이 메세지는 키보드의 입력이 들어왔을때
발생되는 윈도우 메세지
입니다.

WM_KEYDWON의 특징은 2가지로
첫번째는 키보드의 모든 키에 대응하며
두번째는 입력되는 키의 대소문 구분이 없습니다.

즉 어떤 키가 입력 되었다더라 라는 명령처리만 합니다.

[두번째 WM_CHAR를 이용한방법]
이것도 필요한것은 3가지 정도입니다.
문자처리를 받아들이는 윈도우 메세지
들어오는 문자를 분별할 WPARAM
이를 분별할 조건 문자 입니다.

case WM_CHAR:
switch (wParam)
{
case 'A':
case 'a':
Key.x -= 8;
break;
}

WM_CHAR에 관한 설명을 하면
이 메세지는 키보드에 들어온 입력중
문자만을 분별해 발생되는 윈도우 메세지
입니다.

WM_CHAR의 특징은 2가지로
첫번째는 문자에만 대응합니다.
(문자열셋 즉 아스키 코드등으로 대응)
두번쨰는 입력되는 키의 대소분 구분이 있습니다.

※ 참고사항 WM_KEYDOWN이 있듯이
WM_KEYUP도 있습니다.

우선순위는 WM_KEYDOWN -> WM_CHAR -> WM_KEYUP 순입니다.

마우스 입력)_
우리가 키보드 만큼 자주쓰는 마우스 입력 방법입니다.
[마우스 입력]
마우스 처리를 위해서는 몇 가지
윈도우 메세지를 알아야하는대요
쭈욱! 열거 해보겠습니다.

많습니다.

설명도 쭈욱 열거 해보자면
아...
일단 WM_MOUSEFIRST 있는대요
지금 설명해도 모르니 PASS 하겠습니다.
이거랑 WM_MOUSELAST도 설명해야 하거든요

그다음 부터 이벤트를 주욱 열거하자면
마우스가 움직일때
왼쪽 버튼이 눌를때
왼쪽 버튼을 땔때
왼쪽 버튼 더블클릭
오른쪽 버튼이 눌를때
오른쪽 버튼을 땔때
오른쪽 버튼 더블클릭
가운대 버튼이 눌를때
가운대 버튼을 땔때
가운대 버튼 더블클릭

가 되도록하겠습니다.
이를 소스에서 해당 메세지가 들어올때
알맞은 소스처리를 해주시면 됩니다.

추가적으로 설명할점이 하나더 있습니다.
마우스 이벤트 가운데 더블클릭은
저것만으로 인식되 되지 않습니다.

아마 이대로 쓰시면 더블클릭해도 아무런
반응이 없는걸 보시게 될것입니다.

WinMain에 작성하신걸 보면 그중 다음과 같이 작성하셔야합니다.
WndClass.style=CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;

여기서 CS_DBLCLKS이걸 작성해주시면
더블클릭이 잘 동작 할것입니다.

타이머 / 타이머와 콜백 함수)_
타이머의 사용방법에관하여 알아보도록 하겠습니다.
[타이머]
필요한것은 최소 2가지 정도로
SetTimerKillTimer가 있습니다.

이 2가지의 인자를 소개하면
SetTimer(hWnd, 1, 100, NULL);
핸들, ID, 딜레이시간, 실행할 함수
KillTimer(hWnd, 1);
핸들, ID

정도로 정리할수 있겠습니다.
이중 딜레이 시간은 ms 단위로
1000에 1초간격으로 동작합니다.

이 명령어들은 정해진
시간간격으로 2가지 일을 합니다.

첫번째는 WM_TIMER메세지를 발생시킵니다.
두번째는 SetTimer에 설정된 실행할 함수를 실행합니다.

소스로 정리하자면 다음과 같이 사용하시면 됩니다.

SetTimer(hWnd, 2, 1000, NULL);

case WM_TIMER:
switch (wParam)
{
case 2:
GetLocalTime(&st);
wsprintf(sTime, TEXT("%d시 %d분 %d초"),
st.wHour, st.wMinute, st.wSecond);
InvalidateRect(hWnd, &rt, TRUE);
break;
}
return 0

KillTimer(hWnd, 2);

여기서 WM_TIMER의 스위치문 안에
넣어주는 숫자가 ID로 각 ID별로
별개의 명령을 처리해줄수 있습니다.

[타이머와 콜백함수]
타이머와 콜백함수에 관해 설명하겠습니다.

먼저 콜백함수에 관해서입니다.
정확한 개념을 설명하면 좋겠지만
여러분의 이해를 돕고자 추상적으로
간략하게 설명을 해보이자면

어떤 상황, 조건이 생겨서 정해진일을 해야할때
그일을 하라고 요청을 하는 것과 같다고 볼수있습니다.
자세한 설명을 하면 좋겠지만...

그냥 간단하게 이 소스를 실행할때
이함수를 불러다 쓴다 라는 식으로
간단하게 생각해주세요


해서 타이머 함수에도 4번째인자에
콜백 함수를 지정하실수 있습니다.

이를 소스로 정리하면 이런형태가 됩니다.

VOID CALLBACK SetPix(HWND hWnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
HDC hdc;
hdc = GetDC(hWnd);

for(INT i=0; i<50; i++)
{
SetPixel(hdc, 200+rand()%100, rand()%100,
RGB(rand()%256,rand()%256,rand()%256));
}

ReleaseDC(hWnd, hdc);
}

SetTimer(hWnd, 1, 100, SetPix);
KillTimer(hWnd, 1);

이런식으로 만들면

셋타이머 해놓은개 발생할때마다
SetPix 함수안에 소스들이 실행되게 됩니다.

설명은 이쯤 마치고
위의 소스들을 전부 출력하시면
다음과 같은 2가지 형태가 됩니다.

'보관소 ▦ ━━ > 작업 기록' 카테고리의 다른 글

[API] 리소스 활용  (4) 2012.01.13
[C/C++] 5. 상수와 기본 자료형  (0) 2012.01.12
[API] 기초적 출력  (0) 2012.01.09
[API] 윈도우 만들기  (4) 2012.01.06