Visual C++ 2010 DirectX9
*******目的*******
キ―ボタンを押してウィンドウモードからフルスクリーンモードに変えたいわけですが、うまくいきません。以下長いですがソースになります
~初期の~ウィンドウ設定~
/***********************************************************************************************************
CMain::Init関数
内 容:共通仕様初期化
引 数:HINSTANCE hThisInst:アプリケーションインスタンス
戻り値:BOOL
***********************************************************************************************************/
BOOL CMain::Init( VOID )
{
BOOL ret = TRUE; // 戻り値用
HWND hWnd = NULL; // ウィンドウハンドル
do
{
// ミューテックスの作成
m_Mutex = CreateMutex( NULL, FALSE, TITLE_NAME );
//二重起動のチェック止
if( GetLastError() == ERROR_ALREADY_EXISTS )
{
// すでに起動していたら終了
CCommon::InformationDialog( "多重起動はできません。", "ミューテックスオブジェクトがすでに作成されています", MB_OK );
break;
}
/********** ウィンドウクラスの登録 **********/
WNDCLASSEX wndclassex; // ウィンドウクラス登録用変数
ZeroMemory( &wndclassex, sizeof(WNDCLASSEX) ); // ゼロクリア
wndclassex.cbSize = sizeof(WNDCLASSEX); // サイズ
wndclassex.hInstance = m_AppInst; // インスタンス
wndclassex.style = CS_HREDRAW | CS_VREDRAW; // スタイル(サイズが水平・垂直で変更されたら再描画)
wndclassex.lpszMenuName = TITLE_NAME; // アプリケーション名
wndclassex.lpszClassName = CLASS_NAME; // クラス名
wndclassex.lpfnWndProc = WindowProc; // ウィンドウプロシージャ
wndclassex.hIcon = NULL; // アイコン
wndclassex.hCursor = LoadCursor( NULL, IDC_ARROW ); // カーソル形状
wndclassex.hIconSm = NULL; // スモールアイコン
/******** ウィンドウクラスの登録 ********/
if( !RegisterClassEx( &wndclassex ) )
{
/* エラー */
ret = FALSE;
break;
}
/******** ウィンドウの作成 ********/
INT width = WINDOW_WIDTH + GetSystemMetrics(SM_CXDLGFRAME) * 2; // ウィンドウ横幅
INT height = WINDOW_HEIGHT + GetSystemMetrics(SM_CYDLGFRAME) * 2 + GetSystemMetrics(SM_CYCAPTION); // ウィンドウ縦幅
RECT rect_desktop; // デスクトップサイズ
//WINDOW_MODE
DWORD style = WS_SYSMENU | WS_MINIMIZEBOX;//ウィンドウモード
GetWindowRect( GetDesktopWindow(), (LPRECT)&rect_desktop); // デスクトップサイズの取得
hWnd = CreateWindowEx( WS_EX_APPWINDOW, // ウィンドウスタイル
CLASS_NAME, // ウィンドウクラスで登録したクラス
TITLE_NAME, // ウィンドウ名
style, // ウィンドウのスタイル
(rect_desktop.right - width ) / 2, // 表示座標X
(rect_desktop.bottom - height) / 2, // 表示座標Y
width, // ウィンドウサイズX
height, // ウィンドウサイズY
NULL, // 親ウィンドウまたはオーナーウィンドウのハンドル
NULL, // メニューハンドルまたは子識別子
m_AppInst, // アプリケーションのインスタンス
NULL ); // ウィンドウ作成データ
// ハンドル取得チェック
if( !hWnd )
{
// エラー
CCommon::ErrorDialog( "ウィンドウハンドルの取得に失敗" );
ret = FALSE;
break;
}
ValidateRect( hWnd, 0 ); // WM_PAINTが呼ばれないようにする
WINNLSEnableIME( hWnd, FALSE ); // 日本語入力停止
/***** Direct3Dの初期化 *****/
if( !CDirect3D::Init( hWnd,m_WindowSize ) )
{
// エラー
ret = FALSE;
break;
}
~~~~他いろいろ初期化 省略~~~~
~自作のウィンドウサイズを変更する関数~
/***********************************************************************************************************
WindowSize_Change関数
内 容:ウィンドウサイズの変更
引 数:なし
戻り値:なし
***********************************************************************************************************/
VOID CMain::WindowSize_Change( VOID )
{
HWND hWnd = NULL; // ウィンドウハンドル
DWORD style = 0UL; //
/******** ウィンドウの作成 ********/
INT width = WINDOW_WIDTH + GetSystemMetrics(SM_CXDLGFRAME) * 2; // ウィンドウ横幅
INT height = WINDOW_HEIGHT + GetSystemMetrics(SM_CYDLGFRAME) * 2 + GetSystemMetrics(SM_CYCAPTION); // ウィンドウ縦幅
RECT rect_desktop; // デスクトップサイズ
if( m_WindowSize == TRUE )//ウィンドウモードならば
{
m_WindowSize = FALSE; //フルスクリーンモードフラグを代入
style = WS_SYSMENU | WS_MINIMIZEBOX | WS_POPUP;//フルスクリーンモードに
ShowCursor( FALSE ); // フルスクリーンならマウスカーソルを消す
}
else //フルスクリーンモードならば
{
m_WindowSize = TRUE; //ウィンドウフラグを代入
style = WS_SYSMENU | WS_MINIMIZEBOX; //ウィンドウモードに
ShowCursor( TRUE ); // ウィンドウならマウスカーソルを表示
}
GetWindowRect( GetDesktopWindow(), (LPRECT)&rect_desktop); // デスクトップサイズの取得
hWnd = CreateWindowEx( WS_EX_APPWINDOW, // ウィンドウスタイル
CLASS_NAME, // ウィンドウクラスで登録したクラス
TITLE_NAME, // ウィンドウ名
style, // ウィンドウのスタイル
(rect_desktop.right - width ) / 2, // 表示座標X
(rect_desktop.bottom - height) / 2, // 表示座標Y
width, // ウィンドウサイズX
height, // ウィンドウサイズY
NULL, // 親ウィンドウまたはオーナーウィンドウのハンドル
NULL, // メニューハンドルまたは子識別子
m_AppInst, // アプリケーションのインスタンス
NULL ); // ウィンドウ作成データ
// ハンドル取得チェック
if( !hWnd )
{
// エラー
CCommon::ErrorDialog( "CMain::WindowSize_Changeでのウィンドウハンドルの取得に失敗" );
}
ValidateRect( hWnd, 0 ); // WM_PAINTが呼ばれないようにする
WINNLSEnableIME( hWnd, FALSE ); // 日本語入力停止
/***** Direct3Dの初期化 *****/
if( !CDirect3D::Init( hWnd,m_WindowSize ) )
{
// エラー
CCommon::ErrorDialog( "CMain::WindowSize_Change関数処理の失敗" );
}
}
/***********************************************************************************************************
CDirect3D::Init関数
内 容:初期化
引 数:CONST HWND hWnd
CONST BOOL WindowSize 現在のウィンドウのサイズ TRUEならウィンドウモード FALSEならフルスクリーンモード
戻り値:BOOL
***********************************************************************************************************/
BOOL CDirect3D::Init( CONST HWND hWnd, CONST BOOL WindowSize )
{
BOOL ret = TRUE; // 戻り値用
do
{
if( WindowSize == FALSE)//リセット
{
//present.Windowed = TRUE;
m_pD3DDevice->Reset(&m_PresentWin);
//UpdateWindow(hWnd);
}
// 既にデバイスが取得済みなら処理を抜ける
//if( m_pD3DDevice )
//{
// break;
//}
// Direct3Dの初期化
if( !(m_pD3D = Direct3DCreate9( D3D_SDK_VERSION )) )
{
//エラー
CCommon::ErrorDialog( "Direct3Dインターフェイスの取得に失敗" );
ret = FALSE;
break;
}
// ディスプレイモードの取得
D3DDISPLAYMODE display;
if( FAILED( m_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &display ) ))
{
/* エラー */
CCommon::ErrorDialog( "ディスプレイモードの取得に失敗" );
ret = FALSE;
break;
}
if( WindowSize == FALSE)
{
// パラメータの設定
ZeroMemory( &m_PresentFull, sizeof(D3DPRESENT_PARAMETERS) );
// D3DPRESENT_PARAMETERS共通項目
m_PresentFull.SwapEffect = D3DSWAPEFFECT_DISCARD; // スワップエフェクト
m_PresentFull.EnableAutoDepthStencil = TRUE; // 深度:ステンシルバッファの有無
m_PresentFull.AutoDepthStencilFormat = D3DFMT_D24S8; // 深度:ステンシルバッファのフォーマット)
m_PresentFull.MultiSampleType = D3DMULTISAMPLE_NONE; // アンチエイリアスレベル
//フルスクリーン時の設定
m_PresentFull.Windowed = FALSE; // ウィンドウモードの指定
m_PresentFull.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; // リフレッシュレート
m_PresentFull.BackBufferWidth = display.Width; // バックバッファ横幅
m_PresentFull.BackBufferHeight = display.Height; // ウィンドウの縦幅
m_PresentFull.BackBufferFormat = display.Format; // バックバッファフォーマット
m_PresentFull.BackBufferCount = 1; // バックバッファの数
m_PresentFull.hDeviceWindow = hWnd; // デバイスウィンドウ
m_PresentFull.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; // テアリング防止
// D3Dデバイスの作成
if( FAILED(m_pD3D->CreateDevice( D3DADAPTER_DEFAULT, // アダプタの選択
D3DDEVTYPE_HAL, // ハードウェアモード
hWnd, // 描画するウィンドウのハンドル
D3DCREATE_HARDWARE_VERTEXPROCESSING, // ハードによる頂点処理を指定
&m_PresentFull, // 初期化パラメータのポインタ
&m_pD3DDevice ))) // 取得したインタフェースの格納先ポインタ
{
// 失敗したらSOFTWAREで作成を試みる
if( FAILED(m_pD3D->CreateDevice( D3DADAPTER_DEFAULT, // アダプタの選択
D3DDEVTYPE_HAL, // ハードウェアモード
hWnd, // 描画するウィンドウのハンドル
D3DCREATE_SOFTWARE_VERTEXPROCESSING, // ソフトによる頂点処理を指定
&m_PresentFull, // 初期化パラメータのポインタ
&m_pD3DDevice ))) // 取得したインタフェースの格納先ポインタ
{
//エラー
CCommon::ErrorDialog( "D3Dデバイスの作成に失敗しました。" );
ret = FALSE;
break;
}
}
}
else
{
// パラメータの設定
ZeroMemory( &m_PresentWin, sizeof(D3DPRESENT_PARAMETERS) );
// D3DPRESENT_PARAMETERS共通項目
m_PresentWin.SwapEffect = D3DSWAPEFFECT_DISCARD; // スワップエフェクト
m_PresentWin.EnableAutoDepthStencil = TRUE; // 深度:ステンシルバッファの有無
m_PresentWin.AutoDepthStencilFormat = D3DFMT_D24S8; // 深度:ステンシルバッファのフォーマット)
m_PresentWin.MultiSampleType = D3DMULTISAMPLE_NONE; // アンチエイリアスレベル
// ウィンドウモードの設定
m_PresentWin.Windowed = TRUE; // ウィンドウモードの指定
m_PresentWin.BackBufferFormat = D3DFMT_UNKNOWN; // バックバッファのフォーマット
m_PresentWin.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; // テアリング防止
if( FAILED(m_pD3D->CreateDevice( D3DADAPTER_DEFAULT, // アダプタの選択
D3DDEVTYPE_HAL, // ハードウェアモード
hWnd, // 描画するウィンドウのハンドル
D3DCREATE_HARDWARE_VERTEXPROCESSING, // ハードによる頂点処理を指定
&m_PresentWin, // 初期化パラメータのポインタ
&m_pD3DDevice ))) // 取得したインタフェースの格納先ポインタ
{
// 失敗したらSOFTWAREで作成を試みる
if( FAILED(m_pD3D->CreateDevice( D3DADAPTER_DEFAULT, // アダプタの選択
D3DDEVTYPE_HAL, // ハードウェアモード
hWnd, // 描画するウィンドウのハンドル
D3DCREATE_SOFTWARE_VERTEXPROCESSING, // ソフトによる頂点処理を指定
&m_PresentWin, // 初期化パラメータのポインタ
&m_pD3DDevice ))) // 取得したインタフェースの格納先ポインタ
{
//エラー
CCommon::ErrorDialog( "D3Dデバイスの作成に失敗しました。" );
ret = FALSE;
break;
}
}
}
/*** スプライトインターフェイスの作成 ***/
if( FAILED( D3DXCreateSprite( m_pD3DDevice, &m_pSprite ) ) )
{
// エラー
ret = FALSE;
break;
}
~~~~他省略~~~~