*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*

C言語 DirectX9

実行時にスクリーンモードを変更するサンプル」のコード No.4


*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*

.






元のページ


元ページ「<C言語 DirectX9> 実行時にスクリーンモードを変更するサンプル」
http://note.chiebukuro.yahoo.co.jp/detail/n358452

記述量上限の制限で、ページを分けて記述しています。







本ページの前のページ


「実行時にスクリーンモードを変更するサンプル」のコード No.3
http://note.chiebukuro.yahoo.co.jp/detail/n359205

記述量上限の制限で、ページを分けて記述しています。















はじめに


元ページの

「<C言語 DirectX9> 実行時にスクリーンモードを変更するサンプル」

におけるコードをここに記述します。








ソースコード




//lllllll

//VVVVVVV

// o l o l o l o l o l o l o l o

// o V o V o V o V o V o V o V o

//========================

// 画面モードの変更

void ChangeDisplayMode(void)

{

       // スクリーンモード指定フラグを切り替え

       // true:ウィンドウモード / false:フルスクリーンモード

       g_bWindow = !g_bWindow;




       // 現在のDIRECT3Dデバイス構造体の設定等

       if (g_bWindow)       // フルスクリーンモードからウィンドウモード(true)への切り替えの場合

       {

              // 現在のDIRECT3Dデバイス構造体にウィンドウモード用DIRECT3Dデバイス構造体を設定

              d3dpp_Now = d3dpp_WindowMode;

       }

       else       // ウィンドウモードからフルスクリーンモード(false)への切り替えの場合

       {

              // 現在のDIRECT3Dデバイス構造体にフルスクリーンモード用DIRECT3Dデバイス構造体を設定

              d3dpp_Now = d3dpp_FullScreenMode;



              // ウインドウの大きさと位置を取得

              //  --- さらに後に、再びウィンドウモードに戻った時に、ウインドウの大

              //      きさと位置を復元するため、現在の大きさと位置を取得しておく。

              GetWindowRect(g_hWindow, &g_rectWindow);

       }



       // LPDIRECT3DDEVICE9::Reset()を実行する前に行なう処理

       CleanupD3DObject();       // Direct3Dに管理されないオブジェクトの開放処理

       CleanupTexture();       // テクスチャオブジェクトの開放処理



       // レンダリング デバイスを更新する。

       HRESULT hr = pDevice->Reset(&d3dpp_Now);

       if (FAILED(hr))

       {

              if (hr == D3DERR_DEVICELOST)

                     g_bDeviceLost = true;

              else

                     DestroyWindow(g_hWindow);



              MessageBox(NULL , TEXT("ERROR: スクリーンモード変更時にResetで失敗しました。"), TEXT("error message") , MB_OK);

              //DXTRACE_ERR("ChangeDisplayMode Reset", hr);

              return;

       }



       // テクスチャオブジェクトの作成

       // LPDIRECT3DDEVICE9::Reset()を実行する前にテクスチャオブジェクト

       // を開放したので、それを元通りに復元する。

       hr = CreateTexture();

       if (FAILED(hr))

       {

              DestroyWindow(g_hWindow);

              MessageBox(NULL , TEXT("ERROR: スクリーンモード変更時にCreateTextureで失敗しました。"), TEXT("error message") , MB_OK);

              DestroyWindow(g_hWindow);

              return;

       }



       // Direct3Dに管理されないオブジェクトの初期化

       // LPDIRECT3DDEVICE9::Reset()を実行する前にスプライトオブジェクト

       // を開放したので、それを元通りに復元する。

       hr = InitD3DObject();

       if (FAILED(hr))

       {

              DestroyWindow(g_hWindow);

              MessageBox(NULL , TEXT("ERROR: スクリーンモード変更時にInitD3DObjectで失敗しました。"), TEXT("error message") , MB_OK);

              DestroyWindow(g_hWindow);

              return;

       }



       // ウィンドウスタイルの変更

       if (g_bWindow)       // フルスクリーンモードからウィンドウモード(true)への切り替えの場合

       {

              //------------------------------------

              // ウィンドウスタイル変更

              // 及び、メニューの設定

              //------------------------------------



              // ウィンドウモードでのウィンドウスタイルへ変更

              SetWindowLong(g_hWindow, GWL_STYLE, WS_OVERLAPPEDWINDOW | WS_VISIBLE);




              // メニューを動的に設定

              if(g_hMenu != NULL)

              {

                     // メニューを動的に設定

                     SetMenu(g_hWindow, g_hMenu);



                     // 後のフルスクリーンモードへの切り替え

                     // のためにメニューハンドルをNULL化

                     g_hMenu = NULL;

              }



              //------------------------------------

              // ウインドウの大きさと位置を設定

              //------------------------------------



              // - - - - - - - - - - - -

              // スクリーンサイズ取得



              // モニターハンドル取得

              HMONITOR hMonitor = MonitorFromWindow(g_hWindow, MONITOR_DEFAULTTONEAREST);



              // スクリーンサイズ取得

              MONITORINFOEX  MonitorInfoEx;

              MonitorInfoEx.cbSize = sizeof(MonitorInfoEx);

              GetMonitorInfo(hMonitor, &MonitorInfoEx);




              // - - - - - - - - - - - -

              // 指定するウインドウの大きさと配置位置



              int Window_Width = g_rectWindow.right - g_rectWindow.left;

              int Window_Height = g_rectWindow.bottom - g_rectWindow.top;

              int Position_X = g_rectWindow.left;

              int Position_Y = g_rectWindow.top;



              // - - - - - - - - - - - -

              // 指定するウインドウの縦幅横幅が異常値の場合のエラー処理



              if(Window_Width < 0)Window_Width = WINDOWMODE_WIDTH;

              if(Window_Height < 0)Window_Height = WINDOWMODE_HEIGHT;



              // - - - - - - - - - - - -

              // 指定するウインドウの配置位置x座標が異常値の場合のエラー処理

              // (モニターからはみ出す配置位置の場合のエラー処理)



              if(g_rectWindow.left < 0)

                     Position_X = 0;

              else if(g_rectWindow.left >= MonitorInfoEx.rcWork.right)

                     Position_X = MonitorInfoEx.rcWork.right - 10;

              else

              {

                     // 異常なしのため未処理

              }



              // - - - - - - - - - - - -

              // 指定するウインドウの配置位置y座標が異常値の場合のエラー処理

              // (モニターからはみ出す配置位置の場合のエラー処理)



              if(g_rectWindow.top       < 0)

                     Position_Y = 0;

              else if(g_rectWindow.top >= MonitorInfoEx.rcWork.bottom)

                     Position_Y = MonitorInfoEx.rcWork.bottom - 10;

              else

              {

                     // 異常なしのため未処理

              }



              // - - - - - - - - - - - -

              // ウインドウの大きさと位置を設定

              //  --- 以前にウィンドウモードであった時のウインド

              //      ウの大きさと位置を復元する。

              SetWindowPos(g_hWindow, HWND_NOTOPMOST,

                            Position_X,

                            Position_Y,

                            Window_Width,

                            Window_Height,

                            SWP_SHOWWINDOW);


       }

       else       // ウィンドウモードからフルスクリーンモード(false)への切り替えの場合

       {

              // フルスクリーンモードでのウィンドウスタイルへ変更

              SetWindowLong(g_hWindow, GWL_STYLE, WS_POPUP | WS_VISIBLE);



              // メニューを動的に取り外す

              if(g_hMenu == NULL)

              {

                     // 後のウインドウモードへの切り替え

                     // のためにメニューハンドルを取得

                     g_hMenu = GetMenu(g_hWindow);



                     // メニューを動的に取り外す

                     SetMenu(g_hWindow, NULL);

              }


       }

}

// o A o A o A o A o A o A o A o

// o l o l o l o l o l o l o l o

//AAAAAAA

//lllllll




//lllllll

//VVVVVVV

// o l o l o l o l o l o l o l o

// o V o V o V o V o V o V o V o

//========================

// Direct3Dに管理されないオブジェクトの初期化

// レンダリング デバイスLPDIRECT3DDEVICE9等のDirect3D系オ

// ブジェクトでの管理化にないオブジェクトの初期化します。

HRESULT InitD3DObject(void)

{

       // スプライトの処理

       if (pSprite)

              pSprite->OnResetDevice();


       return S_OK;

}

// o A o A o A o A o A o A o A o

// o l o l o l o l o l o l o l o

//AAAAAAA

//lllllll




//lllllll

//VVVVVVV

// o l o l o l o l o l o l o l o

// o V o V o V o V o V o V o V o

//========================

// Direct3Dに管理されないオブジェクトの開放処理

// レンダリング デバイスLPDIRECT3DDEVICE9等のDirect3D系オブ

// ジェクトでの管理化にないオブジェクトの開放処理をします。

HRESULT CleanupD3DObject(void)

{

       // スプライトの処理

       if (pSprite)

              pSprite->OnLostDevice();


       return S_OK;

}

// o A o A o A o A o A o A o A o

// o l o l o l o l o l o l o l o

//AAAAAAA

//lllllll




//lllllll

//VVVVVVV

// o l o l o l o l o l o l o l o

// o V o V o V o V o V o V o V o

//========================

// テクスチャオブジェクトの作成

HRESULT CreateTexture()

{

       //「テクスチャオブジェクト」の作成

       if(FAILED(D3DXCreateTextureFromFileEx(pDevice, SpriteFileName, SPRITE_WIDTH,SPRITE_HEIGHT, 0, 0, D3DFMT_UNKNOWN,

                                             D3DPOOL_DEFAULT,D3DX_FILTER_NONE,D3DX_DEFAULT,

                                             0xff000000,NULL,NULL,&pTexture)))

       {

              MessageBox(0,TEXT("テクスチャの作成に失敗しました"),TEXT("error message"),MB_OK);

              return E_FAIL;

       }


       return S_OK;

}

// o A o A o A o A o A o A o A o

// o l o l o l o l o l o l o l o

//AAAAAAA

//lllllll




//lllllll

//VVVVVVV

// o l o l o l o l o l o l o l o

// o V o V o V o V o V o V o V o

//========================

// テクスチャオブジェクトの終了処理

// 作成したLPDIRECT3DTEXTURE9オブジェクト(テクスチャオブジェクト)の開放

VOID CleanupTexture()

{

       // テクスチャオブジェクの開放

       RELEASE( pTexture );

}

// o A o A o A o A o A o A o A o

// o l o l o l o l o l o l o l o

//AAAAAAA

//lllllll









さいごに


本ページの内容説明については、元ページを参照して下さい。