posted by nsakura 2010. 7. 18. 17:49

메세지는 프로그램 실행중에 사용자로부터 입력 된다.

메세지는 이렇게 사용자에 의해 대부분 유발되지만  사용자의 동작과 상관없이 발생하는 메세지도 있는데

대표적으로 WM_TIMER가있다.

자 WM_TIMER를 이용해 프로그램을 하나 짜보자.

#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

HINSTANCE g_Inst;
LPCTSTR wndname=TEXT("GFP TIME");

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nShowCmd){
 HWND hWnd;
 MSG Message;
 WNDCLASS WndClass;
 g_Inst=hInstance;

 WndClass.cbClsExtra=0;
 WndClass.cbWndExtra=0;
 WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
 WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
 WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
 WndClass.hInstance=hInstance;
 WndClass.lpfnWndProc=WndProc;
 WndClass.lpszClassName=wndname;
 WndClass.lpszMenuName=NULL;
 WndClass.style=CS_HREDRAW|CS_VREDRAW;
 RegisterClass(&WndClass);

 hWnd=CreateWindow(wndname,wndname,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);

 ShowWindow(hWnd,nShowCmd);

 while(GetMessage(&Message,NULL,0,0)){
  TranslateMessage(&Message);
  DispatchMessage(&Message);
 }
 return (int)Message.wParam;

}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam){
 HDC hdc;
 PAINTSTRUCT ps;
 SYSTEMTIME st;
 static TCHAR sTime[128];

 switch(iMessage){
 case WM_DESTROY:
  KillTimer(hWnd,1);
  PostQuitMessage(0);
  return 0;
 case WM_CREATE:
  SetTimer(hWnd,1,1000,NULL);
  return 0;
 case WM_TIMER:
  GetLocalTime(&st);
  wsprintf(sTime,TEXT("%d : %d: %d"),st.wHour,st.wMinute,st.wSecond);
  InvalidateRect(hWnd,NULL,true);
  return 0;
 case WM_PAINT:
  hdc=BeginPaint(hWnd,&ps);
  TextOut(hdc,100,100,sTime,lstrlen(sTime));
  EndPaint(hWnd,&ps);
  return 0;
 }
 return (DefWindowProc(hWnd,iMessage,wParam,lParam));
}

여기서 새로운 구조체와 몇개의 함수가 등장하는데.

SYSTEMTIME 구조체와  GetLocalTimer이라는 함수는  일단 차후에 자세히 다루게 될 것이다.

WM_CREATE메세지는 윈도우가 처음 생설될 때 발생한다.

WM_CREATE가 발생하면

SetTimer 함수가 호출되는데.. 함수 원형은

UINT SetTimer(HWND hWnd, UINT nlDEvent, UINT uElapse, TIMERPROC ipTimerFunc);

첫 번째 인수 타이머 메세지를 받을 윈도우

두 번째  타이머의 번호를 지정하며 이 번호 WM_TIMER 메시지에서 타이머를 구분하기 위한 표식을 사용

세 번째 타이머의 주기를 설정하는데 단위는 1/1000초이다.

네 번째 타이머 메세지가 발생할 때마다 호출되는 함수를 지정하는데 사용하지 않을 경우 NULL로 지정한다.

WM_TIMER 메세지는 wParam으로 타이머 ID를 전달 받으면 lParam으로 타이머 메세지를 발생시 호출될 함수의 번지를 전달한다.

WM_TIMER 메세지가 발생하면 GetLocalTime함수로 시간을 조사한 후 출력을 위해 sTimer 문자열로 변환해 둔다. 시간이 바뀔때마다.

갱신 InvalidateRect함수로 통해 WM_PAINT를 발생.

그리고 윈도우가 꺼질때.

WM_DESTROY메세지가 발생 되는데...

KillTimer함수는 설치된 타이머를 없애는 함수 이다.


'Computer > Win API' 카테고리의 다른 글

WinApi 타이머 확장 문제.  (0) 2010.07.18
WinApi 타이머2 [SendMessage]  (0) 2010.07.18
WinApi 마우스 입력.  (0) 2010.07.18
WinApi WM_KEYDOWN  (0) 2010.07.18
WinApi input WM_CHAR  (0) 2010.07.17