ミリ秒単位の時刻を取得

タイマ割り込みを使って timeGetTime() でミリ秒単位の時刻を取得します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの作成

  1. 空の新規プロジェクト(Main)を作成します。
    詳細は Dialog Box のプログラム 及び 空のプロジェクトからプログラムを作成する を参照して下さい。
  2. Main.cpp をフォルダーに格納して[プロジェクト][既存項目の追加]からプロジェクトに追加します。
    Main.cpp の全ソースコードです。
    /*************************************************************/
    /*★ timeGetTime() でミリ秒単位の時刻を取得する    前田 稔 ★*/
    /*************************************************************/
    #define     NAME    "Empty Program"
    #define     TITLE   "Empty Sample Program"
    #include    <windows.h>
    #include    <mmsystem.h>
    #pragma     comment(lib,"winmm.lib")
    #define     ID_TIMER    (WM_APP + 0)
    
    // Global Area
    HINSTANCE   g_hInst;
    HWND        g_hWnd;
    int         nowTime;
    
    // Function Prototype
    LRESULT  CALLBACK   WndProc(HWND, UINT, WPARAM, LPARAM);
    int      APIENTRY   WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
    
    //★ CALLBACK 関数
    LRESULT  CALLBACK  WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
    {   PAINTSTRUCT ps;
        HDC         hdc;
        char        work[80];
    
        //渡された message から、イベントの種類を解析する
        switch(msg)
        {
            case WM_CREATE:
                timeBeginPeriod(1);      //時間精度を1msに設定
                SetTimer(hWnd,ID_TIMER,50,NULL);
                break;
            case WM_TIMER:
                nowTime= timeGetTime();
                InvalidateRect(hWnd,NULL,TRUE);
                UpdateWindow(hWnd); 
                break;
            case WM_PAINT:
                hdc= BeginPaint (hWnd, &ps);
                wsprintf(work,"nowTime = %d", nowTime);
                TextOut(hdc,50,20,work,strlen(work));
                EndPaint(hWnd, &ps);
                break;
            case WM_DESTROY:
                KillTimer(hWnd,ID_TIMER);
                PostQuitMessage(0);
                break;
            default:
                return  DefWindowProc(hWnd,msg,wParam,lParam);
        }
        return  0;
    }
    
    //★ Windows Main 関数
    int APIENTRY  WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
    {   MSG     msg;
    
        g_hInst= hInst;
        WNDCLASS wc = { CS_CLASSDC,WndProc,0L,0L,hInst,NULL,LoadCursor(NULL,IDC_ARROW),
                        (HBRUSH)GetStockObject(WHITE_BRUSH),NULL,NAME };
        if (RegisterClass(&wc)==0)    return FALSE;
    
        g_hWnd= CreateWindow(NAME,TITLE,WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT,CW_USEDEFAULT,400,200,
                NULL,NULL,hInst,NULL);
        if (!g_hWnd)  return FALSE;
    
        ShowWindow(g_hWnd,SW_SHOWDEFAULT);
        UpdateWindow(g_hWnd);
        SetFocus(g_hWnd);
    
        while(GetMessage(&msg,NULL,0,0))
        {   TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        return S_OK;        //return 0
    }
    

プログラムの説明

  1. ミリ秒単位の時刻を取得するときは timeGetTime() を使います。
    timeGetTime() を使うときは、mmsystem.h を取り込んで winmm.lib をリンクします。
    ID_TIMER はタイマのIDです。
    他のIDとバッティングしなければ何でも良いのですが WM_APP からの相対的な値を使うことが推奨されています。
        #include    <mmsystem.h>
        #pragma     comment(lib,"winmm.lib")
        #define     ID_TIMER    (WM_APP + 0)
        
  2. WM_CREATE で時間精度を設定して、タイマを50ミリ秒で起動します。
            case WM_CREATE:
                timeBeginPeriod(1);      //時間精度を1msに設定
                SetTimer(hWnd,ID_TIMER,50,NULL);
                break;
        
  3. タイマ割り込みが発生すると WM_TIMER が呼ばれます。
    timeGetTime() で現在時刻を取得して、InvalidateRect() と UpdateWindow() で WM_PAINT を呼び出します。
            case WM_TIMER:
                nowTime= timeGetTime();
                InvalidateRect(hWnd,NULL,TRUE);
                UpdateWindow(hWnd); 
                break;
        
  4. WM_PAINT では nowTime を編集して画面に表示します。
            case WM_PAINT:
                hdc= BeginPaint (hWnd, &ps);
                wsprintf(work,"nowTime = %d", nowTime);
                TextOut(hdc,50,20,work,strlen(work));
                EndPaint(hWnd, &ps);
                break;
        
  5. プログラムを終了する前にタイマを止めて下さい。
            case WM_DESTROY:
                KillTimer(hWnd,ID_TIMER);
                PostQuitMessage(0);
                break;
        

超初心者のプログラム入門(Win32API C++)