ウィンドウモードを切り替える

先に説明したとおり、開発はウィンドウ・モードで行い、完成したらフルスクリーン・モードでゲームをプレイすることが望ましい。
ここでは、簡単にウィンドウモードを切り替えるプログラムを紹介する。

パラメータによってモードを変化させる

ウィンドウ生成時にパラメータの値を調べ、その値によってウィンドウ・モードでウィンドウを生成するか、フルスクリーン・モードでウィンドウを生成するかを切り替えるようなプログラムを作成する。

1.パラメータの設定

モードを判断するパラメータを宣言する。プログラム実行中にモードを切り替えることはしないと考え、マクロとして次のように指定する。

// マクロ
#define WINMODE TRUE // ウィンドウモードの指定(TRUE:ウィンドウモード/FALSE:フルスクリーン)
#define SCREEN_WIDTH	640	// ウィンドウの幅
#define SCREEN_HEIGHT	480	// ウィンドウの高さ

《POINT》

2.InitApp()関数の修正

WINMODEの値(TRUE/FALSE)によって作成するウィンドウを変えるため、ウィンドウ生成処理を次のように修正する。

//-------------------------------------------------------------------------------------------------
//  関数名 :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関数の正常終了
}

《POINT》

※上記修正を行い、WINMODEの値によって作成されるウィンドウが変わるかどうかを確かめる。


BACK(ウィンドウ・モード用のウィンドウを生成する) BACK(DirectX Graphicsプログラミングの基礎)