Windows と FullScreen を W キーで切り替える

MyD3D Object Class を使って、Windows Mode と FullScreen Mode をキーの操作で切り替えます。
最初 Windows Mode で立ち上がりますが 'W' キーを押すと FullScreen Mode に切り替わります。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. 新規作成で空のプロジェクト(D3Change)を作成して d3chenge.cpp をプロジェクトに加えて下さい。
  2. #define と #include と Direct3D の領域です。
    myd3d が MyD3D Object Class の定義です。
    ViewForm(0.0f,0.0f,-5.0f) がカメラの座標で正面から写します。
    g_bWindow は現在の描画モードを記憶する領域です。
    g_Wrect には、ウインドウ・モードの画面サイズを記憶します。
        #include    "MyD3D.h"
    
        //Global Area
        MyD3D                   *myd3d   = NULL;    // MyD3D Object Class
        HWND                    g_hWnd   = NULL;    // ウインドウ・ハンドル
    
        //Direct3D Area
        LPDIRECT3DDEVICE9       g_pDEV   = NULL;
        LPD3DXMESH              g_pMesh  = NULL;
        D3DXVECTOR3             ViewForm(0.0f,0.0f,-5.0f);
    
        bool        g_bWindow= true;                // 起動時の画面モード
        RECT        g_Wrect = { 0, 0, 640, 480 };   // ウインドウ・モードの描画領域
        
  3. WinMain() では、いつもと同じように Windows Mode で立ち上げます。
  4. DirectX Graphics の初期化です。
    Object Class をインスタンス化して、インターフェースを取得します。
    SetD3DPPFull() で FullScreen Mode のパラメータを Object の領域に設定します。
    InitD3D() で Windows Mode のデバイスを取得します。
    D3DXCreateTorus() トーラスのメッシュを作成します。
        HRESULT InitGraphics(void)
        {
            myd3d= new MyD3D(g_hWnd);
            myd3d->SetD3DPPFull();
            myd3d->InitD3D(&g_pDEV);
            //トーラスメッシュの生成
            D3DXCreateTorus(g_pDEV,0.4f,1.0f,32,32,&g_pMesh,NULL);
            return  S_OK;
        }
        
  5. Draw() 関数はいつもと同じです。
  6. SetupMatrices() ではY軸を基準にして World 座標を回転します。
    SetMaterial() や SetLight() はここで設定して下さい。
        void  SetupMatrices(void)
        {   RECT            rect;
            D3DXMATRIX      matWorld;
            D3DXMATRIX      matView;
            D3DXMATRIX      matProj;
    
            GetClientRect(g_hWnd,&rect);
            //World 座標をY軸を中心に自動回転
            D3DXMatrixRotationY(&matWorld,timeGetTime()/1000.0f);
            g_pDEV->SetTransform(D3DTS_WORLD,&matWorld);
            //View 座標の設定
            D3DXMatrixLookAtLH(&matView,&ViewForm,
                               &D3DXVECTOR3(0.0f,0.0f,0.0f),&D3DXVECTOR3(0.0f,1.0f,0.0f));
            g_pDEV->SetTransform(D3DTS_VIEW,&matView);
            //透視変換の設定
            D3DXMatrixPerspectiveFovLH(&matProj,D3DXToRadian(45.0f),(float)rect.right/(float)rect.bottom,1,50);
            g_pDEV->SetTransform(D3DTS_PROJECTION,&matProj);
            g_pDEV->SetRenderState(D3DRS_AMBIENT,0x00808080);
            myd3d->SetMaterial();
            myd3d->SetLight(0.0f, 0.6f, 0.8f);
        }
        
  7. CALLBACK 関数です。
    'W' キーで Windows Mode と FullScreen Mode を切り替えます。
    ESCAPE キーでプログラムを終了します。
        LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,UINT wParam,LONG lParam)
        {
            switch(msg)
            {   case WM_KEYDOWN:
                    switch(wParam)
                    {   case VK_ESCAPE: // [ESCAPE]キーでウインドウを閉じる
                            PostMessage(hWnd,WM_CLOSE,0,0);
                            break;
                        case 'W':       // 画面モードの切り替え
                            ChangeDisplayMode();
                            break;
                    }
                    break;
                case WM_SETCURSOR:          // カーソルを非表示
                    SetCursor(NULL);
                    return TRUE;
                case WM_CLOSE:
                case WM_DESTROY:
                    PostQuitMessage(0);
                    return 0L;
            }
            return DefWindowProc(hWnd,msg,wParam,lParam);
        }
        
  8. 肝心の Windows Mode と FullScreen Mode を切り替える関数です。
    g_bWindow は現在の描画モードを記憶する領域ですが、これを反転します。
    Reset() でデバイスをリセットします。
    ウインドウ・モードのとき、画面領域のサイズを g_Wrect に記憶しておきます。
    SetWindowLong() でウインドウの形式を指定して再設定します。
        void ChangeDisplayMode(void)
        {   HRESULT hr;
    
            g_bWindow= !g_bWindow;
            if (g_bWindow)  hr= g_pDEV->Reset(&(myd3d->D3DPPWin));
            else
            {   GetWindowRect(g_hWnd,&g_Wrect);
                hr= g_pDEV->Reset(&(myd3d->D3DPPFull));
            }
            if (FAILED(hr))
            {   DestroyWindow(g_hWnd);
                return;
            }
            if (g_bWindow)
            {   SetWindowLong(g_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW|WS_VISIBLE);
                SetWindowPos(g_hWnd,HWND_NOTOPMOST,g_Wrect.left,g_Wrect.top,
                             g_Wrect.right-g_Wrect.left,g_Wrect.bottom-g_Wrect.top,SWP_SHOWWINDOW);
            }
            else    SetWindowLong(g_hWnd,GWL_STYLE,WS_POPUP|WS_VISIBLE);
        }
        

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

前田稔(Maeda Minoru)の超初心者のプログラム入門

超初心者のプログラム入門(DirectX9 game program)

超初心者のプログラム入門(DirectX10 game program)