본문 바로가기

Windows/Windows API

타이머 (Timer)

#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPSTR lpszClass="MyTimer";

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
         ,LPSTR lpszCmdParam,int nCmdShow)
{
    HWND hWnd;
    MSG Message;
    WNDCLASS WndClass;
    g_hInst=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)WndProc;
    WndClass.lpszClassName=lpszClass;
    WndClass.lpszMenuName=NULL;
    WndClass.style=CS_HREDRAW | CS_VREDRAW;
    RegisterClass(&WndClass);

    hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
         CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
         NULL,(HMENU)NULL,hInstance,NULL);
    ShowWindow(hWnd,nCmdShow);
    
    while(GetMessage(&Message,0,0,0)) {
        TranslateMessage(&Message);
        DispatchMessage(&Message);
    }
    return Message.wParam;
}

/*
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static HANDLE hTimer, hTimer2;
    SYSTEMTIME st;
    static char sTime[128];
    static RECT rt={100,100,400,120};

    switch(iMessage) {
    case WM_CREATE:
        hTimer=(HANDLE)SetTimer(hWnd,1,1000,NULL);
        hTimer2=(HANDLE)SetTimer(hWnd,2,5000,NULL);
        SendMessage(hWnd, WM_TIMER, 1, 0);
        return 0;
    case WM_TIMER:
        switch (wParam) {
        case 1:
            GetLocalTime(&st);
            wsprintf(sTime,"지금 시간은 %d:%d:%d입니다",
                st.wHour,st.wMinute,st.wSecond);
            InvalidateRect(hWnd,&rt,TRUE);
            break;
        case 2:
            MessageBeep(0);
            break;
        }
        return 0;
    case WM_PAINT:
        hdc=BeginPaint(hWnd,&ps);
        TextOut(hdc,100,100,sTime,strlen(sTime));
        EndPaint(hWnd,&ps);
        return 0;
    case WM_DESTROY:
        KillTimer(hWnd,1);
        KillTimer(hWnd,2);
        PostQuitMessage(0);
        return 0;
    }
    return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
*/

// 타이머를 하나만 설치한 경우
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static HANDLE hTimer;
    SYSTEMTIME st;
    static char sTime[128];
    static RECT rt={100,100,400,120};

    switch(iMessage) {
    case WM_CREATE:
        hTimer=(HANDLE)SetTimer(hWnd,1,1000,NULL);        // this is Timer

        // 그냥 하게 되면 1초경과 후 부터 시간이 보이기 때문에
        // WM_TIMER를 강제로 실행한다.
        SendMessage(hWnd, WM_TIMER, 1, 0);                // Create timer message
        return 0;
    case WM_TIMER:
        GetLocalTime(&st);
        wsprintf(sTime,"지금 시간은 %d:%d:%d입니다",
            st.wHour,st.wMinute,st.wSecond);
        //InvalidateRect(hWnd,NULL,TRUE);
        InvalidateRect(hWnd,&rt,TRUE);                    // Redraw to within area
        return 0;
    case WM_PAINT:
        hdc=BeginPaint(hWnd,&ps);
        TextOut(hdc,100,100,sTime,strlen(sTime));
        EndPaint(hWnd,&ps);
        return 0;
    case WM_DESTROY:
        KillTimer(hWnd,1);                                // destory timer
        PostQuitMessage(0);
        return 0;
    }
    return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

'Windows > Windows API' 카테고리의 다른 글

WM_SIZE  (0) 2013.10.01
콜백함수 (CALLBACK)  (0) 2013.10.01
마우스 이벤트 (Mouse event)  (0) 2013.10.01
마우스 입력 (Mouse Input)  (0) 2013.10.01
WM_KEYDOWN  (0) 2013.10.01