티스토리 뷰


OnTimer는 WM_TIMER 이벤트가 발생할 경우 일반적으로 콜백되는 함수..

WM_TIME을 설정하는 방법은 리소스에서 다이얼로그의 속성 창에 보면

아래와 같이 메세지를 볼 수 있는 버튼을 클릭하면 여러 가지 윈도우 메세지(WM)을 볼 수 있다

사용자 삽입 이미지


그 중 WM_TIMER 를 보면 이미 OnTimer라는 함수가 설정 되어있다.

설정 안되어있다면 OnTimer가 없는 그 빈칸을 클릭하면 <Add> 라고 셀렉트박스가 뜬다..

사용자 삽입 이미지


그럼 이벤트 함수는 생성했는데 어떻게 써먹어야하나...

SetTimer로 타이머를 설정하고, KillTimer로 타이머를 삭제하는 방식으로 하면 된다.

SetTimer는 msdn을 참고하면


CWnd::SetTimer 

Installs a system timer.

UINT_PTR SetTimer(
   UINT_PTR nIDEvent,
   UINT nElapse,
   void (CALLBACK* lpfnTimer
)(HWND,
   UINT,
   UINT_PTR,
   DWORD
) 
);

System 타이머를 설정한다고 되어있고 첫 번째 인자는 nIDEvent이고 unsigned integer 포인터이다. 두 번째 인자는 nElapse 고 unsigned integer이고 마지막은 콜백 함수이다.

어떻게 써먹느냐를 보기 전에 KillTimer를 살펴보면


CWnd::KillTimer 

Kills the timer event identified by nIDEvent from the earlier call to SetTimer.

BOOL KillTimer(
   UINT_PTR nIDEvent 
);



간단하다. 요약에 있는 그대로 SetTimer를 통해 설정한 nIDEvent를 인자로 받아서 타이머를 끄는 역할이다. 그럼 대충 활용하는 방법은...

먼저 타이머 만드는 소스가

SetTimer(아이디, 호출 시간(ms) , 콜백 함수);

인데 콜백함수는 NULL , 0 을 넘기게 되면 WM_TIMER에서 설정한 함수를 호출하게 된다.
즉, WM_TIMER가 아니라 다른 함수에 대해서도 호출을 하고 싶다면 3번째 인자를 바꾸면 되고, 그것이 아닌 일반적인 상황에서는 NULL을 넘기면 된다.

첫 번째 인자 아이디에는 아무 int를 넣어도 된다. 하지만 KillTimer에서 호출하는 것과 콜백함수에서 두번째인자가 UINT_PTR 로 여기서 설정한 아이디를 넘겨주므로 타이머가 여러 개 일 경우에는 구분 짓는 것이 좋다.

그냥 일반적으로는


#define MY_TIMER 100


등 과 같이 타이머 아이디를 define문으로 선언한다.

따라서 OnInitDialog나 타이머를 시작할 코드에다가


SetTimer(MY_TIMER , 1000 , 0);


이라고 하면 그때부터 OnTimer 함수가 1초에 한번씩 호출 된다.

타이머는 1초마다 호출 되는 것이므로 타이머를 멈추하려면


KillTimer(MY_TIMER);


라고 하면 간단하다.

그럼 OnTimer안에서는 어떻게 처리 할 것인가..
OnTimer는 인자가 하나로 넘어오는데 바로 UINT_PTR 인 타이머의 아이디이다. 따라서 아이디에 따라 다르게 처리하려면 아래와 같이 하면 편하다.


void CSensorMonitoringDlg::OnTimer(UINT_PTR nIDEvent)
{

 switch(nIDEvent)
 {
 case MY_TIMER:
   //1초마다 처리할 내용
   break;
 case OTHER_TIMER;
   //다른 타이머를 설정했다면 이렇게 구분
   break;
 }
}



흐름만 조금 이해하면 아주 쉽다..
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함