//------------------------------------------------------------------------------------------------- // 問題番号:Exer002 // 問題内容:スケルトンプログラムにDirectX Graphicsを追加する // Copyright NKC Game Staff(←自分の名前)  //------------------------------------------------------------------------------------------------- #include // WindowsAPIを使用可能にする #include // マクロ #define WINMODE TRUE // ウィンドウモードの指定(TRUE:ウィンドウモード/FALSE:フルスクリーン) #define SCREEN_WIDTH 640 // ウィンドウの幅 #define SCREEN_HEIGHT 480 // ウィンドウの高さ // プロトタイプ宣言 LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM); // Windows関数 BOOL InitApp(HINSTANCE, int); // ユーザー関数 // グローバル変数 HWND hWnd; // ウィンドウハンドル char szWinName[] = "Exer002"; // ウィンドウクラス用文字列 char szWinTitle[] = "スケルトンプログラムにDirectX Graphicsを追加する"; // ウィンドウクラス用文字列 //------------------------------------------------------------------------------------------------- // メイン関数(エントリーポイント)プログラムはここから始まる //------------------------------------------------------------------------------------------------- int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode) { MSG msg; // メッセージ構造体変数 //表示するウィンドウの定義、登録、表示 if (!InitApp(hThisInst, nWinMode)) // InitApp関数を呼び出し、 return (FALSE); // 正常に終了すれば次にメッセージループへ // メッセージループ // Windowsは「WM_QUIT」メッセージを受けると偽(0)を戻す while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); // メッセージの解析 DispatchMessage(&msg); // メッセージの破棄 } return msg.wParam; } //------------------------------------------------------------------------------------------------- // ウィンドウプロシジャ関数(WindowProcedure) // メッセージ処理を行う //------------------------------------------------------------------------------------------------- LRESULT CALLBACK WinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_KEYDOWN: // キーを押したとき switch (wParam) { case VK_ESCAPE: PostMessage(hWnd, WM_CLOSE, 0, 0); break; } break; case WM_SETCURSOR: // カーソルの設定 SetCursor(NULL); break; case WM_DESTROY: // 閉じるボタンをクリックした時 PostQuitMessage(0); // WM_QUITメッセージを発行 break; default: // 上記以外のメッセージはWindowsへ処理を任せる return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } //------------------------------------------------------------------------------------------------- // 関数名 :InitApp // 機能概要:表示するウィンドウの定義、登録、表示 // 戻り値 :正常終了のとき1、以上終了のとき0 //------------------------------------------------------------------------------------------------- BOOL InitApp(HINSTANCE hThisInst, int nWinMode) { WNDCLASSEX wc; //ウィンドウクラス構造体 // ウィンドウクラスを定義する wc.cbSize = sizeof(WNDCLASSEX); // WNDCLASSEX構造体のサイズを設定 wc.style = NULL; // ウィンドウスタイル(デフォルト) wc.lpfnWndProc = WinProc; // ウィンドウ関数 wc.cbClsExtra = 0; // 通常は使わない(0にしておく) wc.cbWndExtra = 0; // 通常は使わない(0にしておく) wc.hInstance = hThisInst; // このインスタンスへのハンドル wc.hIcon = NULL; // ラージアイコン(なし) wc.hCursor = LoadCursor(NULL, IDC_ARROW); // カーソルスタイル wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); // ウィンドウの背景(黒) wc.lpszMenuName = NULL; // メニュー(なし) wc.lpszClassName = szWinName; // ウィンドウクラス名 wc.hIconSm = NULL; // スモールアイコン(なし) // ウィンドウクラスの登録 if (!RegisterClassEx(&wc)) return (FALSE); // ウィンドウクラスの登録ができたので、ウィンドウを生成する if ( WINMODE ) { /* ウィンドウ・モード用のウィンドウを生成 */ hWnd = CreateWindow( szWinName, // ウィンドウクラスの名前 szWinTitle, // ウィンドウタイトル WS_OVERLAPPEDWINDOW, // ウィンドウスタイル 0, // ウィンドウの左角X座標 0, // ウィンドウの左角Y座標 CW_USEDEFAULT, // ウィンドウの幅 CW_USEDEFAULT, // ウィンドウの高さ NULL, // 親ウィンドウ(なし) NULL, // メニュー(なし) hThisInst, // このプログラムのインスタンスのハンドル NULL // 追加引数(なし) ); RECT wRect, cRect; // ウィンドウ全体の矩形、クライアント領域の矩形 int ww, wh; // ウィンドウ全体の幅、高さ int cw, ch; // クライアント領域の幅、高さ // ウィンドウ全体の幅・高さを計算 GetWindowRect(hWnd, &wRect); ww = wRect.right - wRect.left; wh = wRect.bottom - wRect.top; // クライアント領域の幅・高さを計算 GetClientRect(hWnd, &cRect); cw = cRect.right - cRect.left; ch = cRect.bottom - cRect.top; // クライアント領域以外に必要なサイズを計算 ww = ww - cw; wh = wh - ch; // ウィンドウ全体に必要なサイズを計算 ww = SCREEN_WIDTH + ww; wh = SCREEN_HEIGHT + wh; // 計算した幅と高さをウィンドウに設定 SetWindowPos(hWnd, HWND_TOP, 0, 0, ww, wh, SWP_NOMOVE); } else { /* フルスクリーン・モード用のウィンドウを生成 */ hWnd = CreateWindow( szWinName, // ウィンドウクラスの名前 szWinTitle, // ウィンドウタイトル WS_VISIBLE | WS_POPUP, // ウィンドウスタイル 0, // ウィンドウの左角X座標 0, // ウィンドウの左角Y座標 SCREEN_WIDTH, // ウィンドウの幅 SCREEN_HEIGHT, // ウィンドウの高さ NULL, // 親ウィンドウ(なし) NULL, // メニュー(なし) hThisInst, // このプログラムのインスタンスのハンドル NULL // 追加引数(なし) ); } ShowWindow(hWnd, nWinMode); // ウィンドウを表示 ValidateRect(hWnd, 0); // WM_PAINTが呼ばれないようにする UpdateWindow(hWnd); // ウィンドウの更新 return (TRUE); // InitApp関数の正常終了 }