[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のウィンドウ切り替え
-
toyo
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);
}