#include #include // timeGetTime()用 #pragma comment( lib, "winmm.lib" ) // timeGetTime()用、PlaySound()にも //------------------------------------------------------------- // メッセージ処理用コールバック関数 // 引数 // hWnd : ウィンドウハンドル // msg : メッセージ // wParam : メッセージの最初のパラメータ // lParam : メッセージの2番目のパラメータ // 戻り値 // メッセージ処理結果 //------------------------------------------------------------- LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_KEYDOWN: // キーが押されたときの処理 if (wParam == VK_ESCAPE) // ESCキーqが押されたら終了 { //DestroyWindow関数は、WM_DESTROYメッセージを発生させる DestroyWindow(hWnd); } break; case WM_CLOSE: int id; id = MessageBox(hWnd, TEXT("終了してもよろしいですか"), TEXT("確認"), MB_YESNO | MB_ICONQUESTION); if (id == IDYES) //DestroyWindow関数は、WM_DESTROYメッセージを発生させる DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); // アプリケーションを終了する break; default: return DefWindowProc(hWnd , msg , wParam , lParam); } return 0; } //------------------------------------------------------------- // アプリケーションのエントリポイント // 引数 // hInstance : 現在のインスタンスのハンドル // hPrevInstance : 以前のインスタンスのハンドル // lpCmdLine : コマンドラインパラメータ // nCmdShow : ウィンドウの表示状態 // 戻り値 // 成功したら0以外の値 //------------------------------------------------------------- int WINAPI WinMain( HINSTANCE l_hInst, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow ) { HWND hWnd; MSG msg; // マルチ・バイト文字をUNICODEに変換 WCHAR l_wcAppName[MAX_PATH] = L"aaa"; // ウィンドウクラスの初期化 WNDCLASSEX wndclass = { sizeof(WNDCLASSEX), // この構造体のサイズ NULL, // ウインドウのスタイル(default) WndProc, // メッセージ処理関数の登録 0, // 通常は使わないので常に0 0, // 通常は使わないので常に0 l_hInst, // インスタンスへのハンドル LoadIcon(l_hInst, L"MYICON"), // アイコン LoadCursor( NULL, IDC_ARROW), // カーソルの形 (HBRUSH)GetStockObject(WHITE_BRUSH), // 背景 NULL, // メニューなし l_wcAppName, // クラス名の指定 NULL // 小アイコン(なし) }; if( !RegisterClassEx(&wndclass) ) { MessageBoxA( NULL, "ウィンドウクラスの作成\nに失敗しました", NULL, MB_OK ); return 0; } hWnd = CreateWindow( l_wcAppName, l_wcAppName, WS_OVERLAPPEDWINDOW ^ WS_MAXIMIZEBOX ^ WS_THICKFRAME | WS_VISIBLE, CW_USEDEFAULT, //CW_USEDEFAULTでもOK CW_USEDEFAULT, //CW_USEDEFAULTでもOK 640, 480, NULL, NULL, l_hInst, NULL ); while( 1 ) { //--キューにメッセージがあったら、メッセージを処理--// if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) { if( 0 >= GetMessage( &msg, NULL, 0, 0 ) )break; TranslateMessage(&msg); DispatchMessage(&msg); } //--キューにメッセージがなかったら、ゲームループを処理--// else { //--FPS表示用変数--// static int nFPSCount = 0; //フレーム数のカウント static int nFPSDrawWait = 0; //次回のFPS表示更新までの時間 char szFPS[256]; //--FPS制御用--// static int nLastTime = 0; //次回の更新時間 int nNewTime = timeGetTime(); //現在の時間 //--更新--// if( nLastTime <= nNewTime ) { nLastTime = nNewTime + 16; //16msに一度更新する(約60FPS) nFPSCount++; //フレーム数カウント追加 //--FPS表示更新--// if( nFPSDrawWait <= nNewTime ) { //--FPS計算&文字列化--// //--FPS計算&文字列化--// wsprintfA( szFPS, "現在のFPS:%d.%03d", (int)( nFPSCount * 1000 ) / ( nNewTime - nFPSDrawWait + 1000 ), (int)( 1000 * ( nFPSCount * 1000 ) / ( nNewTime - nFPSDrawWait + 1000) ) % 1000 ); //wsprintfA( szFPS, "現在のFPS:%d", // (int)((nFPSCount*1000) / (nNewTime-nFPSDrawWait+1000) ); //--FPS表示(ここではタイトルバーに表示)--// SetWindowTextA( hWnd, szFPS ); nFPSDrawWait = nNewTime + 1000; //次回FPS表示更新は1000ms(1秒)後 nFPSCount = 0; //フレーム数カウントリセット } } } } return (int)msg.wParam; }