[1] 質問文
現在DirectX SDK 2010(Feb)を使ってゲームプログラムを書いているのですが、
Alt+Enterで画面モードを切り替えるというものを作っています。
ですが画面モード自体は切り替えることはできたのですが、
切り替えた後クライアントエリアが真っ白になってしまいます。
いろいろ調べまわった結果、デバイスを作り直すというものを見つけたのですが、
内容がまったくわからない状態です。
[1.1] やりたいこと:画面モードの切り替え
[1.2] ソースコード:添付ファイルを参照
[1.3] 躓いているところ:切り替え後、再描画されず画面が真っ白
[1.4] 知りたいところ:画面モードの切り替え方法、デバイスの再構築
[2] 環境
[2.1] OS : WindowsXP SP2
[2.2] コンパイラ名 : VS2008
[3] その他
・習熟度:高校3年間C言語で簡単なコンソールプログラムを作っていた程度
・DirectX SDK (February 2010)を使用しています
DirectXのウィンドウ切り替え
Re:DirectXのウィンドウ切り替え
まずdirextx.cppのInit3D( )関数内の D3DPRESENT_PARAMETERS d3dpp; をグローバル変数にします また同関数内で d3dpp.BackBufferWidth = 800; d3dpp.BackBufferHeight = 600; のように全画面時の解像度を指定しておきます 画面モード変更時にすること 1. draw.cppのInitialize( )関数で確保した頂点バッファg_pVBを開放 RELEASE(g_pVB); または Close(NULL); 2. d3dpp.Windowedを反転 d3dpp.Windowed = !d3dpp.Windowed; 3. デバイスを変更したウィンドウモードでリセット g_pD3DDev->Reset(&d3dpp); 4. 頂点バッファを作成しなおす Initialize(g_pD3DDev); になります
Re:DirectXのウィンドウ切り替え
すばやい解答ありがとうございます
>>fr様
デバイス再構築をせずに初期化だけでよかったのですね^^;
今後気をつけます><
>>toyo様
なんとか自分の求めていた結果になりました
ありがとうございます!
一応ChangeMode関数を貼っておきます
>>fr様
デバイス再構築をせずに初期化だけでよかったのですね^^;
今後気をつけます><
>>toyo様
なんとか自分の求めていた結果になりました
ありがとうございます!
一応ChangeMode関数を貼っておきます
void ChangeMode(HWND hwnd) { DEVMODE dv; Close(NULL); d3dpp.Windowed = !d3dpp.Windowed; g_bWindowMode = !g_bWindowMode; ShowCursor(g_bWindowMode); if (g_bWindowMode) { ShowWindow(hwnd, SW_HIDE); ChangeDisplaySettings(NULL, 0); SetWindowLongPtr(hwnd, GWL_STYLE, g_dwWindowStyle); SetWindowPos(hwnd, HWND_NOTOPMOST, g_rcWindow.left, g_rcWindow.top, g_rcWindow.right - g_rcWindow.left, g_rcWindow.bottom - g_rcWindow.top, 0); } else { GetWindowRect(hwnd, &g_rcWindow); SetWindowLongPtr(hwnd, GWL_STYLE, WS_POPUP); SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, g_cxClient, g_cyClient, 0); dv.dmSize = sizeof(DEVMODE); dv.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; dv.dmPelsWidth = g_cxClient; dv.dmPelsHeight = g_cyClient; ChangeDisplaySettings(&dv, CDS_FULLSCREEN); } g_pD3DDev->Reset(&d3dpp); Initialize(g_pD3DDev); SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); ShowWindow(hwnd, SW_SHOW); }