助けてください。ウィンドウサイズの変更をしたいのですが上手くいきません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ain

助けてください。ウィンドウサイズの変更をしたいのですが上手くいきません

#1

投稿記事 by ain » 10年前

******開発環境*******
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;
		}

           ~~~~他省略~~~~
D3DDeviceのリセットが重要らしいのですが位置としてここであってるのかどうなのか・・・・他にも消失と復旧も重要だとか・・・・色々調べてみましたがよく分からないです・・・・。

ain

Re: 助けてください。ウィンドウサイズの変更をしたいのですが上手くいきません

#2

投稿記事 by ain » 10年前

ちなみに実行結果、起動時のウィンドウモードではこうなります
http://s1.gazo.cc/up/103578.png

これにキ―を押してフルスクリーンモードにすると
画面全体が真っ暗にってフルスクリーンにはなっているようなのですが(根拠はフルスクリーンの場合カーソルを消す設定になっているので) ウィンドウモード時のテクスチャ(URLにのっている学校)が描画されません 

閉鎖

“C言語何でも質問掲示板” へ戻る