/* マルチメディアタイマとPerformanceCounter 2004/ 1/ 4 宍戸 輝光 */ #include #pragma comment(lib, "winmm.lib") #define WM_TIMER_100 WM_USER+1 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); void CALLBACK timerFunc(UINT uiID, UINT uiNo, DWORD dwCookie, DWORD dwNo1, DWORD dwNo2); HINSTANCE g_hInstance; HWND g_hwMain, g_hwView; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MSG msg; WNDCLASSEX wndclass; g_hInstance = hInstance; wndclass.cbSize = sizeof(wndclass); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = NULL; wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "MMTEST"; wndclass.hIconSm = NULL; RegisterClassEx(&wndclass); /* メインウインドウ作成 */ g_hwMain = CreateWindow ("MMTEST", "タイマテスト", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 360, 200, NULL, NULL, hInstance, NULL); ShowWindow(g_hwMain, iCmdShow); /* メッセージループ */ while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } /* ウインドウプロシージャー */ LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { static DWORD dwTimerID; static int i = 0; char aszStr[256]; static LARGE_INTEGER liFreq, liNow, liPrev; DWORD dwTime; switch (iMsg) { case WM_CREATE: /* 文字列表示用テキスト領域作成 */ g_hwView = CreateWindow("EDIT", NULL, WS_BORDER | WS_CHILD | WS_VISIBLE |ES_MULTILINE, 4, 4, 320, 120, hwnd, (HMENU)0, g_hInstance, NULL); /* PerformanceCounterの周波数取得 */ QueryPerformanceFrequency(&liFreq); /* マルチメディアタイマ起動 */ dwTimerID = timeSetEvent(5, 4, timerFunc, 0, TIME_PERIODIC); /* 現カウント値保存 */ QueryPerformanceCounter(&liPrev); return 0; case WM_TIMER_100: i++; /* 現カウント値取得 */ QueryPerformanceCounter(&liNow); /* 前回からの経過時間をミリ秒単位で算出 */ dwTime = (DWORD)(((liNow.QuadPart - liPrev.QuadPart) * 1000) / liFreq.QuadPart); /* 表示用文字列作成 */ wsprintf(aszStr, "%d - %I64dHz\r\n周期%dms", i, liFreq.QuadPart, dwTime); /* 文字列を表示 */ SetWindowText(g_hwView, aszStr); /* 今回のカウントを保存 */ liPrev = liNow; return 0; case WM_DESTROY: /* 終了処理 */ /* マルチメディアタイマ終了 */ timeKillEvent(dwTimerID); PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; } /* マルチメディアタイマコールバック関数 */ void CALLBACK timerFunc(UINT uiID, UINT uiNo, DWORD dwCookie, DWORD dwNo1, DWORD dwNo2) { static int i = 0; /* 呼び出しカウンタ更新 */ i++; /* 100回呼び出される度にメッセージ送信 */ if (i == 100) { PostMessage(g_hwMain, WM_TIMER_100, 0, 0); /* 呼び出しカウンタクリア */ i = 0; } }