Windows アプリケーションのひな形を見つけましたので載せておきます。
かなり昔に書いたソースなのですが稚拙ながらもゲームに応用しようという努力がほほえましいですね。
今後のゲーム開発にも使える部分は使っていこうと思います。
/** * @file * @brief Windows アプリケーションの雛形 * * Windows アプリケーションを作成する際の雛形ファイル。 * コンパイルオプション /EHsc が必要。 * ライブラリ kernel32.lib user32.lib gdi32.lib が必要。 * * @author Byerkut * @date 2005-12-16 * @version $Id: $ */ #define _UNICODE #define UNICODE #include <windows.h> /*====================================================================== * プロトタイプ宣言 *======================================================================*/ /// ウィンドウプロシージャ(コールバック関数) LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp); /*====================================================================== * 定数 *======================================================================*/ /// クライアントサイズの幅 static const unsigned int iClientWidth = 640; /// クライアントサイズの高さ static const unsigned int iClientHeight = 480; /*====================================================================== * グローバル変数 *======================================================================*/ /// ウィンドウクラス名 static LPCTSTR szClassName = TEXT("template"); /// タイトルバーの文字列 static LPCTSTR szTitleBar = TEXT("タイトルバーの文字列"); /// インスタンスハンドル static HINSTANCE hInstance = NULL; /*====================================================================== * 関数 *======================================================================*/ /** * アプリケーションのエントリーポイント * * @param[in] hInstance 現在のインスタンスハンドル * @param[in] hPreviousInstance 過去のインスタンスハンドル * @param[in] lpsCommandLine コマンドライン引数 * @param[in] nCommandShow ウィンドウ状態 * * @return アプリケーションの終了コード */ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreviousInstance, LPSTR lpsCommandLine, int nCommandShow) { // hInstance の格納 ::hInstance = hInstance; // ミューテックスによる多重起動の検出 HANDLE hMutex; hMutex = ::CreateMutex(NULL, TRUE, szClassName); if (::GetLastError() == ERROR_ALREADY_EXISTS) { return 0; } // アプリケーション初期化 { // ウィンドウクラスを定義する WNDCLASSEX wc; // 構造体のサイズ wc.cbSize = sizeof(WNDCLASSEX); // クラスのスタイル wc.style = CS_HREDRAW | CS_VREDRAW; // ウィンドウプロシージャ名 wc.lpfnWndProc = ::WindowProcedure; // 補助メモリ wc.cbClsExtra = 0; // 補助メモリ wc.cbWndExtra = 0; // インスタンスハンドル wc.hInstance = ::hInstance; // アイコン wc.hIcon = (HICON)::LoadImage(NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); // カーソル wc.hCursor = (HCURSOR)::LoadImage(NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED); // 背景ブラシ wc.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH); // メニュー名 wc.lpszMenuName = NULL; // クラス名 wc.lpszClassName = ::szClassName; // 小さいアイコン wc.hIconSm = (HICON)::LoadImage(NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); // ウィンドウクラスを登録する if (!::RegisterClassEx(&wc)) return FALSE; } // インスタンス初期化 { // ウィンドウサイズを計算する unsigned int windowWidth = iClientWidth + GetSystemMetrics(SM_CXEDGE) + GetSystemMetrics(SM_CXBORDER) + GetSystemMetrics(SM_CXDLGFRAME); unsigned int windowHeight = iClientHeight + GetSystemMetrics(SM_CYEDGE) + GetSystemMetrics(SM_CYBORDER) + GetSystemMetrics(SM_CYDLGFRAME) + GetSystemMetrics(SM_CYCAPTION); // ウィンドウを作成する HWND hWnd; hWnd = ::CreateWindow(// クラス名 ::szClassName, // タイトルバーの文字列 ::szTitleBar, // ウィンドウの種類 WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX, // x 座標 GetSystemMetrics(SM_CXSCREEN)/2 - windowWidth/2, // y 座標 GetSystemMetrics(SM_CYSCREEN)/2 - windowHeight/2, // 幅 windowWidth, // 高さ windowHeight, // 親ウィンドウのハンドル // 親を作るときは NULL NULL, // メニューハンドル // クラスメニューを作るときは NULL NULL, // インスタンスハンドル hInstance, // ウィンドウ作成データ NULL); if (!hWnd) return FALSE; // ウィンドウを表示する ::ShowWindow(hWnd, nCommandShow); // ウィンドウを再描画する ::UpdateWindow(hWnd); } // メッセージループ MSG msg; ::ZeroMemory(&msg, sizeof(MSG)); while (msg.message != WM_QUIT) { if (::PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { ::TranslateMessage(&msg); // メッセージをウィンドウプロシージャに送信 ::DispatchMessage(&msg); } else { // ゲームシステムのメインループ } } // ミューテックスを閉じる ::CloseHandle(hMutex); // PostQuitMessage 関数によってポストされた // WM_QUIT メッセージの wParam を終了コードとして返す return (int)msg.wParam; } /** * ウィンドウプロシージャ用のコールバック関数 * * @param[in] hWnd ウィンドウハンドル * @param[in] msg メッセージ内容 * @param[in] wp 補助パラメータ * @param[in] lp 補助パラメータ * * @return メッセージ処理の結果 */ LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_CREATE: // ゲームシステムの初期化 { } break; case WM_ACTIVATE: if (wp == WA_ACTIVE) { // ゲームシステムのアクティブ化 } else { // ゲームシステムの非アクティブ化 } break; case WM_CLOSE: // 閉じる操作が行われた時 WM_DESTROY をポストする ::DestroyWindow(hWnd); break; case WM_DESTROY: // ゲームシステムの終了 { } // WM_QUIT をポスト(引数は終了コード) ::PostQuitMessage(0); break; default: return ::DefWindowProc(hWnd, msg, wp, lp); } // 自分で処理した場合は必ず 0 を返す return 0; }
Contributions